タグ「ipvsadm」が付けられているもの

UbuntuでProxyサーバロードバランス(3)

これまで(UbuntuでProxyサーバロードバランス(1)UbuntuでProxyサーバロードバランス(2))構築したとおり、Ubuntu Server 12.04LTSを使ってロードバランサーを構築し、Proxyサーバの負荷分散、障害検知と自動での切り離し、組み込みを動作させるところまで構築しました。

残った問題である、ロードバランサーがダウンしたときに結局システムが止まってしまうという問題に対処するため、ロードバランサーをクラスタ構成してみようと思います。

クラスタ構成と言っても色々ありますが、今回はkeepalivedのVRRPをそのまま使ってロードバランサーをActive / Standby型のクラスタにしてしまいます。


LB-2.jpg

単純にロードバランサー2を追加します。そしてProxyサーバの仮想IPアドレス(192.168.100.10)をVRRPによるフローティングアドレスにしてしまいます。

UbuntuでProxyサーバロードバランス(2)

前回(UbuntuでProxyサーバロードバランス(1))Proxyサーバに対するアクセスが負荷分散される状態まで構築をしましたが、Proxyサーバがダウンしたときにそれを検知して切り離す機能が無いため、ダウンしたProxyサーバにアクセスしようとし続けてしまいます。

そこで、Keepalivedを組み込んで、L4レベルでの死活監視を行わせます。

具体的にはProxyサーバのTCPポート / 8080がOpenしている状態を定期的に確認して、ポートがClose状態、または無反応になったら、そのサーバへの振り分けは行わないようにします。


UbuntuでProxyサーバロードバランス(1)

PROXYサーバをLinuxのLVS(ipvsadm)を使って冗長構成にする事を考えました。
LVSは既に使っている(RedHat Enterprise LinuxでWebサーバロードバランス)のですが、ここではWebサーバのバランシングではなく、Proxyサーバのバランシングを行います。
また、前回の検証時はRedHat Enterprise Linux ES3を使って検証を行っていましたが、今回はUbuntu Server 12.04LTSを使います。ipvsadmがディストリビューションに含まれているため、それにあわせてファイルの配置が変更になります。検証機も実機ではなくESXi上に立てることにします。
今回も目的はProxyサーバの耐障害性の向上で、負荷分散を目的とはしていませんが、構築の順序としては負荷分散機能(ipvsadm)→耐障害機能(keepalived)となります。


LB.jpg

※Proxyサーバの仮想IPアドレスは192.168.100.10にする

論理的にはロードバランサーがクライアントからの要求をすべて受けて、2台のProxyサーバに振り分ける構成になるため、図のようにロードバランサーの配下にProxyサーバ2台がぶら下がる構成になります。
物理的には同一セグメントでフラットに接続されている構成になります。
ロードバランサーの構成をNATにしてしまうと、ProxyサーバのアクセスログにクライアントのIPアドレスではなく、ロードバランサーのIPアドレスが記録されてしまう弊害がおきるため、構成はDSRにします。この構成の大きなメリットが2つあり、1つ目がソースIPアドレス(クライアントのIPアドレス)がそのままサーバに伝わることと、戻りパケットの処理にロードバランサーが介在しないことで、ロードバランサー自身の負荷が少なくなる事です。 デメリットはリアルサーバ側に若干細工が必要になることですが、今回はPROXYサーバも自前のため、デメリットになりません。

Proxyサーバの待ち受けポートは8080を使用しています。


Keepalivedもやってみよー!! ってことで

1−1.OpenSSL0.9.8eのインストール
# ./configure ; make
# sudo make install
1−2.keepalivedのインストール
# CPPFLAGS='-I /usr/local/ssl/include' ./configure \
--with-kernel-dir=/usr/src/linux-2.4.21-32.EL \
--disable-lvs-syncd
# make
# sudo make install
1−3.keepalived.confの作成
# vi /usr/local/etc/keepalived/keepalived.conf
virtual_server 192.168.1.100 80 {
delay_loop 3
lvs_sched wrr
lvs_method DR
protocol TCP
real_server 192.168.1.7 80 {
weight 1
inhibit_on_failure
TCP_CHECK {
connect_port 80
connect_timeout 1
}
}
real_server 192.168.1.8 80 {
weight 1
inhibit_on_failure
TCP_CHECK {
connect_port 80
connect_timeout 1
}
}
}

virtual_server 192.168.1.101 80 {
delay_loop 3
lvs_sched wrr
lvs_method DR
protocol TCP
real_server 192.168.1.7 80 {
weight 1
inhibit_on_failure
TCP_CHECK {
connect_port 80
connect_timeout 1
}
}
real_server 192.168.1.8 80 {
weight 1
inhibit_on_failure
TCP_CHECK {
connect_port 80
connect_timeout 1
}
}
}
1−4.ipvsadmのテーブルクリア
# ipvsadm -C
1−5.keepalivedの起動
# keepalived -e /usr/local/etc/keepalived/keepalived.conf
1−6.確認
# ipvsadm
IP Virtual Server version 1.0.8 (size=65536)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.100:http wrr
-> 192.168.1.8:http Route 0 0 0
-> 192.168.1.7:http Route 1 0 0
TCP 192.168.1.101:http wrr
-> 192.168.1.8:http Route 0 0 0
-> 192.168.1.7:http Route 1 0 0

