memcached API で Riak を叩けるようになりました

Deer

その名もダイコーン。まずはget, set, delete だけなんですが、とりあえず適当に作ってもMemcachedの速度の1/40くらい出ます。そのうちいろんなデータベースのAPI備えて、クライアント側を書き換えなくてもRiakを叩けるようにしたいなーと思っています。memslapの結果だと

$ ./clients/memslap --servers=localhost:11211 --non-blocking --concurrency=10

とすると

memcached dicorn/mem dicorn/riak
1.987 2.705 88.487

てな感じです(単位は秒)。

構成としては1プロセスで動くただのプロキシで、メモリもCPUもほとんど使いません。Memcachedがいたところに代わりに立ち上げて、Riakの場所を教えてあげるとそれだけでMemcachedとして動いて叩けるようになります。まだ試してませんが、複数のRiakのIPアドレスを指定できるので、Riakのノードが多少落ちたくらいだと自動的に他のとこに再接続に行ってくれます。

今回あたらしく試してみたのは、Goという言語で実装したところです。Goは軽量プロセス的なのがあってしかもネイティブコードで動くので、高速なTCPサーバーがわりと実装しやすいです(あとはバイナリパターンマッチがあれば完璧なのに…!!)。Goがすごいので、小さなコードなのにネイティブで動いてそこそこ性能もよいです。メモリもほとんど使わないし、Riakを叩くときのオーバーヘッドとしてはほとんど無視できるレベルなんじゃないかと思います。

Goなのでデプロイも簡単です。ビルドすると dicorn という名前のバイナリができるので、それをscpしてしまえばWindowsのバイナリみたいな感じで動きます。rbenvとかChefとか全く使えないぼくのような情弱にも嬉しいですね!

今後はMemcached APIもincrとかdecrを追加しつつ、CassandraとかHBase的なAPIを実装していきたいところです。インピーダンスミスマッチがすごいことになると思いますが、今後のロードマップを考えてもまあ割となんでもアリな感じでできそうな感じで、Riakが持ってるVector Clocks, CRDT, 2i, そしてこれから実装される予定のStrong Consistencyを使えば多分全部できます。これでまわりの皆さんを、Riakを使うしかない的な状況に追い込んでいきたいと思います。

Kyoto Tycoon使ってる人がいたら是非フィードバックください(チラチラ