網站負載均衡(Load Balance)及備援(HA)機制實做
實做目的:某 EDA 應用系統為純 Web Application Service ,擬運用 Linux LVS(Linux Virtual Server) 叢集技術使該系統改善其負載效率及高可利用性(Load Balancing and High Availability)。
系統需求:
Real Server x 2 - 生產用的 EDA Application 系統,需兩部以上機器互相備援及平衡負載,且作業平台均為 Linux,為避免多部主機的資料不同步,此專案較適用於 3 tier 架構的Web應用系統,簡言之,不同部主機間使用同一個資料庫,若資料格式為檔案類型亦可採用 NFS 檔案系統解決。
Redirect Server x1 – 用以分派Real Server負載工作及使其相互備援的監控主機,其作業平台為 Linux。
網路架構圖如下:
編註: 由於整體架構 Redirect Server 對用戶的實際使用,扮演一個入口服務的主機,故其角色極為重要,建立者可視實際狀況為其多設一個 Backup 主機,以避免單一 Redirect Server 故障造成整體系統失效。
但在此案例,我們只就一台 Redirect Server 的架構實做。
選擇適用您的實際網路架構的模式:依據用戶群與 Real Servers 之間的實際網路佈署而定,區分三種模式。
- VS/NAT
- VS/DR
- VS/TUN
VS/NAT:用戶群 IP 與 Real Servers IP 為不同子網路。
VS/DR:用戶群與 Real Servers 為同一子網路。
VS/DR:用戶群與 Real Servers 為同一子網路,用戶與 Real Server 建立 Tunnel 通道。
三種架構比較表:
編註:就本文章僅以 VS/TUN 為實做參考。
作業系統環境說明:
- Real Server #1,RedHat Linux Advance Server 3/網路卡 x1,除原有的應用系統,不需特別安裝軟體。
- Real Server #2,RedHat Linux Advance Server 3/網路卡 x1,除原有的應用系統,不需特別安裝軟體。
- Redirect Server,CentOS Linux 4.5/網路卡 x1,主要軟體 ipvsadm/mon。
IP 設定:
- Real Server #1,eth0 = 192.168.0.216,tun1 = 192.168.0.218(VIP)。
- Real Server #2,eth0 = 192.168.0.217,tun1 = 192.168.0.218(VIP)。
- Redirect Server,eth0 = 192.168.0.215,eth0:1 = 192.168.0.218(VIP)。
編註:所謂 VIP 就是多個應用系統之間實際對外服務的同一組共用IP。
= 負載均衡 – Load Balancing 設定 =
設定 Redirect Server:
- 下載及安裝套件 ipvsadm-1.24-6.src.rpm,可以前往 http://rpm.pbone.net/ 搜尋下載點,安裝方法直接用這指令
#rpmbuild –rebuild ipvsadm-1.24-6.src.rpm - 新增虛擬網路介面 eth0:1
#vi /etc/sysconfig/network-scripts/ifcfg-eth0:1
[codes=c]DEVICE=eth0:1
BOOTPROTO=static
IPADDR=192.168.0.218
NETMASK=255.255.0.0
ONBOOT=yes
TYPE=Ethernet[/codes]
#ifconfig eth0:1 up - 建立 ipvsadm 初始啟動程序
#vi /etc/sysconfig/ipvsadm
[codes=c]ipvsadm -A -t 192.168.0.218:80 -s rr
ipvsadm -a -t 192.168.0.218:80 -r 192.168.0.216:80 -g -w 1
ipvsadm -a -t 192.168.0.218:80 -r 192.168.0.217:80 -g -w 1[/codes] - 啟動 ipvsadm
#service ipvsadm start - 檢查LVS狀態
#ipvsadm -l - 開機自動執行
#chkconfig ipvsadm on - 為了使其中的 Real Server Down 時可自動變更 ipvsadm 的規則, 在安裝一隻程式(mon)用來監控 real server 的存活狀態。
#wget ftp://ftp.kernel.org/pub/software/admin/mon/mon-0.99.2.tar.gz
請自行搜尋以下的 Perl Module
perl-Mon-0.11-2.2.el4.rf.noarch.rpm
fping-2.4-1.b2.2.el4.rf.i386.rpm
perl-Convert-BER-1.31.01-1.2.el4.rf.noarch.rpm
perl-Net-Telnet-3.03-1.2.el4.rf.noarch.rpm
perl-Time-HiRes-1.55-3.i386.rpm
perl-Time-Period-1.20-2.el4.rf.noarch.rpm#tar -xzf mon-0.99.2.tar.gz
#cd mon-0.99.2
#mkdir /etc/mon
#cp auth.cf mon.cf /etc/mon
#mkdir /usr/lib/mon
#cp -r alert.d mon.d state.d mon /usr/lib/mon
#mkdir /usr/lib/mon/log.d
#vi /etc/mon/auth.cf[codes=c]disable: root
dump: root
enable: root
get: root
loadstate: root
reset: root
savestate: root
set: root
start: root
stop: root
term: root[/codes]#vi /etc/mon/mon.cf
[codes=c]cfbasedir = /etc/mon
alertdir = /usr/lib/mon/alert.d
mondir = /usr/lib/mon/mon.d
hostgroup r1 192.168.0.216
hostgroup r2 192.168.0.217
watch r1
service http
interval 10s
monitor http.monitor
allow_empty_group
period wd {Sun-Sat}
#alert mail.alert your@mail.address
#upalert mail.alert your@mail.address
alert lvs.alert -P tcp -V 192.168.0.218:80 -R 192.168.0.216 -F tun -W 1
upalert lvs.alert -P tcp -V 192.168.0.218:80 -R 192.168.0.216 -F tun -W 1 -u#
# For real server 1
#
watch r2
service http
interval 10s
monitor http_t.monitor
allow_empty_group
period wd {Sun-Sat}
#alert mail.alert your@mail.address
#upalert mail.alert your@mail.address
alert lvs.alert -P tcp -V 192.168.0.218:80 -R 192.168.0.217 -F tun -W 1
upalert lvs.alert -P tcp -V 192.168.0.218:80 -R 192.168.0.217 -F tun -W 1 -u[/codes]#vi /usr/lib/mon/alert.d/lvs.alert
<coolcode lang="perl"> #!/usr/bin/perl
#
# lvs.alert – Linux Virtual Server alert for mon
#
# It can be activated by mon to remove a real server when the
# service is down, or add the server when the service is up.
#
#
use Getopt::Std;
getopts ("s:g:h:t:l:P:V:R:W:F:u");$ipvsadm = "/sbin/ipvsadm";
$protocol = $opt_P;
$virtual_service = $opt_V;
$remote = $opt_R;if ($opt_u) {
$weight = $opt_W;
if ($opt_F eq "nat") {
$forwarding = "-m";
} elsif ($opt_F eq "tun") {
$forwarding = "-i";
} else {
$forwarding = "-g";
}if ($protocol eq "tcp") {
system("$ipvsadm -a -t $virtual_service -r $remote -w $weight $forwarding");
} else {
system("$ipvsadm -a -u $virtual_service -r $remote -w $weight $forwarding");
}
} else {
if ($protocol eq "tcp") {
system("$ipvsadm -d -t $virtual_service -r $remote");
} else {
system("$ipvsadm -d -u $virtual_service -r $remote");
}
};
</coolcode>#vi /etc/init.d/mon
[codes=c]#!/bin/sh
#
# start/stop the mon server
#
# You probably want to set the path to include
# nothing but local filesystems.
#
# chkconfig: 2345 99 10
# description: mon system monitoring daemon
# processname: mon
# config: /etc/mon/mon.cf
# pidfile: /var/run/mon.pid
#
PATH=/bin:/usr/bin:/sbin:/usr/sbin
export PATH# Source function library.
. /etc/rc.d/init.d/functions# See how we were called.
case "$1" in
start)
echo -n "Starting mon daemon: "
daemon /usr/lib/mon/mon -f -l -c /etc/mon/mon.cf
echo
touch /var/lock/subsys/mon
;;
stop)
echo -n "Stopping mon daemon: "
killproc mon
echo
rm -f /var/lock/subsys/mon
;;
status)
status mon
;;
restart)
killall -HUP mon
;;
*)
echo "Usage: mon {start|stop|status|restart}"
exit 1
esacexit 0
[/codes]#service mon start
#netstat -lt | grep monTips: 測試 mon 時,可嘗試關閉一台 real server,在Redirect server 執行 ipvsadm -l 檢查是否會自動刪除該主機的規則; 反之在復機時,是否會自動新增規則。
設定 Real Server #1&2:
1. 由於在 Real Server 都使用一張網卡綁定兩個不同 IP,使得在使用 VS/DR 及 VS/TUN 這兩個模式時會遭遇到 ARP 問題,無法達到 HA & Load Balancing的實際效果。
因此我們需關閉網路裝置的 ARP 回應,但自 kernel 2.2.14 以後版本已無法對 eth 裝置使用 NO ARP FLAG,搜尋網路的相關文章後,若使用 kernel 2.6.x 以後版本可以改用 ip_ignore 方式,如此篇文說明 。
而我們用的版本需透過 kernel 的編譯,才能有這樣的功能; 但經過幾次嘗試都不成功,於是我們改用另一個模組安裝的方法。
a. 下載安裝檔 http://www.masarlabs.com/noarp/
#wget http://www.masarlabs.com/download/noarp-1.2.4.tar.gz
b. 建立 kernel-source 的連結
#cd /usr/src
#cp -a linux-2.4.21-37.EL linux-2.4.21-37.EL.noarp
#ln -s linux-2.4.21-37.EL.noarp linux
c.進行編譯及安裝
#cd noarp-1.2.4
#./configure
#make
#make install
#depmod -a
2. 新增一個 script 用以啟動所需的系統/網路環境
[codes=c]#!/bin/bash
#
#———- lvs-tun for realserver ——————
#
line="—————————-"
VIP="192.168.0.218"
RIP="192.168.0.216"
DIP="192.168.0.215"
#showing routing table
/bin/netstat -rn
echo $line
#set_realserver_ip_forwarding to OFF (1 on, 0 off).
echo "0" > /proc/sys/net/ipv4/ip_forward
cat /proc/sys/net/ipv4/ip_forward
echo $line
#looking for DIP 192.168.0.215
ping -c 1 $DIP
echo $line
#looking for VIP (will be on director)
ping -c 1 $VIP
echo $line
# noarp modules
/sbin/modprobe noarp
/usr/local/sbin/noarpctl add $VIP $RIP
echo "Loaded noarp module:"
lsmod | grep noarp
echo
echo "noarp list:"
/usr/local/sbin/noarpctl list
echo $line
#set VIP on realserver
/sbin/ifconfig tunl0 $VIP broadcast $VIP netmask 255.255.255.255 up
echo $line
#ifconfig output
/sbin/ifconfig tunl0
echo $line
#set route for VIP on device
/sbin/route add -host $VIP dev tunl0
echo $line
#listing routing info for VIP
/bin/netstat -rn
echo $line
#hiding ARP request
#arptables -A IN -d $VIP -j DROP
#arptables -A OUT -o tunl0 -d $VIP -j mangle –mangle-ip-s $VIP
#arptables -A OUT -o eth0 -d $VIP -j mangle –mangle-ip-s $RIP
# if you have eth1 connect to network
#arptables -A OUT -o eth1 -d $VIP -j mangle –mangle-ip-s $RIP
# listing the rules of arptables
#arptables -L
#
echo $line
#———- EOF ——————
[/codes]
參考連結:
- http://www.linuxaid.com.cn/articles/3/1/316956730.shtml
- http://blog.chinaunix.net/u/24390/showart_270197.html
- http://www.linux-vs.org/Documents.html
- http://zh.linuxvirtualserver.org/node/95
- http://forum.eviloctal.com/read.php?tid=19544
- ftp://ftp.kernel.org/pub/software/admin/mon/
- http://phorum.study-area.org/viewtopic.php?t=17352&highlight=lvs
- http://zh.linuxvirtualserver.org/node/439
- http://www.adj.idv.tw/server/linux_lvs.php
- http://www.linuxforum.net/forum/gshowflat.php?Cat=&Board=cluster&Number=296498&page=0&view=collapsed&sb=5&o=all&fpart=
- http://www.redhat.com/docs/manuals/csgfs/browse/rh-cs-en/ch-lvs-setup.html
- http://www.chinaunix.net/jh/4/813853.html
- http://blog.chinaunix.net/u/24390/showart_212260.html
- http://www.linuxvirtualserver.org/docs/ha/heartbeat_mon.html
- http://www.cublog.cn/u/25142/showart.php?id=293454
- http://www-128.ibm.com/developerworks/cn/linux/theme/special/index.html#cluster
- http://www.masarlabs.com/noarp/
See Also: