昨年末からMySQLのレプリケーション設定に取り組んでいてなかなかうまく行かず、試行錯誤を繰り返す日々が続いていましたが、先人の知恵を拝借しようやく解決することができました。
「とりあえずテスト環境で動くようになった」というレベルなのでどういった運用が理想的なのか今後掘り下げる必要がありそうです。
何にはともあれ、忘れないうちに以下自分用備忘録。このエントリーを参考にされる方は自己責任でお願いします。
各サーバーのIPアドレス
マスターのIP:192.168.1.131
スレーブのIP:192.168.1.135
①【マスターの設定】
1-1.my.cnfファイルの設定
vi /etc/my.cnf
[mysqld]
server-id=1001 ←追記
log-bin ←追記
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
log-bin=mysql-bin
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
default-character-set = utf8
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[mysql]
default-character-set = utf8
1-2.3306ポートの開放(私はここれを忘れてはまりました。)
設定ファイルを開く
vi /etc/sysconfig/iptables
下記の一文を追記して保存
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
iptables再起動
/etc/rc.d/init.d/iptables restar
1-3.スレーブから接続するユーザーslave102の作成
mysql> GRANT REPLICATION SLAVE ON *.* TO slave102@"192.168.0.135" IDENTIFIED BY "secret";
②【スレーブの設定】
2-1.my.cnfファイルの設定
vi /etc/my.cnf
[mysqld]
server-id=1002
master_host=192.168.1.131
master_user="slave102"
master_password="secret"
master_port=3306
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
default-character-set = utf8
[mysql]
default-character-set = utf8
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
2-2.3306ポートの開放
スレーブもポートを開けておく必要があるようです。
2-3.レプリケーションを実行するユーザーslave102の作成
mysql> GRANT ALL ON *.* TO slave102@"192.168.1.135" IDENTIFIED BY "secret";
③【データのスナップショット作成】※マスターにて実行
3-1.MySQLにログインして下記のコマンドを実行
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;
+------------------------+------------+---------------------+--------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------------+------------+---------------------+--------------------------+
| mysql-bin.000001 | 98 | | |
+------------------------+------------+---------------------+--------------------------+
1 row in set (0.00 sec)
3-2.FileとPositionの値を控えておくこと
3-3.一度MySQLから抜けて下記のコマンドを実行。
# mysqldump --all-databases --lock-all-tables -p > dbdump.db
3-4.再度MySQLへログインし下記のコマンドを実行
mysql > UNLOCK TABLES;
3-5.dbdump.dbをスレーブへ移す。
④【スレーブの設定】
4-1.手順3-5でマスターから移したdbdump.dbファイルを下記のコマンドでリストアする。
# mysql -p < dbdump.db
4-2.MySQLへログイン後、下記コマンドでスレーブを停止させる
mysql> STOP SLAVE;
4-2.CHANGE MASTER コマンドを実行
mysql> CHANGE MASTER TO MASTER_HOST='192.168.1.131', MASTER_USER='slave102', MASTER_PASSWORD='secret', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=98;
※MASTER_LOG_FILE・MASTER_LOG_POSの値は手順3-1の値を入力すること
4-3.下記コマンドでスレーブを起動させる。
mysql> START SLAVE;
⑤【レプリケーションできているかどうか確認】
5-1.マスターのmysqlにログインし下記コマンドを実行
mysql> SHOW PROCESSLIST\G
@結果
*************************** 1. row ***************************
Id: 20
User: slave102
Host: 192.168.1.135:45188
db: NULL
Command: Binlog Dump
Time: 2134
State: Has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
どうやらスレーブに接続できているようだ。
5-2.マスターのmysqlにログインし下記コマンドを実行
mysql> SHOW PROCESSLIST\G
@結果
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.131
Master_User: slave102
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 240
Relay_Log_File: mysqld-relay-bin.000004
Relay_Log_Pos: 235
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 240
Relay_Log_Space: 235
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Slave_IO_Running:・Slave_SQL_Running: の値がともに「Yes」になっているので、レプリケーションは動作しているようだ。
今回も時間はかかりましたが、何とかレプリケーションに対応することができましたとさ。爽快爽快・・・。
~参照サイト~
GURO_CHANの日記
MySQLレプリケーション
MySQLレプリケーションのセットアップ手順
現場指向のレプリケーション詳説
KAWANO's PukiWiki - MySQLでのレプリケーションの設定
とみぞーノート
aniメモ