LVS + keepalivedで冗長構成のロードバランサを作る
前提
以下でやりました。
LB1/2
192.168.33.81
192.168.33.85
(VIP)192.168.33.253web1/web2
192.168.33.82
192.168.33.83client
192.168.33.84
DSRでやります。
手順
★LB1/2
# 二台とも同じようにやります
[vagrant@localhost ~]$ sudo yum install ipvsadm epel-release keepalived
[vagrant@localhost ~]$ ̧sudo vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
# このホストを識別する値。通知メールなどに載ってくる
router_id lvs01_alert
# メール通知設定
notification_email {
hoge@fuga.com
}
notification_email_from keepalived_alert@example.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
}
vrrp_instance VI_1 {
# 起動時はバック・アップに
state master
# vrrpはeth1で飛ばす
interface eth1
# LB冗長化時はそろえる
virtual_router_id 51
# マスター側を高く
priority 100
# 起動済みマスタがなければマスタに、いればスレーブ
nopreempt
# vrrpパケット間隔
advert_int 1
# VIP指定
# 注意:ここで指定した値は、ifconfigではみれないのでip a showする。
virtual_ipaddress {
192.168.33.253/24 dev eth1
}
}
# 「HOGE」という名前でLVSのグループ
virtual_server_group HOGE {
192.168.33.253 80
}
# HOGEグループの管理下リアルサーバの設定
virtual_server group HOGE {
# リアルサーバのヘルスチェック間隔(今回の場合HTTP GETしてる)
delay_loop 3
# 振り分けの方法(今回はラウンドロビンを指定)
lvs_sched rr
# 動作モード DSR or NAT
lvs_method DR
protocol TCP
# 振り分け先1
real_server 192.168.33.82 80 {
# 重み
weight 1
# 停止時に削除とせず、weightを落とす
inhibit_on_failure
# ヘルスチェックURL
HTTP_GET {
url {
# healthcheck.htmlとかのほうがいいかも
path /index.html
# 期待するステータスコード
status_code 200
}
connect_port 80
connect_timeout 3
}
}
# 振り分け先2
real_server 192.168.33.83 80 {
weight 1
inhibit_on_failure
HTTP_GET {
url {
path /index.html
status_code 200
}
connect_port 80
connect_timeout 3
}
}
# リアルサーバ全滅時の転送先
# sorry_server 192.xxxxxx 80
}
# ipvsadmを念のためクリア
[vagrant@localhost ~]$ sudo ipvsadm -C
[vagrant@localhost ~]$ sudo service keepalived start
# チェック
[vagrant@localhost ~]$ sudo ipvsadm -L
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.33.253:http rr
-> 192.168.33.82:http Route 1 0 0
-> 192.168.33.83:http Route 1 0 0
# 監視しておく
[vagrant@localhost ~]$ sudo tailf /var/log/message
★web1/2
[vagrant@localhost ~]$ sudo yum install httpd [vagrant@localhost ~]$ sudo iptables -F # VIPあてのアドレスがLBよりフォワードされるので、それをDNATしてWebサービスへ渡すよう設定 [vagrant@localhost ~]$ sudo iptables -t nat -A PREROUTING -p tcp -d 192.168.20.253 -j REDIRECT [vagrant@localhost ~]$ sudo service iptables save # healthcheck用ファイル [vagrant@localhost ~]$ vi /var/www/html/index.html web1 or web2 [vagrant@localhost ~]$ sudo service httpd start
★client
# VIPへルーティングできるようにしとく [vagrant@localhost ~]$ sudo route add -net 192.168.20.0/24 gw 192.168.33.81 eth1 # 監視 [vagrant@localhost ~]$ while : ; do curl 'http://192.168.20.253'; sleep 1; echo "---`date`"; done
★確認1:振り分け
# 別のサーバからcurlしてチェック→ラウンドロビンされてる!(乱数はボケーッと眺めてると更新かかってるか見づらいので目印なので、なくていいですw) [vagrant@localhost ~]$ while : ; do curl 'http://192.168.33.253'; sleep 1; echo "---`echo $RANDOM`"; done www1 ---12366 www2 ---9276 www1 ---22357 www2 ---23503 www1
★確認2:フェイルオーバー 片系を停止させると、、、
# 停止した側のログ Jun 10 14:11:17 localhost Keepalived[27106]: Stopping Keepalived v1.2.13 (03/19,2015) Jun 10 14:11:17 localhost Keepalived_vrrp[27109]: VRRP_Instance(VI_1) sending 0 priority Jun 10 14:11:17 localhost Keepalived_vrrp[27109]: VRRP_Instance(VI_1) removing protocol VIPs. Jun 10 14:11:17 localhost Keepalived_healthcheckers[27108]: Netlink reflector reports IP 192.168.33.253 removed Jun 10 14:11:17 localhost Keepalived_healthcheckers[27108]: Removing service [192.168.33.82]:80 from VS [HOGE]:0 Jun 10 14:11:17 localhost Keepalived_healthcheckers[27108]: Removing service [192.168.33.83]:80 from VS [HOGE]:0 Jun 10 14:11:17 localhost kernel: IPVS: __ip_vs_del_service: enter
# 切り替わり先のログ→Masterになってる Jun 10 14:29:32 localhost Keepalived_vrrp[3431]: VRRP_Instance(VI_1) Transition to MASTER STATE Jun 10 14:29:33 localhost Keepalived_vrrp[3431]: VRRP_Instance(VI_1) Entering MASTER STATE Jun 10 14:29:33 localhost Keepalived_vrrp[3431]: VRRP_Instance(VI_1) setting protocol VIPs. Jun 10 14:29:33 localhost Keepalived_vrrp[3431]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth1 for 192.168.33.253 Jun 10 14:29:33 localhost Keepalived_healthcheckers[3430]: Netlink reflector reports IP 192.168.33.253 added Jun 10 14:29:38 localhost Keepalived_vrrp[3431]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth1 for 192.168.33.253
エラーが起きることなく、スタンバイLBで振り分けがされてます。