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 ipvsadmkeepalived を以下のように設定します。
- スケジューリングアルゴリズム: rr (round-robin)
- ヘルスチェック種別: HTTP_GET
- ヘルスチェックページ: /index.html
- ヘルスチェックの条件: ステータスコードが200
- ヘルスチェックのタイムアウト: 5秒
# 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.61WEBサーバのネットワーク関連の状態は以下のとおり。赤字はコマンド
# 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"