memcachedクライアントではまった件(前編)

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はバックアップサーバにつなぎにいく、という動きを抑制できるのでその部分をやりたいと思います。

関連記事

comments powered by Disqus