取りあえず、ちゃんと動いてるっぽい。。
Weight=0のサーバは本当に電源Offになってる奴。

LinuxのLVS。高性能っぽいので、
今更ながら、しょぼい機械を集めてテストしてみました。


マシン
lb:ロードバランサー役
  Pentium4 3GHz/Mem 1GB/OS RedHatEnterpriseLinux ES3 Update5
w1:WWWサーバ1役
  Pentium3 667MHz/Mem 512MB/OS RedHatEnterpriseLinux ES4
w2:WWWサーバ2役
  Pentium3 800MHz/Mem 384MB/OS RedHatEnterpriseLinux ES4


条件
WWWサーバはVirtualHostで2つのサイトを持ちます。
アクセス制限の関係とか色々あって、2つのサイトはIPベースでの
バーチャルホストです。


IPアドレス
実アドレス
lb ... 192.168.1.4/24
w1 ... 192.168.1.7/24
w2 ... 192.168.1.8/24

仮想アドレス
Web Site1 ... 192.168.1.100
Web Site2 ... 192.168.1.101

ロードバランスの方式
分散は何も考えずにラウンドロビンで行う。
アクセスログを残したいのと、高速性がほしいのでDSRで行う。

用意するもの
ipvsadmコマンド ここからダウンロードできます。

1.ロードバランサーの準備

1−1.rpmでipvsadmをインストールします。
# rpm -ivh ipvsadm-1.21-1.rh.el.1.i386.rpm
1−2.仮想IPアドレス用のインターフェースを設定します。
# vi /etc/sysconfig/network-scripts/ifcfg-eth0:0
DEVICE=eth0:0
BOOTPROTO=static
BROADCAST=192.168.1.255
IPADDR=192.168.1.100
NETMASK=255.255.255.0
NETWORK=192.168.1.0
ONBOOT=yes
TYPE=Ethernet
#
# vi /etc/sysconfig/network-scripts/ifcfg-eth0:1
DEVICE=eth0:1
BOOTPROTO=static
BROADCAST=192.168.1.255
IPADDR=192.168.1.101
NETMASK=255.255.255.0
NETWORK=192.168.1.0
ONBOOT=yes
TYPE=Ethernet
#
# /etc/init.d/network restart
1−2.IPv4フォワードを有効にします。
# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
#
# sysctl -p
1−3.カーネルにip_vsモジュールを読ませます
# cd /lib/modules/2.4.21-32.ELsmp/kernel/net/ipv4/ipvs
# insmod ip_vs
# insmod ip_vs_rr
# insmod ip_vs_lc
# insmod ip_vs_wrr
# insmod ip_vs_wlc
# insmod ip_vs_lblc
# insmod ip_vs_lblcr
# insmod ip_vs_sh
# insmod ip_vs_ftp
# insmod ip_vs_dh
1−4.ipvsadmに仮想サイトを教え込みます。
# ipvsadm -A -t 192.168.1.100:80 -s rr
# ipvsadm -A -t 192.168.1.101:80 -s rr
1−5.ipvsadmに実WWWサーバを教え込みます。
# ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.7 -g
# ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.8 -g
# ipvsadm -a -t 192.168.1.101:80 -r 192.168.1.7 -g
# ipvsadm -a -t 192.168.1.102:80 -r 192.168.1.8 -g
1−6.ipvsadmの設定値をファイルに記録します。
# service ipvsadm save
1−7.ipvsadmを起動します。
# service ipvsadm start
1−8.ipvsadmを自動起動に設定します。
# chkconfig ipvsadm on


2.WWWサーバの準備

2−1.ループバックインターフェースに仮想IPを仕込みます。
# vi /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.1.100
NETMASK=255.255.255.255
NETWORK=192.168.1.100
BROADCAST=192.168.1.100
ONBOOT=yes
NAME=loopback:0
#
# vi /etc/sysconfig/network-scripts/ifcfg-lo:1
DEVICE=lo:1
IPADDR=192.168.1.101
NETMASK=255.255.255.255
NETWORK=192.168.1.101
BROADCAST=192.168.1.101
ONBOOT=yes
NAME=loopback:0
#
# /etc/init.d/network restart
コツはネットワークアドレス、ブロードキャストアドレスと
IPアドレスに同じ値を入れることと
サブネットマスクが255.255.255.255な事です。
デフォルトゲートウェイは/etc/sysconfig/networkではなく
ifcfg-eth0のなかに書きましょう
GATEWAY=192.168.1.254
2−2.arp応答をしないようにします。
# vi /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.eth0.arp_announce = 2
#
# sysctl -p

2−3.WWWサーバをVirtualHostで構築します。
(省略)

基本的にはこれだけで負荷分散されたWWWサイトが構築出来ます。
簡単ですね。