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で振り分けがされてます。