#はじめに
MySQLでchained replicationを構成してみます。
chained replicationとは、
master -> slave1 -> slave2
のような構成です。
このとき、slave1はslave2にとってのmasterでもあります。
#前提
- MySQL5.6以降
- レプリケーション用ユーザ:repl
#必要な設定
通常のレプリケーションに必要な設定(バイナリログ書き出し)に加えて、log_slave_updates
が必要になります。
これは、デフォルトではslaveがmasterから受け取った更新情報をバイナリログに書き出さないためです。
https://dev.mysql.com/doc/refman/5.6/ja/replication-options-slave.html
##master
[mysqld]
server-id=1
expire_logs_days = 30 #任意です
binlog_format = mixed
log-bin = mysql-bin
sync_binlog = 1 #任意です
log_slave_updates #masterには不要ですが、将来的にslaveになれるよう、有効にしておきます
read_only = 0
##slave1
[mysqld]
server-id=2
expire_logs_days = 30 #任意です
binlog_format = mixed
log-bin = mysql-bin
sync_binlog = 1 #任意です
log_slave_updates
read_only = 1 #安全のため
##slave2
[mysqld]
server-id=3
expire_logs_days = 30 #任意です
binlog_format = mixed
log-bin = mysql-bin
sync_binlog = 1 #任意です
log_slave_updates
read_only = 1 #安全のため
#構築手順
##master
/etc/my.cnfの設定は完了しているものとする
レプリケーション構築のため、dump
$ mysqldump -uroot -p \
--all-databases \
--opt \
--flush-logs \
--add-drop-table \
--single-transaction \
--master-data=2 \
| gzip > /tmp/master.gz
上記ファイルをslave1に転送する
##slave1
/etc/my.cnfの設定は完了しているものとする
ダンプデータのログファイル名とポジション情報を確認
$ zcat /tmp/master.gz | head -n 25
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.XXXXXX', MASTER_LOG_POS=XXX;
masterのダンプデータをインポート
$ zcat /tmp/master.gz | mysql -uroot -p
レプリケーション設定
$ mysql -uroot -p
mysql>
change master to
master_host='MASTER_IP',
master_user='repl',
master_password='PASSWORD',
master_log_file='mysql-bin.XXXXXX',
master_log_pos=XXX;
レプリケーション開始
mysql> start slave;
スレーブの状態確認
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
...snip...
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
レプリケーション構築のため、dump
$ mysqldump -uroot -p \
--all-databases \
--opt \
--flush-logs \
--add-drop-table \
--single-transaction \
--master-data=2 \
| gzip > /tmp/slave1.gz
上記ファイルをslave2に転送する
##slave2
/etc/my.cnfの設定は完了しているものとする
ダンプデータのログファイル名とポジション情報を確認
$ zcat /tmp/slave1.gz | head -n 25
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.XXXXXX', MASTER_LOG_POS=XXX;
slave1のダンプデータをインポート
$ zcat /tmp/slave1.gz | mysql -uroot -p
レプリケーション設定
$ mysql -uroot -p
mysql>
change master to
master_host='SLAVE1_IP',
master_user='repl',
master_password='PASSWORD',
master_log_file='mysql-bin.XXXXXX',
master_log_pos=XXX;
レプリケーション開始
mysql> start slave;
スレーブの状態確認
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
...snip...
Slave_IO_Running: Yes
Slave_SQL_Running: Yes