さあさあ、今度はレプリケーションだ。
5.7の目玉と言えば、やはりマルチソースレプリケーションでしょう。
ほか、スレーブにチャネルという概念が導入され、マルチスレッドスレーブが実現できるそうですね。
こいつらを早速試してみようと思います。
マニュアルはこちら。
まず、最初にマルチソースレプリケーションの仕組みを簡単に。
通常のレプリケーションは下図の流れです。
これに対して、マルチソースレプリケーションは下図の流れです。
マルチソースレプリケーションでは、
要は複数のマスターからのクエリを1つのスレーブで統合保持できます。
言い方を換えれば、
1つのスレーブが複数のマスターを持つことができます。
仕組みとしては、マスターのbinlog_dump threadから送られてきたクエリを受け取るスレーブでは、
従来であれば単一のSlave I/O Threadが受けていたものが、
マスターに対応した複数のSlave I/O Threadが受けるようになります。
マスターに対応したSlave I/O ThreadとSlave SQL Threadのペアは、チャネルという概念でまとめて管理されています。
さて、説明はこんなところで、早速実験に移ろうと思います。
今回のレプリケーション構成は下記の通り。
マスター1:192.168.2.221
マスター2:192.168.2.222
スレーブ:192.168.2.223
まず、マスター2台、スレーブ1台にレプリケーション用ユーザを作ります。
これは今までと同じ。
当然スレーブにはレプリケーションユーザは要らないのですが、
状態を同じにしたいので。
mysql> grant replication slave on *.* to 'repl'@'192.168.2.%' identified by 'repl'; Query OK, 0 rows affected, 1 warning (0.00 sec)
で、おそらくスレーブにこのクエリが2つ流れ込むとよろしくないので、
ここでマスター、スレーブにreset masterを打っておきます。
mysql> reset master; Query OK, 0 rows affected (0.01 sec)
そして、各サーバでGTIDレプリケーションのために下記設定を追加します。
gtid_mode=ON log_slave_updates enforce_gtid_consistency log_bin server_id=1
無論、server_idはサーバごとに一意にします。
※log_slave_updatesはスレーブでは必要なくなったとかいう噂も聞いたが、
まだ未確認です。
さらに、マルチソースレプリケーションを実施するために下記を追加します。
master-info-repository=TABLE relay-log-info-repository=TABLE
これでマスター2台、スレーブ1台の準備が整ったので、
レプリケーションの設定を入れましょう。
mysql> change master to master_host='192.168.2.221', master_user='repl', master_password='repl', master_auto_position=1 for channel 'master-1'; Query OK, 0 rows affected, 2 warnings (0.05 sec)
これ、「for channel~」の前にはカンマいれちゃいけないんですね。
わかりづらいわ!
同じようなクエリをmaster-2に対しても実行します。
そしてstart slave。
mysql> start slave for channel 'master-1'; Query OK, 0 rows affected (0.00 sec) mysql> start slave for channel 'master-2'; Query OK, 0 rows affected (0.01 sec)
状況を確認しましょう。
mysql> show slave status for channel 'master-1'\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.2.221 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: cent7-mysql57-1-bin.000001 Read_Master_Log_Pos: 154 Relay_Log_File: cent7-mysql57-3-relay-bin-master@002d1.000002 Relay_Log_Pos: 387 Relay_Master_Log_File: cent7-mysql57-1-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: ~~~~~~~~~~~~~~(中略)~~~~~~~~~~~~~~ Channel_Name: master-1 1 row in set (0.00 sec)
ちゃんとSlave_IO_Running、Slave_SQL_RunningがYesになってますね。
さらに、最後にChannel_Nameが出力されていますね。
さあ、クエリがちゃんと伝播するかテストしましょう。
マスター1で mysql> create database master1; Query OK, 1 row affected (0.00 sec) マスター2で mysql> create database master2; Query OK, 1 row affected (0.01 sec) スレーブで mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | master1 | | master2 | | mysql | | performance_schema | | sys | +--------------------+ 6 rows in set (0.03 sec)
おお、確かに両マスターからのクエリが流れ込んでいる!
これがマルチソースレプリケーションってやつか!
というわけで、とりあえず使える状態にはなったので、
これで今回は満足。
取り急ぎ、他にもまだ試してみたい機能・モジュールはあるので、
そちらをやります。
マルチソースレプリケーションの深堀りはもうちょっと後になるとおもいますのであしからず。
では、今回はこれで。