最小ダウンタイムで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