たけまるの日記

たけまるの日記です。web関係の技術ネタが多いですが、好きなことを適当に書いています。

最小ダウンタイムでMySQLレプリケーションを構築する

既に稼働しているMySQLレプリケーションを構築する場合の手順です。 結論から言えば、高々1回のマスターDB再起動でレプリケーションの構築が可能で、通常であればダウンタイム1分以内です。 作業中にマスターDBに長時間ロックがかかることもありません。

対象はMySQL5.6ですが、MySQL5系なら同様の手順でいけると思います。 MySQL5.6からはGTIDレプリケーションもサポートされましたが、今回は諸事情により見送ることにしました。

以下手順です。

マスターのbinlog出力を有効にする

master# vi /usr/my.cnf
[mysqld]
log-bin=mysql-bin
server-id=1

master# service mysql restart

唯一のダウンタイムがこれですが、既にバイナリログが有効になっている場合はこの手順は不要です。

レプリケーション用のユーザーを作成

(master)mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'slaveip' IDENTIFIED BY 'slavepass';

マスターのdump取得

master# mysqldump --all-databases --master-data --single-transaction > dbdump.sql

「--master-data」がキモですね。dumpと同時に現在のバイナリログの位置を取得できます。 また、「--single-transaction」することにより、テーブル間の整合性がとれた状態のダンプを、ロックなしに取得できます。(これをつけないダンプ中は書込ロックされます)

スレーブ側の設定

slave# vi /usr/my.cnf
[mysqld]
log-bin=mysql-bin
server-id=10

slave# service mysql restart

スレーブ側をレストア

slave# mysql < dbdump.sql

レプリケーション開始

$ grep -i "CHANGE MASTER TO" dbdump.sql
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=12345678;

(slave)mysql> CHANGE MASTER TO
  MASTER_HOST='masterip',
  MASTER_USER='repl',
  MASTER_PASSWORD='slavepass',
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=12345678;
(slave)mysql> START SLAVE;

確認

(master)mysql> show master status;
(slave)mysql> show slave status;

参考

http://mysql.manual.php.to/replication.html#replication-howto http://qiita.com/hit/items/7747394e8f2f6a515535 http://tmtms.hatenablog.com/entry/20110713/mysqldump