なんかかきたい

プログラミングなどの個人的なメモやサークル「ゆきいろパラソル」の情報を載せてます

MySQL InnoDB memcached pluginを使ってみようとしてやめた話

追記 MySQL 5.7.19か20あたりで取り込まれたパッチにより以下の問題は発生しなくなりました。つまりはバグでした。

InnoDB memcached pluginはMySQL 5.6から搭載された機能で、Memcacheプロトコルを使ってInnoDBにデータを読み書きできる便利機能です。 簡単なプロトコルなためSQLより高速に動作する点、InnoDBに記録できる点、MySQLレプリケーションが利用できる点など、 うまく使えば便利な仕組みですが、結論を先に書いてしまうと使えなかったという話をします。

使えなかった理由

MySQL memcached pluginを使ったInnoDBへのインターフェイスが使えなかった理由はクラッシュが多発するためです。 高速な動作、レプリケーション機能などはうまく動作しているのですが、 しばらく動作させていると get 操作の際に SIGABRT となりMySQLが動作停止します。

Program received signal SIGABRT, Aborted.
[Switching to Thread 0x7ffcf2ffd700 (LWP 722)]
0x00007ffff67e2067 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
...

MySQL5.7.14での実行結果ですが、5.6.32, 5.7.15, 8.0 でも同じように停止します。 アサーションに引っかかることによる停止なのですが、InnoDBからデータを取得する際に意図しない形でデータが取得されていて停止するようです。

MySQL 8.0 ではフォーラムで報告されていた memcached plugin 周りのいくつかの修正が取り込まれており、コードもそれなりに変更されているのですが、この問題はまだ修正されていないようです。 ネット検索では同じように停止する報告を見つけられなかったので本格的に使おうと思った人がいないのでは?という不安もあり、あまりにも簡単に停止するので検証を断念しました。

チューニングパラメータ

使えないと書いた上で紹介するのも変な話ですが、いくつかのパラメータを調整するとInnoDB memcached pluginを高速に動作させることができます。

https://dev.mysql.com/doc/refman/5.6/ja/innodb-memcached-tuning.html

単にmemcachedの代替として使用する場合、innodb_doublewrite=0innodb_flush_log_at_trx_commit=2 のように設定すると高速に動作します。

トランザクションオーバーヘッドの削減 パラメータ daemon_memcached_r_batch_sizedaemon_memcached_w_batch_size は共に大きな値を設定すると、 ロックが多発しパフォーマンスが大幅に低下してしまうので、エラーログにロックの記載がある場合はどちらも1に設定したほうがいい性能が出ることもあります。

余談

これだけ簡単に停止させられるのであれば、Amazon RDSのMemcacheプラグインも停止するのでは?と思い同じ条件で試してみましたがRDSは停止しませんでした。 うまく調整されているのか謎です。