2013年1月21日月曜日

準同期レプリケーション設定

以前に行ったレプリケーションの設定は、
通常のレプリケーションで非同期で行われるレプリケーションになりました。
そこで、今回はMySQL 5.5からの新機能の準同期レプリケーションを試したいと思います。

通常のレプリケーション(非同期)と準同期レプリケーションの違いについては次のようになっています

■非同期レプリケーションの処理の流れについて
1.masterでトランザクション開始
2.masterが更新クエリ時にバイナリーログを出力する。
3.コミット完了 ここまでmasterの同期が取られている
4.slaveがmasterのバイナリーログを取得する。
5.slaveがmasterから取得しバイナリーログを実行する。
※4、5はslave側で非同期で実行される。

■準同期レプリケーションの処理の流れについて
1.masterでトランザクション開始
2.masterが更新クエリ時にバイナリーログを出力する。
3.masterがバイナリーログをslaveへ転送する。
4.slaveがバイナリーログを受け取ったという応答をmasterが受ける。
5.コミット完了(ここまでmasterからの同期が取られている)
※slave側で実際にSQLが実行される部分はmasterとは同期されず、非同期に実行される。

■非同期レプリケーションのメリット・デメリット
メリット
・master,slaveが独立して動いているため、準同期に比べるとコミット処理が早い。
・slaveが落ちていたとしても、masterのコミット時の応答に影響はない。
デメリット
・masterクラッシュ時などにslaveとのバイナリーログの整合性に問題が発生する場合がある。

■準同期レプリケーションのメリット・デメリット
メリット
・masterクラッシュ時にもmasterとslaveとのバイナリーログの整合性に問題が起きる可能性が低い。
デメリット
・コミット時の応答が遅くなる。(slaveが増えたら増えた分だけ遅くなる?)
・slaveが落ちている場合に、masterのコミット時の応答が遅くなる。(slaveの応答タイムアウトまで待つため)

それでは、準同期レプリケーションの設定を行いたいと思います。
前提として、既に通常レプリケーション(非同期)が組まれている環境で話を進めて行きたいと思います。
通常レプリケーション(非同期)の設定方法はこちらを参考にしてください。
■手順1)masterに準同期用のプラグインのインストール
#master用のプラグインをインストール
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
Query OK, 0 rows affected (0.13 sec)

#slave用のプラグインも一応入れておく。(slave,master切り替え用に)
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, 0 rows affected (0.49 sec)

#プラグインの確認
mysql> SHOW PLUGINS;
+--------------------------+----------+--------------------+--------------------+---------+
| Name                     | Status   | Type               | Library            | License |
+--------------------------+----------+--------------------+--------------------+---------+
| binlog                   | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| mysql_native_password    | ACTIVE   | AUTHENTICATION     | NULL               | GPL     |
| mysql_old_password       | ACTIVE   | AUTHENTICATION     | NULL               | GPL     |
| MRG_MYISAM               | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| CSV                      | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| MyISAM                   | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| MEMORY                   | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| ARCHIVE                  | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| BLACKHOLE                | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| FEDERATED                | DISABLED | STORAGE ENGINE     | NULL               | GPL     |
| PERFORMANCE_SCHEMA       | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| InnoDB                   | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| INNODB_TRX               | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_LOCKS             | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_LOCK_WAITS        | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMP               | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMP_RESET         | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMPMEM            | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMPMEM_RESET      | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_BUFFER_PAGE       | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_BUFFER_PAGE_LRU   | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_BUFFER_POOL_STATS | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| partition                | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| rpl_semi_sync_master     | ACTIVE   | REPLICATION        | semisync_master.so | GPL     |
| rpl_semi_sync_slave      | ACTIVE   | REPLICATION        | semisync_slave.so  | GPL     |
+--------------------------+----------+--------------------+--------------------+---------+
25 rows in set (0.00 sec)
■手順2)masterのmy.cnfを編集する
vi /etc/my.cnf
#
innodb_flush_log_at_trx_commit = 1

#準同期が有効化
rpl_semi_sync_master_enabled = 1

