CentOS 5.3 Linux版 簡易ロードバランサー

最近忙しくてネタになる物がなくて更新が滞っていました。
もう少しおもしろいネタがあるといいのですが。。。

そういえば前回書いたiPhone版のMystは大枚はたいて買いました。
感想は。。。そのまんま何も変わってなかったです。
ムービーの小ささもそのまま。HyperCard紙芝居の雰囲気もそのまま。
GTA-IVとかやっているゲーマーにはなんだかカルチャーショックなゲームかもしれません。
あくまでも骨董品を愛でるという気持ちが大事です。
さすがに長時間本気でプレイする気にはなりませんな。。。夢をありがとう?みたいな?
??

今回はテスト環境でロードバランサーが必要となり、CentOS5.3で構築してみました。
本来はロードバランサーも2重化するので、こんなに単純じゃないですが、
テスト用としてはこのくらいの動作があれば一応役に立ちます。

今回の環境
Client-->LoadBalancer--+--RealServer1
                        +--RealServer2

動作仕様

  1. ClientはLoadBalancerのIPへアクセスします。
  2. LoadBalancerはClientのリクエストをRealServer1か2へフォワードします。
  3. RealServerはLoadBalancer経由でClientへレスポンスを返します。

※今回の環境はIPマスカレードで常にLoadBalancerを通して通信します。<こういうテストだけが必要だったので、他の方法は使ってません。この方式はLoadBalancerの負荷が高くなります。

構成
O.SはCentOS5.3を利用します。
ロードバランスの管理は以下2つのソフトウェアで実施します。
単純な振り分け用
ipvsadm:IPVSの管理用で、単純にリクエストを振り分けルールを設定します。このルールは固定的で、このルール設定だけだと落ちているサーバーにも振り分けてしまいます。
振り分け先の監視と振り分けルールの動的生成用
heartbeat-ldirectord:実サーバーのステータスを監視し、IPVSの振り分けルールを動的に更新します。落ちているサーバーには振り分けません。

構築手順
インストール
yumで以下のソフトウェアをインストールします。
# yum -y install ipvsadm
# yum -y install heartbeat-ldirectord

設定
まずはip_fowardを有効にします。
/etc/sysctl.confの以下変更します。
net.ipv4.ip_forward = 1
変更後は以下のコマンド実行します。
# sysctl -p

ipvsadmだけの場合はipvsadmコマンドでIPVSのルールを作成保存するのですが、今回はldirectordに任せるのでldirectordの設定だけを行います。
この例ではロードバランサー(10.0.0.155:7357)への要求を実サーバー(172.16.39.129:7357と172.16.39.129:7357)へ振り分けます。
/usr/share/doc/heartbeat-ldirectord-2.1.3/ldirectord.cf
を/etc/ha.d/にコピーして以下の用に編集します。
checktypeは今回テストしているサービスはウエルノウンなものじゃないので、
デーモンがソケットをオープンしているかコネクトだけできるかだけ確認するためconnectとしています。
他のはサンプルがldirectord.cfに載っているので参照くだされ。

                                                                      • -

checktimeout=3
checkinterval=1
autoreload=no
logfile="/var/log/ldirectord.log"
quiescent=yes

# Sample for an http virtual service
virtual=10.0.0.155:7357
real=172.16.39.129:7357 masq
real=172.16.39.130:7357 masq
scheduler=rr
service=none
protocol=tcp
checkport=7357
checktype=connect

                                                                      • -

ldirecotrd.cfの設定が終わったら以下のコマンドを実行してldirectordを起動します。
※ldirectordサービスを起動すると/etc/ha.d/shellfuncsが無いと言われるので、とりあえず/etc/init.d/ldirectordの該当行をコメントアウトしておきます。shellfuncsを使うなら適切ない内容で作成しておきます。つーかファイルがあるかどうかくらい確認してから実行しないのもどうかと。。。
# chkconfig ldirectord on
# service ldirectord start

動作確認

ldirectorで設定されたIPVSが動作している様子をipvsadmコマンドで確認できます。
実サーバー172.16.39.129はデーモンが死んで監視失敗しているので、振り分けルールのWeightが[0]となっています。

                                                                      • -

# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.155:7357 rr
-> 172.16.39.129:7357 Masq 0 0 83
-> 172.16.39.130:7357 Masq 1 1 83

                                                                      • -