tamuraです

memcachedでクラスタリングをしたところ、思わぬ事象にはまりました。

  • memcachedサーバが落ちてもクライアントはその次のサーバを使う 
  • memcachedサーバが復活するともともとのサーバを使う
spymemcachedの検証を行っていてその事象が発生したので、「spymemcachedこのやろ~」と思い他の言語のmemcachedクライアントのソースを見てみると、他の言語のクライアントもそのような動きをしていました。

幸いにしてspymemcachedはこのバックアップサーバを使うという動きを止められます。

 

事象

memcachedサーバが2台あります。
memcached


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



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


読み込みます。
 memcached4



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



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



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



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



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



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



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



今度はokです。
memcached12




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



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


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



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


いや、その動き無事じゃありませんから。
先ほど設定したfoo:3という値がとれずに、昔の値である2が取れてしまっています。

次回

spymemcachedはバックアップサーバにつなぎにいく、という動きを抑制できるのでその部分をやりたいと思います。