【検証】MySQL 準同期レプリケーション(Semisynchronous Replication)
MySQL5.5から準同期レプリケーションの仕組みが導入されました。
http://dev.mysql.com/doc/refman/5.5/en/replication-semisync.html
準同期についてザックリ理解すると、スレーブがバイナリログを受取り、マスターに ack を返した時点で、書込み完了した旨(COMMIT)をクライアントに返すといったもの。
ここで一つ疑問に思ったのが、マスター、スレーブが一台ずつの構成の場合、スレーブがクラッシュしてしまうとマスターへの更新も出来なくなる? 結果稼働率は低くなってしまう?
この疑問を少し検証してみる。
※マスターとスレーブのMySQLはこちらの設定になっています。
・まず、マスターで検証用DBとテーブルを作成
・スレーブでデータが反映されていることを確認
・一度スレーブを停止
・ここでマスターにレコードを追加
・スレーブのデータを確認
・スレーブを再開させて再度データを確認
・続いてレプリケーションタイムアウトの動作を確認するため、マスターのMySQL設定を変更します。(タイムアウト値を10msから10秒に変更)
・再度スレーブを停止
・ここでマスターにレコードを追加
上記のことから準同期の動作は、スレーブがバイナリログを受取りマスターに ack を返した時点、または ack が返ってこない場合は「rpl_semi_sync_master_timeout」を待ってから、書込み完了した旨(COMMIT)をクライアントに返すと理解した。 ←間違っていたらどうぞご指摘下さい。(^^;)
マスターとスレーブで完全同期をしたい場合は、アプリケーション側でタイムアウトする仕組みを設けて「rpl_semi_sync_master_timeout」以内に書込みができないのなら、スレーブダウンと判断して書込み処理をしないとかすればいいのかな? 実装例などしらべてみよう。
http://dev.mysql.com/doc/refman/5.5/en/replication-semisync.html
準同期についてザックリ理解すると、スレーブがバイナリログを受取り、マスターに ack を返した時点で、書込み完了した旨(COMMIT)をクライアントに返すといったもの。
ここで一つ疑問に思ったのが、マスター、スレーブが一台ずつの構成の場合、スレーブがクラッシュしてしまうとマスターへの更新も出来なくなる? 結果稼働率は低くなってしまう?
この疑問を少し検証してみる。
※マスターとスレーブのMySQLはこちらの設定になっています。
・まず、マスターで検証用DBとテーブルを作成
create database tdb;
use tdb;
create table t1 (id int auto_increment primary key, value text);
insert into t1 (value) values ('テーブル作成時のレコード');
use tdb;
create table t1 (id int auto_increment primary key, value text);
insert into t1 (value) values ('テーブル作成時のレコード');
・スレーブでデータが反映されていることを確認
use tdb;
select * from t1;
+----+--------------------------------------+
| 1 | テーブル作成時のレコード |
+----+--------------------------------------+
1 row in set (0.00 sec)
select * from t1;
+----+--------------------------------------+
| 1 | テーブル作成時のレコード |
+----+--------------------------------------+
1 row in set (0.00 sec)
・一度スレーブを停止
SLAVE STOP;
・ここでマスターにレコードを追加
insert into t1 (value) values ('スレーブ停止時のレコード');
Query OK, 1 row affected (0.02 sec) ←あれ?正常に書込みできている!
Query OK, 1 row affected (0.02 sec) ←あれ?正常に書込みできている!
・スレーブのデータを確認
select * from t1;
+----+--------------------------------------+
| 1 | テーブル作成時のレコード |
+----+--------------------------------------+
1 row in set (0.00 sec)
当然ですが「SLAVE STOP」しているので、マスターに書込んだ「スレーブ停止時のレコード」がありません。+----+--------------------------------------+
| 1 | テーブル作成時のレコード |
+----+--------------------------------------+
1 row in set (0.00 sec)
・スレーブを再開させて再度データを確認
SLAVE START;
select * from t1;
+----+--------------------------------------+
| 1 | テーブル作成時のレコード |
| 2 | スレーブ停止時のレコード |
+----+--------------------------------------+
2 rows in set (0.00 sec)
マスターに書込んだ「スレーブ停止時のレコード」が反映されました。select * from t1;
+----+--------------------------------------+
| 1 | テーブル作成時のレコード |
| 2 | スレーブ停止時のレコード |
+----+--------------------------------------+
2 rows in set (0.00 sec)
この動作だと従来のレプリケーションと同じだと思うのだが、準同期とは?
・続いてレプリケーションタイムアウトの動作を確認するため、マスターのMySQL設定を変更します。(タイムアウト値を10msから10秒に変更)
vi /etc/my.cnf
---(下記を変更)---------------------------
rpl_semi_sync_master_timeout=10
↓
rpl_semi_sync_master_timeout=10000
------------------------------
service mysqld restart
---(下記を変更)---------------------------
rpl_semi_sync_master_timeout=10
↓
rpl_semi_sync_master_timeout=10000
------------------------------
service mysqld restart
・再度スレーブを停止
SLAVE STOP;
・ここでマスターにレコードを追加
insert into t1 (value) values ('スレーブ停止時のレコード2');
Query OK, 1 row affected (10.01 sec) ←10秒後に書込み完了
ちゃんとタイムアウト値の10秒を待ってから完了しています。Query OK, 1 row affected (10.01 sec) ←10秒後に書込み完了
上記のことから準同期の動作は、スレーブがバイナリログを受取りマスターに ack を返した時点、または ack が返ってこない場合は「rpl_semi_sync_master_timeout」を待ってから、書込み完了した旨(COMMIT)をクライアントに返すと理解した。 ←間違っていたらどうぞご指摘下さい。(^^;)
マスターとスレーブで完全同期をしたい場合は、アプリケーション側でタイムアウトする仕組みを設けて「rpl_semi_sync_master_timeout」以内に書込みができないのなら、スレーブダウンと判断して書込み処理をしないとかすればいいのかな? 実装例などしらべてみよう。
09
« git WEBアプリケーション開発環境 | MySQL 準同期レプリケーション(Semisynchronous Replication)設定メモ »
コメント
Comment
list
コメントの投稿
Comment
form
トラックバック
トラックバックURL
→http://arpanet617.blog.fc2.com/tb.php/31-05c4fc41
この記事にトラックバックする(FC2ブログユーザー)
Trackback
list
| h o m e |