網站負載均衡(Load Balance)及備援(HA)機制實做

本文介绍如何运用Linux LVS技术实现网站应用系统的负载均衡与高可用性。通过设置两台Real Server与一台Redirect Server,采用VS/TUN模式进行网络配置,并详细记录了安装步骤与注意事项。
摘要由CSDN通过智能技术生成

網站負載均衡(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:

  1. 下載及安裝套件 ipvsadm-1.24-6.src.rpm,可以前往 http://rpm.pbone.net/  搜尋下載點,安裝方法直接用這指令
    #rpmbuild –rebuild ipvsadm-1.24-6.src.rpm
  2. 新增虛擬網路介面 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
  3. 建立 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]
  4. 啟動 ipvsadm
    #service ipvsadm start
  5. 檢查LVS狀態
    #ipvsadm -l
  6. 開機自動執行
    #chkconfig ipvsadm on
  7. 為了使其中的 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
    esac

    exit 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:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值