MySQL 5.5 GA版が出たのでSemisynchronous Replicationを使ってみた

こんにちはこんにちは。いつもうちの嫁がお世話になっております。というわけで、ついに 待ちに待った MySQL 5.5 の GA 版である MySQL 5.5.8 がリリースされました。http://dev.mysql.com/doc/refman/5.5/en/news-5-5-8.html

先日の MySQL Casual Talks #1 で@Rkajiyama さんがほのめかしていましたが、期待を裏切らず 年内リリースを達成して頂いた Oracle は本当にすばらしいと思います。Casual User としては このリリースに対して「使ってみたエントリ」で応えるしかない!というわけで早速使ってみました。

まずはインストール

インストール方法についてはほとんど MySQL 5.1 と変わりません。InnoDB(しかも 5.1 の plugin 相当)が デフォルトのストレージエンジンになっているため、もうdefault_storage_engine = InnoDBとか、 ignore-builtin-innodbとか変なのを my.cnf に書く必要はありません!!

注意点としては、5.1 までは warning を出しつつも使えていたいくつかの設定変数がマジで使えなくなっています。 自分のよく使う my.cnf だとdefault-table-typeとかdefault-character-setがダメよと言われました。

とりあえず準同期レプリケーションでしょ

5.5 といえば何はなくとも取り上げられるのが Semisynchronous Replication。 というわけで遅ればせながら使ってみましたよ!

http://dev.mysql.com/doc/refman/5.5/en/replication-semisync-installation.html

インストール

まずは master/slave でそれぞれ plugin を有効化します。

・master

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled = 1;

・slave

 INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
 SET GLOBAL rpl_semi_sync_slave_enabled = 1;

あとはいつもの change master 文でレプリを設定して start slave すればインストール終わり。 簡単すぎる!!ちなみに既に start slave している場合には、stop slave io_thread; start slave io_thread;と io スレッドを再起動してやる必要があります。

本当に準同期なの?

とりあえず動いているそうなのですが、これでは準同期なんだかどうなんだか分かりません。 本当に動いているのかどうか確認してみましょう。

準同期レプリの場合、master で commit した時に binlog を書いて slave に転送し、受け取った slave のどれか 1 台から ack が返ってきて初めて commit が成功してトランザクションが解放されます。今までの非同期レプリの場合 ack とか無いので binlog に書いてしまえば commit は成功します。

というわけで、slave を 1 台だけぶら下げてあえて io_thread を停止させた後に master で commit した場合どうなるかを 見てみましょう!

非同期レプリの場合

mysql> begin;
Query OK, 0 rows affected (0.00 sec)
(slave側でstop slave)
mysql> insert into t1 values (6);
Query OK, 1 row affected (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec) ←一瞬でcommit成功

準同期レプリの場合

mysql> begin;
Query OK, 0 rows affected (0.00 sec)
(slave側でstop slave)
mysql> insert into t1 values (10);
Query OK, 1 row affected (0.00 sec)

mysql> commit;
★固まった → slave側でstart slave
Query OK, 0 rows affected (5.88 sec)

キタコレ!ですね。commit をした際に slave からの ack が返ってこないので、 rpl_semi_sync_master_timeout(単位は msec)の間は commit が待ちになりました。 デフォルトだと 10 秒に設定してあるので、今回はその秒数以内に slave 側で io_thread を 再開したのでその瞬間に binlog を受け取って ack を返してくれたみたいです!

ちなみにrpl_semi_sync_master_timeoutを過ぎるとロールバックするのではなく commit に成功して終わりの様です。

mysql> begin;
Query OK, 0 rows affected (0.00 sec)
(slave側でstop slave)
mysql> insert into t1 values (11);
Query OK, 1 row affected (0.00 sec)

mysql> commit;
★固まった!放置
Query OK, 0 rows affected (10.00 sec)

mysql> select * from t1 where id = 11;
+----+
| id |
+----+
| 11 |
+----+
1 row in set (0.00 sec)

サービスで使う場合にはこの timeout の値をどうするかはよく検討する必要がありそうですね。 set global 文で変えられる様なので運用しながら調整する感じでも良さそうです。

というわけで、準同期レプリの挙動を簡単に確認してみました。これで多い日も安心ですね!

まとめ

とりあえず使ってみたという話題でした。5.1+InnoDB plugin を結構使っている身としては 今までとほとんど変わらない感じでインストールして使えたので非常にありがたいと思います。 バージョンアップによって突然使い勝手が変わるとかはソフトウェアにはよくありがちなのですが、 よく統制が取れていて、洗練度の増した正統派の進化だと思います! なんて、僕は偉そうなことの言える立場の人間ではないですが><

他にもパーティションの機能拡充や performance_schema の追加辺りが個人的に気になるところです。 InnoDB についてはもはやおなじみの plugin 相当なので、逆に言うとそこまで目新しい機能はないと思いますが 性能改善は楽しみなところです。

MySQL のこれまでが確かなものであったことと、これからも期待が持てることを示唆してくれる すばらしいけどちょっと早いクリスマスプレゼントでした。これで 24 日は暇を持て余すこともなくなりましたね!

ではではー