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