MySQL自体のレプリケーションは結構歴史が古い。3系の頃からあったはず。
その分、結構参考になるサイトはあって、いくつか見比べて実際に行った方法。
・マスター側の設定
my.confのReplication Master Server部の内容を確認。無い場合は追加。
log-bin=mysql-bin
server-id=1 (ここは他のDBサーバーに対してユニークな値を設定)
mysqlの再起動後、レプリケーション用のユーザーを追加。
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@"192.168.0.%" IDENTIFIED BY 'hogehoge';
※全てのDBに対して、192.168.0.のネットワークマシンから接続を許可する。
ネットワーク部と、パスワードは適したものに変更すること。
現在のバイナリログ名とオフセットを調べる。
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000018 | 158995 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
この値を、スレーブ系に設定するので、メモ。
・スレーブ側の設定
my.confのReplication Master Server部を無効にし、Replication Slaveの項目の以下を有効にする。
server-id=2
skip-slave-start (これは追加。自動的にスレーブがスタートするのを抑制)
replicate-ignore-db=test (レプリケーション除外DB)
replicate-ignore-db=system_db
※設定例によっては、master-hostやmaster-userなどを書いている場合もある。しかしいったんスレーブが設定されると、これらの情報は/var/lib/mysql/master.infoに保存されてmy.cnfは無視されるので、my.cnfに書く必要はない。
マスター側とDBの内容を同じ状態にした後、スレーブのDBをマスターに接続する。
マスターDBのIP、レプリケーション用のユーザー、先ほど確認したバイナリログ名とオフセットを設定する。
※既にスレーブが起動している場合には、stop slave;を実行。
mysql>
CHANGE MASTER TO
MASTER_HOST='192.168.0.41',
MASTER_USER='repl',
MASTER_PASSWORD='hogehoge',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000018',
MASTER_LOG_POS=158995;
スレーブを開始する。
mysql> start slave;
ここまでの作業でレプリケーションはできている。
後は確認作業。
マスターの状態を表示する。
mysql> show master status\G
*************************** 1. row ***************************
File: mysql-bin.000002
Position: 186113
Binlog_Do_DB:
Binlog_Ignore_DB:
スレーブの状態を表示する。Slave_IO_Running:とSlave_SQL_Running:がyesだとslaveとして動いている。
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: db1
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 186113
Relay_Log_File: db2-relay-bin.000004
Relay_Log_Pos: 186250
Relay_Master_Log_File: mysql-bin.000002
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: 186113
Relay_Log_Space: 186250
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
マスターでプロセスを見てみる。Binlog Dumpがあればよい。
mysql> show processlist\G
*************************** 1. row ***************************
Id: 22
User: root
Host: localhost
db: mt
Command: Query
Time: 0
State: NULL
Info: SHOW PROCESSLIST
*************************** 2. row ***************************
Id: 41
User: repl
Host: db2.grandarbre.net:56174
db: NULL
Command: Binlog Dump
Time: 323
State: Has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
スレーブでもプロセスを見ると、2つのConnectがある。
mysql> show processlist\G
*************************** 1. row ***************************
Id: 2
User: root
Host: localhost
db: mt
Command: Query
Time: 0
State: NULL
Info: show processlist
*************************** 2. row ***************************
Id: 3
User: system user
Host:
db: NULL
Command: Connect
Time: 191
State: Waiting for master to send event
Info: NULL
*************************** 3. row ***************************
Id: 4
User: system user
Host:
db: NULL
Command: Connect
Time: 11
State: Has read all relay log; waiting for the slave I/O thread to update it
Info: NULL
後は実際にマスターDBを更新してみて、スレーブDBに反映されているか確認する。
以上!!