« WEB+DB PRESSで連載やります | メイン | WEB+DB PRESS 連載「大規模Webサービスの裏側 第二回 »

Cache::Memcached::Fast v0.14のアルゴリズム変更について

perlのmemcachedクライアントのCache::Memcached::Fastの最新バージョン 0.14 にはちょっとしたラップがあります。
Consistent-Hashing分散アルゴリズムのketamaのアルゴリズムが改善されて、それまでのバージョンと互換性がなくなっています。
changesにも書いています

- improve Ketama distribution. The change is incompatible
with Ketama implementation in previous versions.


現在サービスにCache::Memcached::Fastの 0.13 以下でketamを利用している場合、バージョンアップした瞬間にキャッシュがほどんどhitしなくなるってわけです。
ちょっっ、って訳で、patchを作った。

Cache::Memcached::Fast 0.14を以前のketama algorithmにも対応させる
(gistにも http://gist.github.com/121283 )

先週末、Cache::Memcached::Fastの作者のTomashにこのpatchを送ったところ、必要性は理解してもらえたけど、「これが便利なのは一部のユーザの一度の移行の時だけだよねー」(意訳)と言われました。


そりゃそーだ


というわけで、このエントリーを書いて再度紹介することにしました。


現在Cache::Memcached::Fastの0.13以下をketamaで利用していて、0.14を使いたいが移行に関して困っている人は、上記のpatchをあてた上で、malaさんのCache::Migrateを利用すると良いかと思います。

具体的には、新旧2つのインスタンスを作ります。新しいキャッシュはネームスペースなどを使って分けるとサーバを追加するなど要らないかと。

use Cache::Migrate;
use Date::Parse;
use Cache::Memcached::Fast;

my $old_cache = Cache::Memcached::Fast->new({
   servers => ["127.0.0.1:11211"],
   old_ketama_algo => 1,
});
my $new_cache = Cache::Memcached::Fast->new({
   servers => ["127.0.0.1:11211"],
   namespace => 'new:'

});

my $cache = Cache::Migrate->new(
     { cache => $old_cache, expires_on => str2time("2009/05/15 00:00:00") },
     { cache => $new_cache },
 );


ということで、速度も高速なまま、アルゴリズム改善されたCache::Memcached::Fast v0.14をenjoy!しませう