Iruca Log

Iruca Log

東京に住むWeb系エンジニアによる技術&雑記ブログ

SNSでフォローする!

pythonでSpymemcached互換のあるKetamaアルゴリズム書いた

f:id:iruca21:20170802233136p:plain

こんにちは、irucaです。

業務用のサーバアプリケーションでは、データベースの負荷を下げるなどの目的でmemcachedをキャッシュとして採用していることも多いと思います。


memcachedサーバはノードと呼ばれ、キャッシュ容量を増やすときはノードを増やすことになります。

ノード群をスケールさせるときはロードバランサなどを前段に用意するわけではなく、
memcachedを使用する側が特定のアルゴリズムによって叩くmemcachedノードを分散させることで各ノードの負荷を均等化する、クライアントシャーディングという方法を用います。

コンシステントハッシュ法というアルゴリズムを用いてそのシャーディングを行うのですが、そのコンシステントハッシュの実装の一つがKetamaと呼ばれるものです。



そしてJavaでKetamaをサポートしているmemcachedクライアントライブラリの1つがSpymemcached。
github.com



なので、サーバアプリケーションをJavaで書いている人はspymemcachedライブラリのKetamaを使っている人も多いかと思います。


このKetamaを使っているときの問題の一つが、
「どのmemcachedノードにどのキャッシュが入っているのか調べたいときに、いちいちspymemcachedのKetama機能を使わないといけないのが面倒」ということ。

どのキャッシュキーがどのmemcachedノードに入っているかぐらい、サクッとpythonでも使って調べたいのです。が、イマイチ良い実装が見つからない。


pythonでKetamaを実装したという例はググれば山ほど見つかるのですが、実際に試してみるとどれもSpymemcachedと互換性が無い。
Spymemcachedが選択するmemcachedノードと、他の実装が選択するmemcachedノードが食い違ってしまうのです。

これではテストするときに何かと面倒。



ということで、完全にSpymemcachedと選択するノードが同じになるようにKetamaを実装したプログラムをそっと作っておきました。
github.com


これで本番環境でキャッシュが載ってるだの載ってないだのの問題が起きたとき、たくさんのmemcachedノードの中から一発で目的のキャッシュが載っているmemcachedノードが見つけられる!


非常にニッチなところを書いたライブラリではありますが、誰かは使ってくれるといいな…。

というわけで今日はただの開発報告でした。