#slaveから応答待ち最大時間(ackが返ってこなかったときの待ち時間を指定)。単位はミリ秒。デフォルト10秒
rpl_semi_sync_master_timeout=10

■手順3)masterの再起動&設定の確認
#再起動
# /etc/init.d/mysqld restart
mysqld を停止中:                                           [  OK  ]
mysqld を起動中:                                           [  OK  ]

#設定の確認
mysql> SHOW VARIABLES LIKE '%semi%';
+------------------------------------+-------+
| Variable_name                      | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled       | ON    |
| rpl_semi_sync_master_timeout       | 10    |
| rpl_semi_sync_master_trace_level   | 32    |
| rpl_semi_sync_master_wait_no_slave | ON    |
| rpl_semi_sync_slave_enabled        | OFF   |
| rpl_semi_sync_slave_trace_level    | 32    |
+------------------------------------+-------+

#
mysql> SELECT @@innodb_flush_log_at_trx_commit;
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+

#materで準同期が有効になっているか確認(Rpl_semi_sync_master_statusがONになっていること)
mysql> SHOW STATUS LIKE "rpl%";
+--------------------------------------------+-------------+
| Variable_name                              | Value       |
+--------------------------------------------+-------------+
| Rpl_semi_sync_master_clients               | 1           |
| Rpl_semi_sync_master_net_avg_wait_time     | 0           |
| Rpl_semi_sync_master_net_wait_time         | 0           |
| Rpl_semi_sync_master_net_waits             | 0           |
| Rpl_semi_sync_master_no_times              | 0           |
| Rpl_semi_sync_master_no_tx                 | 0           |
| Rpl_semi_sync_master_status                | ON          |
| Rpl_semi_sync_master_timefunc_failures     | 0           |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0           |
| Rpl_semi_sync_master_tx_wait_time          | 0           |
| Rpl_semi_sync_master_tx_waits              | 0           |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0           |
| Rpl_semi_sync_master_wait_sessions         | 0           |
| Rpl_semi_sync_master_yes_tx                | 0           |
| Rpl_semi_sync_slave_status                 | OFF         |
| Rpl_status                                 | AUTH_MASTER |
+--------------------------------------------+-------------+
■手順4)slaveに準同期用のプラグインのインストール

#master用のプラグインをインストール
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
Query OK, 0 rows affected (0.13 sec)

#slave用のプラグインも一応入れておく。(slave,master切り替え用に)
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, 0 rows affected (0.49 sec)

#
mysql> SHOW PLUGINS;
+--------------------------+----------+--------------------+--------------------+---------+
| Name                     | Status   | Type               | Library            | License |
+--------------------------+----------+--------------------+--------------------+---------+
| binlog                   | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| mysql_native_password    | ACTIVE   | AUTHENTICATION     | NULL               | GPL     |
| mysql_old_password       | ACTIVE   | AUTHENTICATION     | NULL               | GPL     |
| MRG_MYISAM               | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| CSV                      | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| MyISAM                   | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| MEMORY                   | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| ARCHIVE                  | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| BLACKHOLE                | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| FEDERATED                | DISABLED | STORAGE ENGINE     | NULL               | GPL     |
| PERFORMANCE_SCHEMA       | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| InnoDB                   | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| INNODB_TRX               | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_LOCKS             | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_LOCK_WAITS        | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMP               | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMP_RESET         | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMPMEM            | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMPMEM_RESET      | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_BUFFER_PAGE       | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_BUFFER_PAGE_LRU   | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_BUFFER_POOL_STATS | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| partition                | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| rpl_semi_sync_master     | ACTIVE   | REPLICATION        | semisync_master.so | GPL     |
| rpl_semi_sync_slave      | ACTIVE   | REPLICATION        | semisync_slave.so  | GPL     |
+--------------------------+----------+--------------------+--------------------+---------+
■手順5)slaveのmy.cnfを編集する
vi /etc/my.cnf
#
innodb_flush_log_at_trx_commit = 1

#slaveの有効化
rpl_semi_sync_slave_enabled = 1
■手順6)slaveの再起動&設定の確認
# /etc/init.d/mysqld restart
mysqld を停止中:                                           [  OK  ]
mysqld を起動中:                                           [  OK  ]

