08 « 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.» 10

スポンサーサイト 

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Posted on --/--/-- --. --:-- [edit]

category: スポンサー広告

TB: --    CM: --

--

【検証】MySQL 準同期レプリケーション(Semisynchronous Replication) 

MySQL5.5から準同期レプリケーションの仕組みが導入されました。
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;
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)  ←あれ?正常に書込みできている!


スレーブのデータを確認
select * from t1;
+----+--------------------------------------+
| 1 | テーブル作成時のレコード |
+----+--------------------------------------+
1 row in set (0.00 sec)
当然ですが「SLAVE STOP」しているので、マスターに書込んだ「スレーブ停止時のレコード」がありません。

スレーブを再開させて再度データを確認
SLAVE START;
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


・再度スレーブを停止
SLAVE STOP;


・ここでマスターにレコードを追加
insert into t1 (value) values ('スレーブ停止時のレコード2');
Query OK, 1 row affected (10.01 sec)  ←10秒後に書込み完了
ちゃんとタイムアウト値の10秒を待ってから完了しています。


上記のことから準同期の動作は、スレーブがバイナリログを受取りマスターに ack を返した時点、または ack が返ってこない場合は「rpl_semi_sync_master_timeout」を待ってから、書込み完了した旨(COMMIT)をクライアントに返すと理解した。 ←間違っていたらどうぞご指摘下さい。(^^;)


マスターとスレーブで完全同期をしたい場合は、アプリケーション側でタイムアウトする仕組みを設けて「rpl_semi_sync_master_timeout」以内に書込みができないのなら、スレーブダウンと判断して書込み処理をしないとかすればいいのかな? 実装例などしらべてみよう。


Posted on 2012/09/09 Sun. 10:30 [edit]

category: サーバ

thread: サーバー  -  janre: コンピュータ

TB: 0    CM: 0

09

コメント

Comment
list

コメントの投稿

Secret

Comment
form

トラックバック

トラックバックURL
→http://arpanet617.blog.fc2.com/tb.php/31-05c4fc41
この記事にトラックバックする(FC2ブログユーザー)

Trackback
list

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。