LoginSignup
7
8

More than 5 years have passed since last update.

MySQLでchained replicationを構成する

Last updated at Posted at 2017-05-25

はじめに

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

my.cnf
[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

my.cnf
[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

my.cnf
[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

master
$ 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の設定は完了しているものとする
ダンプデータのログファイル名とポジション情報を確認

slave1
$ zcat /tmp/master.gz | head -n 25

CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.XXXXXX', MASTER_LOG_POS=XXX;

masterのダンプデータをインポート

slave1
$ zcat /tmp/master.gz | mysql -uroot -p

レプリケーション設定

slave1
$ 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;

レプリケーション開始

slave1
mysql> start slave;

スレーブの状態確認

slave1
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

slave1
$ 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の設定は完了しているものとする
ダンプデータのログファイル名とポジション情報を確認

slave2
$ zcat /tmp/slave1.gz | head -n 25

CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.XXXXXX', MASTER_LOG_POS=XXX;

slave1のダンプデータをインポート

slave2
$ zcat /tmp/slave1.gz | mysql -uroot -p

レプリケーション設定

slave2
$ 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;

レプリケーション開始

slave2
mysql> start slave;

スレーブの状態確認

slave2
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
7
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8