読者です 読者をやめる 読者になる 読者になる

LVS + Ultra Monkey で負荷分散 (運用編)

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 は単独のマシンを割り当てられるでしょうから、問題ないかなと思います。