カメニッキ

カメとインコと釣りの人です

LVS + keepalivedで冗長構成のロードバランサを作る

前提

以下でやりました。

  • LB1/2
    192.168.33.81
    192.168.33.85
    (VIP)192.168.33.253

  • web1/web2
    192.168.33.82
    192.168.33.83

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