環境は以下の通り。
- CentOS release 6.2
- MySQL-server-5.6.14
作業の前提として、MySQLのインストールが終わり、バイナリログが出力できているものとする。
まずは非同期レプリケーションの構築
マスタ側での作業
レプリケーション用のユーザを作るマスタのバイナリログの場所を控えるGRANT REPLICATION SLAVE ON *.* TO repl@'(スレーブのIP)' IDENTIFIED BY 'repl';
出力結果の FileとPositionを控えるSHOW MASTER STATUS; +----------------+-----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +----------------+-----------+--------------+------------------+-------------------+ | bin-log.000004 | 450002352 | | | | +----------------+-----------+--------------+------------------+-------------------+
スレーブ側での作業
マスタの指定スレーブの開始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';
必要に応じて、準同期レプリケーションのタイムアウト(ミリ秒)を設定。タイムアウトが発生すると、動作が非同期になり、スレーブのackを待たなくなる。SET GLOBAL rpl_semi_sync_master_enabled = 1;
設定の確認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 | +---------------------------------+----------+
この状態ではまだIOスレッドが準同期モードになっていない。SHOW STATUS LIKE 'Rpl_semi_sync%'; +----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | Rpl_semi_sync_slave_status | OFF | +----------------------------+-------+
そこで、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に追記スレーブ側のmy.cnfに追記[mysqld] rpl_semi_sync_master_enabled=1 rpl_semi_sync_master_timeout=20000 # 20 second
※)プラグインを入れる前にこの設定を書いても怒られるだけなので注意。[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が得られなかったトランザクション数が増加