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!しませう