UbuntuでProxyサーバロードバランス(2)

前回(UbuntuでProxyサーバロードバランス(1))Proxyサーバに対するアクセスが負荷分散される状態まで構築をしましたが、Proxyサーバがダウンしたときにそれを検知して切り離す機能が無いため、ダウンしたProxyサーバにアクセスしようとし続けてしまいます。

そこで、Keepalivedを組み込んで、L4レベルでの死活監視を行わせます。

具体的にはProxyサーバのTCPポート / 8080がOpenしている状態を定期的に確認して、ポートがClose状態、または無反応になったら、そのサーバへの振り分けは行わないようにします。



ロードバランサーの設定

keepalivedのパッケージをインストール
$ sudo apt-get install keepalived

keepalivedの設定ファイルを作成
※サンプルファイルは/usr/share/doc/keepalived/samplesにあります。ここでは新規作成します
$ sudo vi /etc/keepalived/keepalived.conf global_defs { notification_email { postmaster } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 # SMTPサーバを指定します smtp_connect_timeout 30 router_id LVS_DEVEL } virtual_server 192.168.100.10 8080 { # VS IP/PORT declaration delay_loop 3 # 死活監視は3秒間隔 lb_algo lc # ロードバランスの方式は最小コネクション数(LC) lb_kind DR # ロードバランサの動作はDSR protocol TCP real_server 192.168.100.11 8080 { # RS declaration weight 1 # weight to use (default: 1) inhibit_on_failure # Set weight to 0 on healtchecker TCP_CHECK { # TCP healthchecker connect_port 8080 # TCP port to connect connect_timeout 2 # Timeout connection } } real_server 192.168.100.12 8080 { # RS declaration weight 1 # weight to use (default: 1) inhibit_on_failure # Set weight to 0 on healtchecker TCP_CHECK { # TCP healthchecker connect_port 8080 # TCP port to connect connect_timeout 2 # Timeout connection } } }

keepalivedに設定を反映
$ sudo service keepalived restart


動作確認
ここまでの設定でProxyサーバの片方がダウンしたときにそれを負荷分散の対象から切り離す動作が行われるようになったはずです。

ロードバランサーで動作をモニタしながら、Proxyサーバを落としてみます。

ロードバランサで動作をモニタする
$ watch -n1 sudo ipvsadm -Ln Every 1.0s: sudo ipvsadm -Ln Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.100.10:8080 lc -> 192.168.100.11:8080 Route 1 1 0 -> 192.168.100.12:8080 Route 1 0 0
※ Weightの値が両方とも1になっていることと、負荷に応じてActiveConnが上がることを確認します


Proxyサーバ(Squid)を落とす
$ sudo service squid stop

ロードバランサでProxyのダウンを検知したことを確認する
Every 1.0s: sudo ipvsadm -Ln Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.100.10:8080 lc -> 192.168.100.11:8080 Route 0 0 1 -> 192.168.100.12:8080 Route 1 1 1
※ ダウンさせた側のProxyサーバのWeightが0になったことと、負荷を与えてもActiveConnが上がらないことを確認します


Proxyサーバ(Squid)を再起動する
$ sudo service squid start

ロードバランサでProxyの復旧を検知したことを確認する
Every 1.0s: sudo ipvsadm -Ln Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.100.10:8080 lc -> 192.168.100.11:8080 Route 1 2 0 -> 192.168.100.12:8080 Route 1 1 1
※ Weightの値が両方とも1になっていることと、負荷に応じてActiveConnが上がることを確認します


当初の目的である、Proxyサーバの耐障害性の確保(ダウンしたときに片系で運用を続ける)が出来ました。
この構成で問題になることは、Proxyサーバに変わってロードバランサーがSPOF(単一障害点)になってしまったことです。副産物としてProxyサーバが両系共に動作している場合はProxyサーバの負荷分散が行われるため、システム全体では性能向上が得られるというメリットはありますが。