CentOS 5.2 MySQL 5.1.44にmycacheを入れてみる
CodezineのSQLをショートカットしてパフォーマンスを向上させるプラグインで紹介されていた樋口証氏の『MySQL handlersocket plugin』が面白そうだったので試してみたいと思っていたのですが、まだ、一般公開はされていません。※ 今後ディー・エヌ・エーの技術者ブログにて告知予定だそうです。
そんな折り、こちらのエントリー『Re: @kazuho: handlersocket plugin や mycached を使えば memcached は不要か、それとも使うべきケースがあるか。考察せよ 』を見てmycacheなるものを知りました。作者はQ4Mの作者としても有名なサイボウズラボの奥 一穂氏である。丁度一年程前に開発をされたもののようでconfigureといったものは用意されていません。まずはインストールしてみましょう。
そもそも、『MySQL handlersocket plugin』や『mycache』はなんぞやというと一言で言えばMySQLのストレージエンジンをKVSとして使えるようにするプラグイン...。SQLのパースを端折り、MySQLのプロトコルとは別にイベント駆動にて他のプロトコル(mycacheは拡張memcachedプロトコル、MySQL handlersocket pluginは独自プロトコル)でソケット通信を行う。
※ /usr/local/srcにmysql-5.1.44のソースが展開されている想定です。
cd /usr/local/src svn co http://svn.coderepos.org/share/platform/mysql/mycached/trunk mycache cd mycache g++ -DMYCACHED_USE_EPOLL=1 -shared -fPIC -Wall -g -O2 \ -I ../mysql-5.1.44/include \ -I ../mysql-5.1.44/sql \ -I ../mysql-5.1.44/regex \ mycached_as_udf.cc -o mycached_as_udf.so
cp mycached_as_udf.so /usr/local/mysql/lib/mysql/plugin/
CREATE FUNCTION mycached_start RETURNS INT SONAME 'mycached_as_udf.so'; CREATE FUNCTION mycached_stop RETURNS INT SONAME 'mycached_as_udf.so';
- memcacheプロトコルアクセス用ポートを開始
UDFとして実装されているので、SELECT文でmemcache用のポートを開く、引数はホスト名(IPアドレス[INT型])、ポート、使用するワーカースレッド数
SELECT mycached_start(0, 11211, 4);
サンプルの通りホストのIPアドレスが0だと、すべてのインターフェース(グローバル側も)にて公開されてしまう。ローカルな環境または、iptablesでフィルタリングしていない場合は127.0.0.1、または192.168.0.x等のプライベートなIPアドレスを設定しておこう。尚、ホストの設定はINT型なので、inet_atonで変換して設定する。
SELECT mycached_start(inet_aton('127.0.0.1'), 11211, 4);
といったことはできなかったので、ローカル環境でテストするかポートをフィルタリングしてから使いましょう。ホストX(INT型)の設定をすると0.0.0.Xとして設定される。つまり実質0以外は設定できない。
- memcacheプロトコルアクセス用ポートを停止
SELECT mycached_stop();
mycacheはさすがに1年前のものなので、プロトコルがmemcacheとなっているが、今であればMessagePack-RPCで実装し直したら面白いかもしれない。MySQL handlersocket pluginでも、独自プロトコルによる結果セットのメタデータの効率が効果あったそうなので、この部分はMessagePackの強いところなので、handlersocket pluginとMessagePack-RPC実装での比較が見てみたい。あと、handlersocket pluginは独自プロトコルのため、現在バインドがCとperlに限られるそうで、既に様々な言語に実装されているMessagePack-RPCの方が有利かもしれない。