GARPを無視するスイッチ

去年の暮れの話ですが、メンテナンスの祭にkeepalivedでフェイルオーバーがうまく機能せずに一部の自社のサービスが死に掛けるという自体に陥りました。

いくつかあるVIPをひとつのインスタンスで管理していたんですが、
その中でも特定のIPだけフェイルオーバーに失敗して疎通しなくなるといった症状でした。
ip addr show の結果ではちゃんとVIPは渡されています。

すべてのVIPがだめというわけではなく、一部だけというのもくせものでした。

新拠点にサービスを部分的に投入していく段階であったり、ケチるために思いつきでアクティブ/アクティブ構成だったり、
新しく引いた回線、試験導入して日が浅いハードウェア、少し前にスイッチ故障があり、そのせいでインターナルのサーバのARPテーブルが混乱していたりと、かなり複雑な状況でした。

長ったらしい検証を語るのもめんどくさいので結論を言うと、上位UC●Mのスイッチがkeepalivedがフェイルオーバー時にARPテーブルを更新させるために送信しているGARPを無視して、フェイルオーバーする前のmacアドレスを保持したままという現象でした。

上位スイッチはARPテーブルが変わらないので、フェイルオーバー前のmacアドレス宛に通信を試みようとしますが、
実サーバは送られてきたmacアドレスはあっていても、もうすでにVIPを持っていないのでパケットを破棄してしまいます。

そして年越しもありましたが、一ヶ月ちかく放置されているので、Linuxで無理やり仮想macを実装する方向にむかいます。

keepalivedでreloadしても反映されない問題

Ubuntu 12.04 LTSなサーバでkeepalived.confのweightを変更後、/etc/init.d/keepalived reloadをしてもうまく反映されない問題が発生しました。
症状としては以下のような感じです。

weight 1 → weight 10 とか極端な変更がだめ。
weight 1 → weight 2 とか小刻みには変わる。
weight 0 → weight 1以上 サービスに投入できない。

完全にググレカスで解決したんですが、1.2.2-3のバグのようです。http://comments.gmane.org/gmane.linux.keepalived.devel/3708

フォーラムの中にリンクがありますが、パッチも公開されています。
http://cgit.luffy.cx/keepalived/patch/?id=bc49a46989c98eb6ee72a379b18b77e87ed624fa

apt-get source keepalived でソースを取得して該当箇所を修正した後、dpkg-buildpackage -b でビルドしたパッケージを普通にdpkg -iしたらすんなりインストールできました。
動作としても問題なく非常に快適です。

別の拠点で使ってる同じバージョンのkeepalivedは問題なく使えているし、marvericから古い1.1.2をもってきても同じ問題がでたので、バグとはいえなにか環境固有の問題があるのかもしれません。モヤモヤが加速。

LVSのDSR構成でリアルサーバにFIN_WAIT1 FIN_WAIT2が多発する問題

CentOSからUbuntu Serverへの入れ替えを進めてる最中だったりするのですが、グローバルに露出しているLVSをDSR構成でつかうと、リアルサーバにFIN_WAIT1と、FIN_WAIT2が大量に発生してしまいました。

LVSの方でtimeoutを通常より短めに設定していたため、ただちに大きな影響はありませんでしたが、これは放置できません。

ぐぐったらすぐでてきたのですが、iptablesがstateを評価すると、FINを落とすそうです。http://3.1415.jp/node/226

さて、そんな設定した覚えないのになーと思いつつ、ufwの存在をすっかり忘れているお馬鹿さんでした。
iptables -L でみると見たこともないような設定だらけ!
簡単にポリシーにそって設定できるufwですが、よかれとおもって入っているリッチ()な設定が悪さをしていました。

なのでとりあえず暫定的にstate部分を削除します。

探して、
iptables -L --line-number

チェインと番号を指定して消します。
iptables -D ufw-before-input 3

1リアルサーバあたり30000くらいあったActiveConnが、2500前後まで落ちました。スッキリ。

ufwを使わずに今まで通りに手で書いてrestoreするのか、ufwを使いこなすか悩むところです。