[CentOS6][IPVS+Keepalived] 異なるサブネットでWEBサーバの負荷分散(NAT)


Create: 2012/10/24
LastUpdate: 2012/10/27

異なるサブネットにあるWEBサーバの負荷分散を行うロードバランサを構築します。
構築イメージは下図のとおり。
クライアントから http://10.34.195.70/ にアクセスすると、WEBサーバ#1、WEBサーバ#2 に負荷分散します。
クライアントとWEBサーバは、サブネットが違うので、お互いに直接アクセスすることはできませんが、Keepalived のルーティング方式をNATにして、ロードバランサ経由でアクセスできるようにします。
LVSで実現するロードバランサ - KLablabWiki」が参考になります。


1.仮想マシンの用意


ロードバランサ1台とWEBサーバ2台を XenServer6.02 の仮想マシンで用意します。
ロードバランサにはNICを2つ持たせます。
仮想マシンには、 こちら の手順で最小構成の CentOS6.0 をインストールしたあと、CentOS6.3 に yum で update しました。
この時点でのサーバの状態は以下のとおり。
  • OS: CentOS6.3
  • 導入パッケージ: 最小構成
  • デフォルト言語: ja_JP.UTF-8
  • タイムゾーン: Asia/Tokyo
  • SELinux: 無効
  • ファイヤーウォール: iptables 停止、ip6tables 停止

2.ロードバランサの構築


epel レポジトリ から keepalived と ipvsadm をインストールします。 ipvsadm は、IPVSを制御するためのツールです。
# yum --enablerepo=epel install keepalived ipvsadm 
keepalived を以下のように設定します。
  • スケジューリングアルゴリズム: rr (round-robin)
  • ヘルスチェック種別: HTTP_GET
  • ヘルスチェックページ: /index.html
  • ヘルスチェックの条件: ステータスコードが200
  • ヘルスチェックのタイムアウト: 5秒
設定ファイル(/etc/keepalived/keepalived.conf)の内容は以下のとり。
# vi /etc/keepalived/keepalived.conf
! IPVS

virtual_server_group WEB_GROUP1 {
  10.34.195.70 80
}

virtual_server group WEB_GROUP1 {
  delay_loop   3
  lvs_sched    rr
  lvs_method   NAT
  protocol     TCP
  virtualhost  example.org

  real_server 192.168.1.81 80 {
    weight 1
    inhibit_on_failure
    HTTP_GET {
      url {
        path /index.html
        status_code 200
      }
    }
    connect_port    80
    connect_timeout 5
  }

  real_server 192.168.1.82 80 {
    weight 1
    inhibit_on_failure
    HTTP_GET {
      url {
        path /index.html
        status_code 200
      }
    }
    connect_port    80
    connect_timeout 5
  }
}
設定ファイルの各パラメータの意味については、以下のページが参考になります。
KeepAlived の設定ファイルに記載した仮想IP(10.34.195.70)をeth0にIPエイリアスします。今回は動作確認したいだけなので、一時的な設定をしています。再起動しても設定が消えないようにしたければ ここ を参考にしてください。
# ifconfig eth0:0 192.168.1.70
ロードバランサがパケットを転送できるようにカーネルパラメータを変更します。今回は動作確認できればいいので、ここでは、一時的な変更としています。再起動すると変更内容は消えます。再起動しても変更内容が消えないようにしたい場合は /etc/sysctl.conf を修正します。
echo '1' > /proc/sys/net/ipv4/ip_forward
ロードバランサのネットワーク関連の状態は以下のとおり。赤字はコマンド。
# ifconfig -a
eth0      Link encap:Ethernet  HWaddr 46:C2:09:46:6D:DC
          inet addr:10.34.195.61  Bcast:10.34.195.255  Mask:255.255.255.0
          inet6 addr: fe80::44c2:9ff:fe46:6ddc/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:344 errors:0 dropped:0 overruns:0 frame:0
          TX packets:180 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:31394 (30.6 KiB)  TX bytes:22818 (22.2 KiB)
          Interrupt:24

eth0:0    Link encap:Ethernet  HWaddr 46:C2:09:46:6D:DC
          inet addr:10.34.195.70  Bcast:10.255.255.255  Mask:255.0.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:24

eth1      Link encap:Ethernet  HWaddr FA:36:FE:51:34:DD
          inet addr:192.168.1.61  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: 2001:c90:8023:a9d1:f836:feff:fe51:34dd/64 Scope:Global
          inet6 addr: fe80::f836:feff:fe51:34dd/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:20769 errors:0 dropped:0 overruns:0 frame:0
          TX packets:20548 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:3208687 (3.0 MiB)  TX bytes:1709978 (1.6 MiB)
          Interrupt:23

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:7 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:420 (420.0 b)  TX bytes:420 (420.0 b)


# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0     *               255.255.255.0   U     0      0        0 eth1
10.34.195.0     *               255.255.255.0   U     0      0        0 eth0
link-local      *               255.255.0.0     U     1002   0        0 eth0
link-local      *               255.255.0.0     U     1003   0        0 eth1
default         192.168.1.1     0.0.0.0         UG    0      0        0 eth1
# service iptables status
iptables: ファイアウォールが稼働していません。
# sysctl -a | grep ipv4.ip_
net.ipv4.ip_default_ttl = 64
net.ipv4.ip_no_pmtu_disc = 0
net.ipv4.ip_nonlocal_bind = 0
net.ipv4.ip_dynaddr = 0
net.ipv4.ip_local_port_range = 32768    61000
net.ipv4.ip_local_reserved_ports =
net.ipv4.ip_forward = 1 

3.WEBサーバの構築


以下、WEBサーバ2台を同じように構築します。
ます、Apache をインストールします。
# yum install httpd 
動作確認とヘルスチェックを兼ねたページを作成します。動作確認でどちらのWEBサーバで動いたかわかるように、WEBサーバ#1 と WEBサーバ#2 ではページの内容を変えます。
# cat /var/www/html/index.html
<html>
<head>
 <title>WEB#1 - TOP PAGE</title>
</head>
<body>
 <h1>WEB#1 - Top Page</h1>
</body>
</html>
Apache を起動します。
# service httpd start
デフォルトゲートウェイをロードバランサに変更して、パケットをロードバランサに返すようにします。今回は、動作確認したいだけなので、一時的に変更します。再起動しても変更が消えないようにしたい場合は、/etc/sysconfig/network などを変更します。
以下のようにして、古い設定を削除して、新しい設定を登録します。
# route del default gw 192.168.1.1
# route add default gw 192.168.1.61
WEBサーバのネットワーク関連の状態は以下のとおり。赤字はコマンド
# ifconfig -a
eth0      Link encap:Ethernet  HWaddr 46:A5:F7:B9:DE:06
          inet addr:192.168.1.81  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: 2001:c90:8023:a9d1:44a5:f7ff:feb9:de06/64 Scope:Global
          inet6 addr: fe80::44a5:f7ff:feb9:de06/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:17537 errors:0 dropped:0 overruns:0 frame:0
          TX packets:10335 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:2074171 (1.9 MiB)  TX bytes:1556681 (1.4 MiB)
          Interrupt:247

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0     *               255.255.255.0   U     0      0        0 eth0
link-local      *               255.255.0.0     U     1002   0        0 eth0
default         192.168.1.61    0.0.0.0         UG    0      0        0 eth0
# service iptables status
iptables: ファイアウォールが稼働していません。

4.動作確認


WEBサーバでApacheが起動していることを確認したら、ロードバランサで Keepalived を起動します。
# service keepalived start 
ロードバランサで ipvsadm コマンドを実行して、仮想サーバテーブルにエントリが追加されているか確認します。
# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.34.195.70:80 rr
  -> 192.168.1.81:80              Masq    1      0          0
  -> 192.168.1.82:80              Masq    1      0          0
クライアントからブラウザで http://10.34.195.70/ にアクセスします。
再表示ボタンをクリックすると下図のページが交互に表示され負荷分散を確認できます。
ちにみに、ここではIE6を使用して確認していますが、IE6以外のブラウザで、毎回、"favicon.ico" をGETするタイプのブラウザは、ページが切り替わりません。再表示するたびに2回リクエストし、WEBサーバ#1から "index.html" をGETし、WEBサーバ#2から "favicon.ico" をGETするからです。




WEBサーバ#1のログを見ると、以下のとおり。"KeepAliveClient"は、ロードバランサのヘルスチェックです。クライアントからのアクセスには、クライアントのIPアドレスが記録され、ロードバランサからのアクセスは、仮想IPではなく実IPが記録されています。
192.168.1.61 - - [24/Oct/2012:15:31:01 +0900] "GET /index.html HTTP/1.0" 200 105 "-" "KeepAliveClient"
192.168.1.61 - - [24/Oct/2012:15:31:07 +0900] "GET /index.html HTTP/1.0" 200 105 "-" "KeepAliveClient"
10.34.195.10 - - [24/Oct/2012:15:31:11 +0900] "GET / HTTP/1.1" 200 105 "-" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"
10.34.195.10 - - [24/Oct/2012:15:31:12 +0900] "GET / HTTP/1.1" 200 105 "-" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"
192.168.1.61 - - [24/Oct/2012:15:31:13 +0900] "GET /index.html HTTP/1.0" 200 105 "-" "KeepAliveClient"
192.168.1.61 - - [24/Oct/2012:15:31:19 +0900] "GET /index.html HTTP/1.0" 200 105 "-" "KeepAliveClient"