tamuraです
memcachedでクラスタリングをしたところ、思わぬ事象にはまりました。
- memcachedサーバが落ちてもクライアントはその次のサーバを使う
- memcachedサーバが復活するともともとのサーバを使う
spymemcachedの検証を行っていてその事象が発生したので、「spymemcachedこのやろ~」と思い他の言語のmemcachedクライアントのソースを見てみると、他の言語のクライアントもそのような動きをしていました。
幸いにしてspymemcachedはこのバックアップサーバを使うという動きを止められます。
事象
memcachedサーバが2台あります。

キー値: foo
値:1
というデータを書き込みます。 この例ではmem1に書き込みに行きます。

書き込み後はこうなります。

読み込みます。

fooに対して1という値が取れます。

mem1サーバが死んだとします。

キー値:fooに対して2という値を書き込もうとします。
memcachedは同じキーは同じサーバに保存されますので、mem1サーバに保存しようとします。

しかし、mem1が死んでいるのでmem2に書き込みに行きます。

無事に書き込まれました。

そうこうしているうちにmem1サーバが復活しました。

キー値:fooに対して3を書き込みにいきます。
mem1サーバが復活しているので、mem1に書き込みに行きます。

今度はokです。

あ、またmem1が落ちました。

キー値:fooの値を取得しようとします。
fooはmem1にあるはずなのでmem1に接続しますが、mem1はつながりません。

バックアップであるmem2にデータを取りにいきました。

無事、mem2からデータが取れました。

いや、その動き無事じゃありませんから!!
先ほど設定したfoo:3という値がとれずに、昔の値である2が取れてしまっています。
次回
spymemcachedはバックアップサーバにつなぎにいく、という動きを抑制できるのでその部分をやりたいと思います。