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日は暇を持て余すこともなくなりましたね!

ではではー