October 2, 2013 By Miguel Angel Nieto
最近Oracleは、この記事を書いている時点でバージョン5.7.2の最新MySQL開発版に対して、数々の新機能をアナウンスした。これらの多くは、新しいリリースが非常に素晴らしいものになるであろうことを予感させるパフォーマンスやレプリケーション関係の機能だ。
この記事で、新しいマルチソースレプリケーションの機能をどう動かすかの簡単な手順と、テストのためにどう設定すべきかを説明しようと思う。これは開発版なので、すぐに本番環境で使えるものではないことをあらかじめ指摘しておこう。いずれにしても、開発環境において、新しい機能を試してみたい人や、アプリケーションとどう組み合わせて動くのか見たい人のための記事だ。
マルチソースレプリケーションとは?
まず、マルチマスタとマルチソースが同じではないということをはっきりさせる必要がある。マルチマスタレプリケーションとは一般的に、どのサーバに書き込んでもデータが全てのノードにレプリケーションされるような、循環レプリケーションのことだ。
マルチソースはこれとは違う。MySQLのレプリケーションには、この新しいバージョンで改善されるまで、1つのスレーブは1つのマスタしか持てないという制約があった。これは、レプリケーション環境をデザインする際の制限事項だった。これを何とか動かすようにする「裏技」もあったが、今回これに対する公式な方法ができたということだ。つまり、マルチソースとは1台のスレーブが2台以上のマスタを持つ構成のこと。つまり、以下のようなレプリケーション環境だ。
これにより、過去には不可能だったレプリケーションの階層構造を作ることが可能になった。例えば、自分のオフィスにあるスレーブに、世界中に散らばる各オフィスのサーバからデータをレプリケーションしてくることができる。
どう動いているのか
ここで、コミュニケーションチャネルというコンセプトがある。各コミュニケーションチャネルは、バイナリログイベントを受け取るためにスレーブからマスタに張るコネクションだ。これはつまり、IO_THREADを書くコミュニケーションチャネルごとに持つことだ。それぞれのマスタに対して、チャネルの名前を指定する「FOR CHANNEL」引数をつけて「CHANGE MASTER」コマンドを実行する必要がある。
CHANGE MASTER MASTER_HOST='something', MASTER_USER=... FOR CHANNEL="name_of_channel";
とても簡単だ。ひとつだけ前提条件がある。スレーブは、MySQL 5.6のクラッシュセーフ機能が有効な状態に設定されていなければならないということだ。これはつまり、master.infoやrelay-log.infoの情報がテーブル上にあるということも意味している。それでは設定してみよう。
さあ例を見せてくれ!
まずは試験版のMySQLをここからダウンロードしてくる必要がある。
2台のマスタと1台のスレーブからなるサンドボックス環境を用意しよう。server_idやバイナリログ、レプリケーションユーザの設定についてはここでは詳しく書かない。それらは既に設定してあるものと仮定する。
まず、スレーブをクラッシュセーフにしなければならない。
master_info_repository=TABLE;
relay_log_info_repository=TABLE;
スレーブを再起動したら、「master1」と「master2」というチャネルを作成できるようになる。
slave > change master to master_host="127.0.0.1", master_port=12047, master_user="msandbox",master_password="msandbox" for channel="master1";
slave > change master to master_host="127.0.0.1", master_port=12048, master_user="msandbox",master_password="msandbox" for channel="master2";
スレーブのプロセスを開始するには、どのチャネルを使うかを指定する必要がある。
slave > start slave for channel="master1";
slave > start slave for channel="master2";
ここで、スレーブのステータスを見てみよう。
slave > show slave status\G
Empty set (0.00 sec)
おっと、空っぽだ。どのチャネルの情報を見るのか指定しなければならないのだ。
slave > SHOW SLAVE STATUS FOR CHANNEL="master1"\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 127.0.0.1
Master_User: msandbox
Master_Port: 12047
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 232
Relay_Log_File: squeeze-relay-bin-master1.000003
Relay_Log_Pos: 395
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
[...]
さらに、IO_THREADとSQL_THREADが動いているかも確認してみよう。
slave > SHOW PROCESSLIST;
+----+-------------+-----------------------------------------------------------------------------+
| Id | User | State |
+----+-------------+-----------------------------------------------------------------------------+
| 2 | system user | Waiting for master to send event |
| 3 | system user | Slave has read all relay log; waiting for the slave I/O thread to update it |
| 4 | system user | Waiting for master to send event |
| 5 | system user | Slave has read all relay log; waiting for the slave I/O thread to update it |
+----+-------------+-----------------------------------------------------------------------------+
さあ試してみよう。
master1 > create database master1;
master2 > create database master2;
slave > show databases like 'master%';
+--------------------+
| Database (master%) |
+--------------------+
| master1 |
| master2 |
+--------------------+
動いた。簡単だ!
結論
新しいマルチソースレプリケーションの機能によって、今までは複雑な「裏技」なしには実現できなかった新しいレプリケーション環境を構築できるようになった。もちろん、この新しいアーキテクチャを考慮してアプリケーションのデザインや開発をする必要があることは考慮すべきだ。マルチマスタ環境と同じく、マルチソース環境でも、データがごちゃごちゃにならないように特に注意しなければならない。
MySQLのレプリケーション機能は、リリースのたびに設定やパフォーマンス、デザインの可能性をどんどん広げていっている。そしてこれら全ての機能は一緒に使うことができる。あなたのレプリケーション環境は、最近追加された新しい機能(古い機能も)一緒に使うことで、さらに良くすることができるだろう。例えば、GTIDや、スキーマ単位のマルチスレッドスレーブ、データベース間のマルチスレッドスレーブを有効にすることもできる。