2014年1月4日土曜日

MySQL5.6で準同期レプリケーションを試す

MySQLの準同期レプリケーションを試す。基本は公式のマニュアル通り進める。
環境は以下の通り。
  • CentOS release 6.2
  • MySQL-server-5.6.14
MySQL準同期レプリケーションを構築する前に、まず非同期レプリケーションを作り、その後準同期レプリケーションを作る 。

作業の前提として、MySQLのインストールが終わり、バイナリログが出力できているものとする。

まずは非同期レプリケーションの構築

マスタ側での作業

レプリケーション用のユーザを作る
GRANT REPLICATION SLAVE ON *.* TO repl@'(スレーブのIP)' IDENTIFIED BY 'repl';
マスタのバイナリログの場所を控える
SHOW MASTER STATUS;
+----------------+-----------+--------------+------------------+-------------------+
| File           | Position  | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------+-----------+--------------+------------------+-------------------+
| bin-log.000004 | 450002352 |              |                  |                   |
+----------------+-----------+--------------+------------------+-------------------+
出力結果の FileとPositionを控える

スレーブ側での作業

マスタの指定
CHANGE MASTER TO  
MASTER_HOST = '(マスタのIP)' , 
MASTER_USER = 'repl' , 
MASTER_PASSWORD = 'repl' ,
MASTER_PORT = 3306, 
MASTER_LOG_FILE = '(バイナリログのファイル名)' ,
MASTER_LOG_POS  = (バイナリログのポジション);
スレーブの開始
START SLAVE;
スレーブの状態確認
SHOW SLAVE STATUS\G;
→slave_IO_State: Waiting for master to send event ならOK

次に準同期レプリケーションの構築

マスタ側での作業

プラグインのインストール
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
準同期レプリケーションの有効化
SET GLOBAL rpl_semi_sync_master_enabled = 1;
必要に応じて、準同期レプリケーションのタイムアウト(ミリ秒)を設定。タイムアウトが発生すると、動作が非同期になり、スレーブのackを待たなくなる。
SET GLOBAL rpl_semi_sync_master_timeout = 20000;
設定の確認
SHOW GLOBAL VARIABLES LIKE "rpl%";
+------------------------------------+----------+
| Variable_name                      | Value    |
+------------------------------------+----------+
| rpl_semi_sync_master_enabled       | ON       | →ONならOK
| rpl_semi_sync_master_timeout       | 20000    |
| rpl_semi_sync_master_trace_level   | 32       |
| rpl_semi_sync_master_wait_no_slave | ON       |
| rpl_stop_slave_timeout             | 31536000 |
+------------------------------------+----------+

スレーブ側での作業

プラグインのインストール
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
準同期レプリケーションの有効化
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
設定値の確認
SHOW GLOBAL VARIABLES LIKE "rpl%";
+---------------------------------+----------+
| Variable_name                   | Value    |
+---------------------------------+----------+
| rpl_semi_sync_slave_enabled     | ON       |→ONならOK
| rpl_semi_sync_slave_trace_level | 32       |
| rpl_stop_slave_timeout          | 31536000 |
+---------------------------------+----------+
状態の確認
SHOW STATUS LIKE 'Rpl_semi_sync%';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | OFF   |
+----------------------------+-------+
この状態ではまだIOスレッドが準同期モードになっていない。
そこで、IOスレッドを再起動する。
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;
再度状態を確認
SHOW STATUS LIKE 'Rpl_semi_sync%';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON    |    ←準同期レプリケーションになった
+----------------------------+-------+

設定永続化

マスタ側のmy.cnfに追記
[mysqld]
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=20000 # 20 second
スレーブ側のmy.cnfに追記
[mysqld]
rpl_semi_sync_slave_enabled=1
※)プラグインを入れる前にこの設定を書いても怒られるだけなので注意。

準同期レプリケーションの動作確認

正常時

マスタ側でSHOW STATUSを叩いて状態を確認する
SHOW STATUS LIKE 'Rpl_semi_sync%';
| Rpl_semi_sync_master_clients               | 1        | ←クライアントが1つ見えている
| Rpl_semi_sync_master_status                | ON       | ←準同期で動いている

スレーブが停止した場合

スレーブが停止してしまうと以下のような状態になるだろう
SHOW STATUS LIKE 'Rpl_semi_sync%';
| Rpl_semi_sync_master_clients               | 0        | ←クライアントが見えていない
| Rpl_semi_sync_master_status                | OFF      | ←非同期になってしまっている
| Rpl_semi_sync_master_no_tx                 | 3        | ←スレーブからackが得られなかったトランザクション数が増加

スレーブが復旧して、バイナリログの転送が追いつくと、非同期から準同期に戻り、Rpl_semi_sync_master_status はONになる。

スレーブが遅い場合

スレーブが遅く、タイムアウトが発生してしまうと以下のような状態になるだろう

SHOW STATUS LIKE 'Rpl_semi_sync%';
| Rpl_semi_sync_master_clients               | 1        | ←クライアントは見えている
| Rpl_semi_sync_master_status                | OFF      | ←非同期になってしまっている
| Rpl_semi_sync_master_no_tx                 | 3        | ←スレーブからackが得られなかったトランザクション数が増加