従来のMySQLレプリケーションではマスタ1台から複数台のスレーブへデータを同期するという1:Nの構成しか出来ませんでしたが、MySQL5.7.6〜実装されたマルチソースレプリケーションの昨日を使うと複数台のマスターから1台以上のスレーブへデータを同期できる構成が可能になります。
マルチソースレプリケーションを試す
今回は以下のような2台の master から1台の slave へのレプリケーションしてみます。
┌----------┐ ┌----------┐ | master01 | | master02 | | [DB01] | | [BD02] | └----------┘ └----------┘ | | | | └-------+--------┘ | | ┌----------┐ | slave01 | | [DB01] | | [DB02] | └----------┘
環境
OS | Ubuntu 16.04 LTS |
---|---|
MySQL | 5.7.17 (Ubuntu オフィシャルパッケージ) |
構築手順
マスター1側の準備
設定ファイルを確認します。 最低限以下のような設定になっていなければ設定して反映します。
# サーバIDはほかのホストと被らないように server-id = 10001 # binaly-logの出力 log_bin = /var/log/mysql/mysql-bin.log ### 他のサーバホストから接続できるように bind-address をコメントアウト #bind-address = 127.0.0.1
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY '********';
マスターからダンプ取得します。 オプションは環境に応じて必要なものを付け加えてください。
$ mysqldump -u root -p --single-transaction --master-data=2 [DB名] [テーブル名] | gzip > db1.dump.sql.gz
マスター2側の準備
設定ファイルを確認します。 最低限以下のような設定になっていなければ設定して反映します。
# サーバIDはほかのホストと被らないように server-id = 10002 # binaly-logの出力 log_bin = /var/log/mysql/mysql-bin.log ### 他のサーバホストから接続できるように bind-address をコメントアウト #bind-address = 127.0.0.1
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY '********';
マスターからダンプ取得します。 オプションは環境に応じて必要なものを付け加えてください。
$ mysqldump -u root -p --single-transaction --master-data=2 [DB名] [テーブル名] | gzip > db2.dump.sql.gz
スレーブ側の準備
設定ファイルを編集します。
### バイナリログの設定 # サーバIDはほかのホストと被らないように server-id = 20001 log_bin = /var/log/mysql/mysql-bin.log ### レプリケーション設定 # クラッシュセーフのための設定 master_info_repository=TABLE relay_log_info_repository=TABLE relay_log_recovery=ON relay_log_purge=ON ### 必要であれば以下を設定 ### # レプリケーションから除外するDB replicate-ignore-db=mysql # レプリケーションするDB replicate-do-db=hogedb # レプリケーションから除外するテーブル replicate-do-table = hogedb.hogetable
レプリケーションの開始
各マスターのデータをスレーブへ持ってきて、スレーブへ各マスターのデータを投入します。
$ zcat db1.dump.sql.gz | mysql -u root -p [DB名1]
$ zcat db2.dump.sql.gz | mysql -u root -p [DB名2]
マスター1とのレプリケーションを設定を行います。 まず、ダンプデータ取得時点のバイナリログポジションを確認しておきます。
$ zcat db1.dump.sql.gz | grep -i "CHANGE MASTER TO"
マスター1との接続設定を行います。
上記で確認したダンプ取得時点のバイナリログファイル名を MASTER_LOG_FILE
へ、そのポジションNoを MASTER_LOG_POS
へ指定します。
mysql> CHANGE MASTER TO MASTER_HOST="192.168.aaa.bbb", MASTER_PORT=3306, MASTER_LOG_FILE="ダンプ取得時点のバイナリログファイル名", MASTER_LOG_POS=ダンプ取得時点のポジションNo, MASTER_USER="repl", MASTER_PASSWORD="salvepass" FOR CHANNEL "master1";
スレーブからマスター1へレプリケーション開始します。
mysql> start slave for channel "master1";
続いてマスター2のレプリケーション設定を行います。 ダンプデータ取得時点のバイナリログポジションを確認します。
$ zcat db2.dump.sql.gz | grep -i "CHANGE MASTER TO"
マスター2への接続設定を行います。
マスター1の時と同様に、上記で確認したダンプ取得時点のバイナリログファイル名を MASTER_LOG_FILE
へ、そのポジションNoを MASTER_LOG_POS
へ指定します。
mysql> CHANGE MASTER TO MASTER_HOST="192.168.xxx.yyy", MASTER_PORT=3306, MASTER_LOG_FILE="ダンプ取得時点のバイナリログファイル名", MASTER_LOG_POS=ダンプ取得時点のポジションNo, MASTER_USER="repl", MASTER_PASSWORD="salvepass" FOR CHANNEL "master2";
スレーブからマスター1へレプリケーション開始します。
mysql> start slave for channel "master2";
レプリケーションを確認します。
mysql> SHOW SLAVE STATUS FOR CHANNEL "master1"\G
mysql> SHOW SLAVE STATUS FOR CHANNEL "master2"\G
その他の基本オペレーション
その他停止、再開、リセットなどの基本的なオペレーション手順は以下です。
for channel
句を指定することで特定のマスターとのレプリケーションに対してオペレーションできます。
レプリケーションを停止する場合は以下のようにします。
mysql> stop slave for channel "master1";
レプリケーションを再開するには以下のようにします。
mysql> start slave for channel "master1";
レプリケーションをリセットするには以下のようにします。
mysql> reset slave all for channel "master1";
まとめ
MySQL5.7.6~で実装された新機能マルチソースレプリケーションの設定手順について書きました。 マルチソースレプリケーションを使うことで、分析のために複数のDBのデータを集約する、しャーディングされているデータの統合や他にも何か活用方法がありそうなので、いろいろ試してみたいと思います。