#
mysql> show variables like '%semi%';
+------------------------------------+-------+
| Variable_name                      | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled       | OFF   |
| rpl_semi_sync_master_timeout       | 10000 |
| rpl_semi_sync_master_trace_level   | 32    |
| rpl_semi_sync_master_wait_no_slave | ON    |
| rpl_semi_sync_slave_enabled        | ON    |
| rpl_semi_sync_slave_trace_level    | 32    |
+------------------------------------+-------+
#
mysql> SELECT @@innodb_flush_log_at_trx_commit;
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+

#同期開始
start slave;

#slaveで準同期が有効になっているか確認(Rpl_semi_sync_slave_statusがONになっていること)
mysql> SHOW STATUS LIKE "rpl%";
+--------------------------------------------+-------------+
| Variable_name                              | Value       |
+--------------------------------------------+-------------+
| Rpl_semi_sync_master_clients               | 0           |
| Rpl_semi_sync_master_net_avg_wait_time     | 0           |
| Rpl_semi_sync_master_net_wait_time         | 0           |
| Rpl_semi_sync_master_net_waits             | 0           |
| Rpl_semi_sync_master_no_times              | 0           |
| Rpl_semi_sync_master_no_tx                 | 0           |
| Rpl_semi_sync_master_status                | OFF         |
| Rpl_semi_sync_master_timefunc_failures     | 0           |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0           |
| Rpl_semi_sync_master_tx_wait_time          | 0           |
| Rpl_semi_sync_master_tx_waits              | 0           |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0           |
| Rpl_semi_sync_master_wait_sessions         | 0           |
| Rpl_semi_sync_master_yes_tx                | 0           |
| Rpl_semi_sync_slave_status                 | ON          |
| Rpl_status                                 | AUTH_MASTER |
+--------------------------------------------+-------------+
以上(`・ω・´)ゞビシッ!!

準同期レプリケーションの詳細な動きはこちらを参考にしました。

[mysql] MySQL 5.5 の Semi-sync. を Windows 上で試してみたから一部抜粋
http://d.hatena.ne.jp/sakaik/20091217/mysql_semi_synchronous_replication
・スレーブが落ちているとマスタでは自動でセミシンクロのレプリケーションから非同期の(通常の)レプリケーションへと切り替わる

・切り替わるまでには、rpl_semi_sync_master_timeout 値の設定に従った時間(デフォルト10秒)だけ待つ。
スレーブが落ちたときにこの時間だけはすべての更新が止まる(待ちになる)と思って良い

・非同期レプに切り替わってしまったことは、マスタの Rpl_semi_sync_master_status ステータス値が
OFF になることで検出可能。
また、セミシンクロ時は更新時にステータス値 Rpl_semi_sync_master_yes_tx がインクリメントされるのに対し、
非同期時には Rpl_semi_sync_master_no_tx がインクリメントされていくことから、
その増分でも判るかもしれない
(ただし、スレーブが複数で、そのうちの1台だけをセミシンクロにする場合にどう増えるか未確認。もしかしたら監視用途には使えない(混在してしまう)かもしれない)

・停止していたスレーブが改めてマスタに接続しなおした際には、
マスタの Rpl_semi_sync_master_status も自動で ON になる。

・スレーブのサーバ自体を再起動した際には、
(今回は my.cnf に rpl_semi_sync_slave_enabled=1 を記述していないので オフになっているため)
通常のレプとして再開してしまう。レプリケーション自体は自動で開始されるから。 
my.cnf に書けば安全だと思われるが、スレーブ再起動時には一応「セミシンクロのつもりだったのに普通に非同期だった」ということがないよう注意が必要。

・もっともこれらはともかく、マスタの Rpl_semi_sync_master_status=ON を監視していれば問題にはならないと思う。

・rpl_semi_sync_master_wait_no_slave 値(デフォルト ON)を OFF にしてみたが、
何が変わったのかわからなかった。ドキュメント読んでみないと。。。
(スレーブ停止時に、10秒待つことや、その後セミシンクロが OFF になることなど、特に何も変わらなかった)

参考URL

0 件のコメント:

コメントを投稿