CentOS 5.2 MySQL 5.1.44にmycacheを入れてみる

 CodezineSQLをショートカットしてパフォーマンスを向上させるプラグインで紹介されていた樋口証氏の『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';

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以外は設定できない。

SELECT mycached_stop();

 mycacheはさすがに1年前のものなので、プロトコルがmemcacheとなっているが、今であればMessagePack-RPCで実装し直したら面白いかもしれない。MySQL handlersocket pluginでも、独自プロトコルによる結果セットのメタデータの効率が効果あったそうなので、この部分はMessagePackの強いところなので、handlersocket pluginとMessagePack-RPC実装での比較が見てみたい。あと、handlersocket pluginは独自プロトコルのため、現在バインドがCとperlに限られるそうで、既に様々な言語に実装されているMessagePack-RPCの方が有利かもしれない。

*1:以下はプラグインフォルダが/usr/local/mysql/lib/mysql/plugin/の場合、環境によって適時修正