LVS + Ultra Monkey で負荷分散 (設定編) - 酒日記 はてな支店 の続きです。
トラブル時
- real server が落ちた! -> ldirectord が検知 (最大 checktimeout + checkinterval 秒以内) して切り離し
- director (active) が落ちた! -> director (standby) の heartbeat が検知し、active に昇格
実際にわざと active な方の heartbeat を落としてみると、2秒程度で切り替わりました。
メンテナンス時
real server をメンテナンスなどで一時的に切り離したい場合は、以下のようにします。
director 上で、ipvsadm コマンドを使って weight を 0 に設定する方法。
# ipvsadm -e -t 192.168.0.10:http -r 192.168.0.7:http -w 0 # ipvsadm -e -t 192.168.0.10:https -r 192.168.0.7:https -w 0
復帰する場合は weight を 1 (など) に。
ldirectord に切り離してもらう方法。
ldirectord.cf に以下のように記述してある場合、
virtual=192.168.0.10:80 real=192.168.0.7:80 gate real=192.168.0.8:80 gate real=192.168.0.9:80 gate service=http request="ping.cgi" receive="ok" scheduler=rr #persistent=600 protocol=tcp checktype=negotiate
ldirectord は real server の /ping.cgi にリクエストを投げ、結果に ok という文字列が含まれれば正常、と判断します。
# ここで ping.cgi は、DB 接続して簡単なクエリを発行し、問題なければ ok という文字列を返すようにしています
ということで、わざと結果に ok が含まれないようにしてやることで、real server を切り離すことができます。
再起動を伴うような作業も、サービス全体としてはダウンタイム無しで行えるので (厳密には director の切り替え時のみ、数秒止まりますが)、精神的にも肉体的にも非常に気楽です。会社に泊まり込んで夜中にメンテしなくていいのが嬉しい。
安定性、負荷について
1日あたり最大 100万 page view の携帯サイトで 1年間運用しましたが、LVS が原因のトラブルはありません。
追加した server が突然死する (多分ハードウェアが原因) ことが数回あって、図らずも高可用性のありがたみを実感したりしましたが。
また、LVS 自体の負荷はほぼ 0 のようです。ldirectord がほんのちょっと CPU 使うようで
で 24時間動かして CPU 時間 35秒程度。Load Average で 0.05 ぐらい、他のマシンより上がるかな、という程度です。
もっと多数の real server を監視するとそれに応じて ldirectord の負荷は上がるでしょうけど、まあ数十台の real server を使うのであれば director は単独のマシンを割り当てられるでしょうから、問題ないかなと思います。