memcachedを愚弄する1つの方法
某サービスでセッション情報を保持するために利用している
memcached(repcached)に障害が起こった。
ちゃんと追えていないけど、おそらく以下のような原因。他の人がハマらないように。
障害発生まで
- memcached(repcached)の中には揮発したらそれなりにマズい情報が入っている。
- repcachedサーバ2台のOS入れ替えをしていて、1台は再起動が成功した。
- 1台目のサーバへ2台目のサーバからのレプリケーションが完了したのをstatsのcurr_itemsにて確認した。
- よって2台目を再起動するものの、起動しなくなった。
この時点では、1台は生きているから後でデータセンターいこうっと、という気軽な気持ちだった…
現象
生きている1台目のサーバで、以下のような現象が起こった…
- 値をsetする際に、ある閾値以上のexptimeを指定すると即expireされる。
- その閾値はなぜか刻々と減っていく
- memcachedでstatsコマンドを発行した結果のuptimeが4294954584とかのありえない値に
- でもdate +"%s"とかでサーバのUNIX timeチェックしてもまったく問題なし
- 俺大パニック
再起動に成功して、レプリケーションもすんだはずのサーバが謎の挙動を!
ウワーン…
tcpdumpやtelnetでプロトコルをチェックしたところ、
exptime周りの挙動がおかしいことが判明。
パニくってmemcachedの再起動とかをしてみたが状況変わらず。
exptimeを0にして仮対応した。
2台目死んだ状態で再起動したので、情報は揮発。しゅん。
死んだサーバの復旧のため、データセンターに向かう。とぼとぼと。