實做目的:某 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:用戶群 IP 與 Real Servers IP 為不同子網路。
VS/DR:用戶群與 Real Servers 為同一子網路。
VS/DR:用戶群與 Real Servers 為同一子網路,用戶與 Real Server 建立 Tunnel 通道。
三種架構比較表:
編註:就本文章僅以 VS/TUN 為實做參考。
作業系統環境說明:
IP 設定:
編註:所謂 VIP 就是多個應用系統之間實際對外服務的同一組共用IP。
= 負載均衡 – Load Balancing 設定 =
設定 Redirect Server:
#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 [email protected]
#upalert mail.alert [email protected]
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 [email protected]
#upalert mail.alert [email protected]
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 mon
Tips: 測試 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]
參考連結:
See Also: