dshimizu/blog

アルファ版

MySQL5.7のマルチソースレプリケーション構築手順メモ

従来の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ユーザ作成します。

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ユーザ作成します。

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のデータを集約する、しャーディングされているデータの統合や他にも何か活用方法がありそうなので、いろいろ試してみたいと思います。

参考