Pound+keepalivedでHTTPロードバランス&冗長化
VIP:192.168.10.200 VIP (Client接続先)
SV1:192.168.10.201 Pound Master
SV2:192.168.10.202 Pound Backup
HTTP1:192.168.10.211 Apache
HTTP2:192.168.10.212 Apache
上記のようにVIPでClientからの接続を受けます。
MasterになっているPoundからHTTP1、HTTP2へロードバランスをします。
keepalivedが停止する。もしくはローカルのPound経由のHTTPチェックに失敗すると
keepalivedがBackupに切り替わります。Masterが復旧すると処理がMasterに
切り替わります。
※HTTP監視は5秒サイクルで設定例として記述してありますが、
サーバ負荷に気をつけながら運用上の最適化が必要です。
インターバルが長ければ長いほど障害時のMaster切り替え時間に影響します。
※MasterもBackupもHTTPコネクト出来ないとVIPが停止してしまいます。
この状態は重度の障害という事でここに記述してある自動化では
対処しないで手動で対処するという考えでの設定例になっています。
SV1 /etc/pound/pound.cfg
pound設定ファイル
User "nobody"
Group "nobody"
RootJail "/usr/share/pound"
Control "/var/run/pound/ctl_socket"
Daemon 1
Alive 15
# Main listening ports
ListenHTTP
Address 0.0.0.0
Port 80
xHTTP 1
Client 300
TimeOut 310
End
ListenHTTPS
Address 0.0.0.0
Port 443
Cert "/etc/pki/pound/pound.pem"
Ciphers "ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL"
xHTTP 1
End
# Catch-all server(s)
Service
BackEnd
Address 192.168.10.211
Port 80
End
BackEnd
Address 192.168.10.212
Port 80
End
Session
Type Cookie
ID "JSESSIONID"
TTL 1800
End
EndSV1 /etc/keepalived/keepalived.conf
keepalived設定ファイル
※メール通知を省略してます。
! Configuration File for keepalived
global_defs {
notification_email {
}
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass passworddayo
}
virtual_ipaddress {
192.168.10.200
}
notify_master "/etc/keepalived/checkStart.sh"
notify_backup "/etc/keepalived/checkStart.sh"
}SV1 /etc/keepalived/checkStart.sh
keepalived 動作時Pound正常動作監視起動シェル
#!/bin/sh
CHECK_SHELL=/etc/keepalived/check.sh
#チェック用シェルが起動されていたらkillする
CHEK_SHELL_PS=`ps -ef | grep $CHECK_SHELL | grep -v grep`
if [ -n "$CHEK_SHELL_PS" ] ; then
for PID in `echo $CHEK_SHELL_PS | awk '{print $2}'` ; do
echo "kill -9 $PID"
kill -9 $PID
done
fi
$CHECK_SHELL &
exitSV1 /etc/keepalived/check.sh
keepalived 動作時Pound正常動作監視シェル
自分自身のPound経由でHTTP出来ない場合、keepalivedを停止してVRRP切替発動
#!/bin/sh
#監視開始直後のチェック無視時間
sleep 5
#チェックIP
CHECK_IP=192.168.10.201
#チェックPATH
CHECK_PATH=/index.html
#チェックURL
CHECK_URL=http://$CHECK_IP$CHECK_PATH
#STOPフラグ
STOP_FLAG=0
#STOPフラグしきい値
STOP_FLAG_LIMIT=5
while true ; do
#監視インターバル
sleep 5
CODE=`/usr/bin/curl -s --head $CHECK_URL | head -n 1 | cut -f 2 -d ' '`
if [ "$CODE" != "200" ] ; then
STOP_FLAG=`expr $STOP_FLAG + 1`
else
STOP_FLAG=0
fi
if [ "$STOP_FLAG" = "$STOP_FLAG_LIMIT" ] ; then
echo "stop keepalived"
/etc/rc.d/init.d/keepalived stop
exit
fi
done
SV2 /etc/pound/pound.cfg
pound設定ファイル
User "nobody"
Group "nobody"
RootJail "/usr/share/pound"
Control "/var/run/pound/ctl_socket"
Daemon 1
Alive 15
# Main listening ports
ListenHTTP
Address 0.0.0.0
Port 80
xHTTP 1
Client 300
TimeOut 310
End
ListenHTTPS
Address 0.0.0.0
Port 443
Cert "/etc/pki/pound/pound.pem"
Ciphers "ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL"
xHTTP 1
End
# Catch-all server(s)
Service
BackEnd
Address 192.168.10.211
Port 80
End
BackEnd
Address 192.168.10.212
Port 80
End
Session
Type Cookie
ID "JSESSIONID"
TTL 1800
End
EndSV2 /etc/keepalived/keepalived.conf
keepalived設定ファイル
※メール通知を省略してます。
! Configuration File for keepalived
global_defs {
notification_email {
}
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass passworddayo
}
virtual_ipaddress {
192.168.10.200
}
notify_master "/etc/keepalived/checkStart.sh"
notify_backup "/etc/keepalived/checkStart.sh"
}SV2 /etc/keepalived/checkStart.sh
keepalived 動作時Pound正常動作監視起動シェル
#!/bin/sh
CHECK_SHELL=/etc/keepalived/check.sh
#チェック用シェルが起動されていたらkillする
CHEK_SHELL_PS=`ps -ef | grep $CHECK_SHELL | grep -v grep`
if [ -n "$CHEK_SHELL_PS" ] ; then
for PID in `echo $CHEK_SHELL_PS | awk '{print $2}'` ; do
"echo kill $PID"
kill -9 $PID
done
fi
$CHECK_SHELL &
exitSV2 /etc/keepalived/check.sh
keepalived 動作時Pound正常動作監視シェル
Pound経由で5回HTTP通信に失敗した場合にkeepalivedを停止してVRRP切替発動
#!/bin/sh
#監視開始直後のチェック無視時間
sleep 5
#チェックIP
CHECK_IP=192.168.10.202
#チェックPATH
CHECK_PATH=/index.html
#チェックURL
CHECK_URL=http://$CHECK_IP$CHECK_PATH
#STOPフラグ
STOP_FLAG=0
#STOPフラグしきい値
STOP_FLAG_LIMIT=5
while true ; do
#監視インターバル
sleep 5
CODE=`/usr/bin/curl -s --head $CHECK_URL | head -n 1 | cut -f 2 -d ' '`
if [ "$CODE" != "200" ] ; then
STOP_FLAG=`expr $STOP_FLAG + 1`
else
STOP_FLAG=0
fi
if [ "$STOP_FLAG" = "$STOP_FLAG_LIMIT" ] ; then
echo "stop keepalived"
/etc/rc.d/init.d/keepalived stop
exit
fi
done
※Pound経由でのバックエンドのApacheへのアクセスは
X-Forwarded-ForヘッダのIPアドレスにクライアントのIPアドレスが格納され、
通常のIPアドレスはPoundのサーバのIPになるのでログやIPチェックのロジックで
注意が必要です。