mosakabe @ ウィキ
ロードバランサを構築する
最終更新:
mosakabe
-
view
どーしてもUbuntuでのロードバランサの構築がうまくいかなかったので、CentOS5で構築します。
Webサーバの冗長化、そして、ロードバランサそのものの冗長化を行います。
(Xenサーバで。)
(Xenサーバで。)
ロードバランサ1 lb01.totto.local 192.168.11.101
ロードバランサ2 lb02.totto.local 192.168.11.102
VIP 192.168.11.110
Webサーバ1 192.168.11.103 web01.totto.local
Webサーバ1 192.168.11.104 web02.totto.local
ロードバランサ2 lb02.totto.local 192.168.11.102
VIP 192.168.11.110
Webサーバ1 192.168.11.103 web01.totto.local
Webサーバ1 192.168.11.104 web02.totto.local
※Webサーバは当然ですが、ロードバランササーバのファイアウォールの設定にも気をつけてください。
(当然80ポートが解放されていなければなりません。)
(当然80ポートが解放されていなければなりません。)
以下、すべて root での作業です。
まずは1台目のロードバランサ lb01.totto.local から設定してきます。
IPVSバージョンの確認
kernel 2.6.10で、IPVSが1.2.0から1.2.1に変わりました。
なのでまず、OSのカーネルバージョンを調べます。
なのでまず、OSのカーネルバージョンを調べます。
# uname -r 2.6.18-274.el5xen
2.6.10以上であることがわかります。
次に、カーネルモジュールをロードしてIPVSのバージョンを調べます。
次に、カーネルモジュールをロードしてIPVSのバージョンを調べます。
# modprobe ip_vs_rr # cat /proc/net/ip_vs IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn
IPVSのバージョンが1.2.1であることがわかります。
ipvsadmのインストール(失敗編)
インストールします。
# yum install ipvsadm
バージョンを確認します。
# ipvsadm -v ipvsadm v1.24 2003/06/07 (compiled with popt and IPVS v1.2.0)
1.2.0 でバージョンが異なることがわかります。
仕方ないので、アンインストールします。
# yum remove ipvsadm
ipvsadmのインストール(成功編)
ipvsadm1.2.1をダウンロードしてソースからビルドします。
# wget http://www.linux-vs.org/software/kernel-2.6/ipvsadm-1.24.tar.gz
# tar zxf ipvsadm-1.24.tar.gz # cd ipvsadm-1.24 # make
エラーになりました。
コンパイラがカーネルソースを見つけられないためにエラーが発生しているようです。
コンパイラがカーネルソースを見つけられないためにエラーが発生しているようです。
カーネルのソースコードインストールします。
# wget ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.gz
# tar zxf linux-2.6.18.tar.gz
# mv linux-2.6.18 /usr/src/kernels/
カーネルのソースコードにシンボリックリンクをはります。
# ln -s /usr/src/kernels/linux-2.6.18 /usr/src/linux
戻って、再度makeします。
# make
# make install
バージョンを確認します。
# ipvsadm -v ipvsadm v1.24 2005/12/10 (compiled with getopt_long and IPVS v1.2.1)
一致しました。
hearbeatとheartbeat-ldirectordをインストール
heartbeatは、VIPを作り、2台のLVSサーバ間で冗長化します。
# sudo yum install heartbeat
※上記のコマンドはバグにより1回目が失敗することがあるそうです。2回実行してください。
※さらにインストール後にIPVSのバージョンを確認してください。。
※さらにインストール後にIPVSのバージョンを確認してください。。
# ipvsadm -v
変わってしまっていたら再度ipvsadmをインストールしてください。
heartbeat-ldirectordは、実サーバの監視を行い、内部でipvsadmを使って自動的に負荷分散対象サーバの追加や削除をします。
# yum install heartbeat-ldirectord
heartbeatの設定をします
/etc/ha.d/ha.cf を設定します。
このファイルはlb01とlb02で少し異なります。
このファイルはlb01とlb02で少し異なります。
logfile /var/log/ha-log keepalive 2 deadtime 30 warntime 10 initdead 120 udpport 694 ucast eth0 192.168.11.102 auto_failback on node lb01.totto.local node lb02.totto.local ping 192.168.11.101 respawn hacluster /usr/lib64/heartbeat/ipfail apiauth ipfail gid=haclient uid=hacluster uuidfrom nodename
あとの2つの設定は同じです。
/etc/ha.d/haresources を設定します。
lb01.totto.local IPaddr::192.168.11.110/24/eth0
/etc/ha.d/authkeys を設定します。
auth 1 1 crc
パーミッションを600にします。
# chmod 0600 /etc/ha.d/authkeys
UDP 694開放
/etc/sysconfig/iptables に以下の1行を適当なところに追加します。
-A RH-Firewall-1-INPUT -p udp -m udp --dport 694 -j ACCEPT
# /etc/init.d/iptables restart # /sbin/iptables -L
以下の1行が追加されていることを確認してください。
ACCEPT udp -- anywhere anywhere udp dpt:ha-cluster
heartbeat起動
自動起動はトラブルの元なのでここではoffにします。
# chkconfig heartbeat off # service heartbeat start logd is already running Starting High-Availability services: 2011/11/04_23:58:24 INFO: Resource is stopped [ OK ]
これで1台目の設定が完了しました。
/var/log/ha-log のファイルにログが出力されます。
/var/log/ha-log のファイルにログが出力されます。
起動直後はまだVIPが設定されていません。
# ifconfig eth0 Link encap:Ethernet HWaddr D6:88:C1:F9:9D:69 inet addr:192.168.11.101 Bcast:192.168.11.255 Mask:255.255.255.0 inet6 addr: fe80::d488:c1ff:fef9:9d69/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:138265 errors:0 dropped:0 overruns:0 frame:0 TX packets:44712 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:178840683 (170.5 MiB) TX bytes:4139796 (3.9 MiB) 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:77 errors:0 dropped:0 overruns:0 frame:0 TX packets:77 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:10119 (9.8 KiB) TX bytes:10119 (9.8 KiB)
/etc/ha.d/ha.cf の initdead 120 で指定したとおり、120秒後に設定されます。
(ロードバランサ2の起動を120秒待ちますが、当然まだセットアップしていないので応答がなくロードバランサ1が起動します)
(ロードバランサ2の起動を120秒待ちますが、当然まだセットアップしていないので応答がなくロードバランサ1が起動します)
# ifconfig eth0 Link encap:Ethernet HWaddr D6:88:C1:F9:9D:69 inet addr:192.168.11.101 Bcast:192.168.11.255 Mask:255.255.255.0 inet6 addr: fe80::d488:c1ff:fef9:9d69/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:139072 errors:0 dropped:0 overruns:0 frame:0 TX packets:45817 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:178917821 (170.6 MiB) TX bytes:4264429 (4.0 MiB)
eth0:0 Link encap:Ethernet HWaddr D6:88:C1:F9:9D:69 inet addr:192.168.11.110 Bcast:192.168.11.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 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:789 errors:0 dropped:0 overruns:0 frame:0 TX packets:789 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:121634 (118.7 KiB) TX bytes:121634 (118.7 KiB)
一度、heartbeat を落とします。
# service heartbeat stop
VIPがなくなっていると思います。
ここから、2台目のロードバランサの設定をします。
基本的には1台目と同じですが、
/etc/ha.d/ha.cf の ucast eth0 192.168.11.101 だけ異なります。
(お互いを監視させます。)
基本的には1台目と同じですが、
/etc/ha.d/ha.cf の ucast eth0 192.168.11.101 だけ異なります。
(お互いを監視させます。)
logfile /var/log/ha-log keepalive 2 deadtime 30 warntime 10 initdead 120 udpport 694 ucast eth0 192.168.11.101 auto_failback on node lb01.totto.local node lb02.totto.local ping 192.168.11.101 respawn hacluster /usr/lib64/heartbeat/ipfail apiauth ipfail gid=haclient uid=hacluster uuidfrom nodename
heartbeatの起動前までロードバランサ1と同じように設定します。
ロードバランサの起動と切り替えテスト
ロードバランサ1とロードバランサ2を起動し、連携がとれているか確認します。
それぞれのサーバの /var/log/ha-log を確認しているとわかりやすいとおもいます。
それぞれのサーバの /var/log/ha-log を確認しているとわかりやすいとおもいます。
ロードバランサ1でhearbeatを起動します。
# service heartbeat start
120秒以内にロードバランサ2でhearbeatを起動します。
# service heartbeat start
それぞれのサーバで ifconfig でVIPを確認してください。
ロードバランサ1で先ほどより比較的はやくVIPが設定されていることが確認できると思います。
ロードバランサ2ではVIPが設定されていないことが確認できると思います。
ロードバランサ1で先ほどより比較的はやくVIPが設定されていることが確認できると思います。
ロードバランサ2ではVIPが設定されていないことが確認できると思います。
ここで、ロードバランサ1のheartbeatを落としてみます。
(サーバをシャットダウンしてみてもいいかもしれません)
(サーバをシャットダウンしてみてもいいかもしれません)
# service heartbeat stop
するとすぐにロードバランサ1のVIPが削除され、ロードバランサ2にVIPが設定されていることがわかります。
サイドロードバランサ1のheartbeatを起動すると、元に戻ると思います。
これでロードバランサの冗長化ができました。
サイドロードバランサ1のheartbeatを起動すると、元に戻ると思います。
これでロードバランサの冗長化ができました。
ldirectord の設定
以下共にロードバランサ1,2での作業です。
先ほど設定した/etc/ha.d/haresources を修正します。
lb01.totto.local IPaddr::192.168.11.110/24/eth0 ldirectord
/etc/ha.d/ldirectord.cf を設定します。
checktimeout=10 checkinterval=30 autoreload=yes logfile="/var/log/ldirectord.log" virtual=192.168.11.110:80 real=192.168.11.103:80 gate real=192.168.11.104:80 gate #fallback=192.168.11.100:80 gate checktype=negotiate protocol=tcp service=http request="status.html" receive="OK" virtualhost="web.totto.local" scheduler=rr #persistent=1 netmask=255.255.255.255
Webサーバでの設定
両方のWebサーバで同じ作業をします。
当然、apacheが上がっていることを確認してください。
Webサーバでは、VIPをループバックlo0に設定します。
また同じVIPを複数のWebサーバで共有するため、このVIPに関するARPを投げたり受けたりしないようにします。
また同じVIPを複数のWebサーバで共有するため、このVIPに関するARPを投げたり受けたりしないようにします。
/etc/sysctl.conf に以下の設定を追加します。
net.ipv4.conf.eth0.arp_ignore = 1 net.ipv4.conf.eth0.arp_announce = 2
設定を反映します。
# sysctl -p
次に、lo:0にVIPを設定します。
/etc/sysconfig/network-scripts/ifcfg-lo:0 を作成します。
/etc/sysconfig/network-scripts/ifcfg-lo:0 を作成します。
DEVICE=lo:0 BOOTPROTO=none ONBOOT=yes IPADDR=192.168.11.110 NETMASK=255.255.255.255
WebサーバがDebian系であれば、/etc/network/interfaces に、
auto lo:0 iface lo:0 inet static address 192.168.11.110 netmask 255.255.255.255
のような感じ。
バランシング確認
Webサーバのapache、ロードバランササーバのheartbeatを起動し、動作を確認します。
ラウンドロビンに設定したので、
http://192.168.11.110 にアクセスすると、2つのWebサーバに交互にアクセスされることがわかります。
ラウンドロビンに設定したので、
http://192.168.11.110 にアクセスすると、2つのWebサーバに交互にアクセスされることがわかります。
Webサーバ1を落としてみると、Webサーバ2にのみアクセスが行くことがわかります。
以下広告