ipvsadm & heartbeat-ldirectord

用 ipvsadm 作負載平衡,加上 heartbeat-ldirectord 的監控

ipvsadm for load balance

                                                vip=192.168.1.99 (eth0:99)
                                       DR        rip=192.168.1.12 (eth0)
                                        / \
                                      /    \
                                    /        \
                                 RS1     RS2

vip=192.168.1.99 (lo:99)        vip=192.168.1.99 (lo:99)
    rip=192.168.1.13 (eth0)          rip=192.168.1.100 (eth0)

DR server
1.
apt-get install ipvsadm

2.
ifconfig eth0 192.168.1.12 netmask 255.255.255.0 broadcast 192.168.1.255
route add -net 192.168.1.0 dev eth0

3.
ifconfig eth0:99 192.168.1.99 netmask 255.255.255.255 broadcast 192.168.1.99

4.
echo 1 > /proc/sys/net/ipv4/ip_forward

5.
ipvsadm -A -t 192.168.1.99:80 -s rr
ipvsadm -a -t 192.168.1.99:80 -r 192.168.1.13 -g
ipvsadm -a -t 192.168.1.99:80 -r 192.168.1.100 -g

或者根據權重
ipvsadm -A -t 192.168.1.99:80 -s wrr
ipvsadm -a -t 192.168.1.99:80 -r 192.168.1.13 -g -w 6
ipvsadm -a -t 192.168.1.99:80 -r 192.168.1.100 -g -w 3

參數說明

    -w     # 為 weighted,權重分別為6與3,則連線p分配為1,1,2,1,1,2
    -g     # 為 LVS/DR,其它 -i 為 LVS/TUN,-m 為 LVS/NAT
    -t      # 為 tcp
    -u     # 為 udp
    -s     # 為 scheduling method
    -A     # 為增加一 virtual service
    -a     # 為增加一 virtual server  

6. 儲存目前設定於檔案中     
ipvsadm-save > /etc/sysconfig/ipvsadm   

倒回設定檔   
ipvsadm-restore < /etc/sysconfig/ipvsadm     

7. 預設會去讀取/etc/sysconfig/ipvsadm,或/etc/ipvsadm.rules設定檔
service ipvsadm start
                                    
8.
chkconfig –level 3 ipvsadm on

9. 測式,執行ipvsadm來觀看連線數

顯示目前設定狀況
ipvsadm -Ln

顯示連線狀況

ipvsadm -Lcn

    IP Virtual Server version 1.2.0 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
         -> RemoteAddress:Port                   Forward Weight ActiveConn InActConn
    TCP 210.17.16.72:http wrr
         -> 210.17.16.68:http                       Route     2          3                  539
         -> 210.17.16.65:http                       Route     1          6                  248

名詞說明

Forward     – 代表是那一種 LVS,Route為LVS/DR,Masq為LVS/NAT,Tunnel為LVS/TUN
ActiveConn – 代表連線狀態為established
InActConn  – 代表連線狀態只是首次連線

RealServer 1 & 2
1.
ifconfig eth0 192.168.1.13 netmask 255.255.255.0 broadcast 192.168.1.255
route add -host 192.168.1.0 dev eth0

2.
ifconfig lo:99 192.168.1.99 netmask 255.255.255.255 broadcast 192.168.1.99
route add -host 192.168.1.99 dev lo:99

3.
echo 1 > /proc/sys/net/ipv4/ip_forward

4.

忽略ARP封包,使realserver不要回應ARP查詢封包
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

heartbeat-ldirectord

監控服務

1.
install heartbeat-ldirectord
                              
2.
vi /etc/ha.d/ldirectord.cf

    # 當DR收不到realserver的回應,設定幾秒後判定realserver當機 或掛掉了,預設5秒。

    checktimeout = 5

    # 時間間隔,幾秒偵測一次realserver,預設10秒 。
    checkinterval = 10

    logfile = “/var/log/ldirectord.log”         

    # 或設成

    #logfile=”local0″

     

    # 當設定檔內容已變動,ldirectord自動 reload設定

    autoreload = yes

     

    # 當兩台Real Server 都掛的話,此設定會啟動讓連線連到local(即lvs server)的網頁

    fallback=127.0.0.1:80

     

    # 當設定為no時,如果其中一Real Server掛掉,ipvsadm table會移除它,而非weight設為0

    quiescent=yes

    virtual = 192.168.1.99:80
                  protocol = tcp
                  scheduler = wrr
                  real = 192.168.1.13:80 gate 2
                  real = 192.168.1.100:80 gate 1

     

                  # negotiate 表示使用協商的方式check,也就是
                  # ldirectord會送出一個要求,然後realserver回
                  # 應特定字串,才表是正常。
                  # connect表示ldirectord只要能夠連線至realserver
                  # 即代表正常,預設為negotiate。
                  checktype = negotiate              

                  # 設定checktype為negotiate時,必需讓ldirectord
                  # 知道service是什麼協定,才能用什麼協定進行協商
                  # 但如果在前面的real項目設定有設定port,此時便
                  # 可以不設定此項目了。

                  service = http                           

                  # 測試網頁的目錄檔案名稱。
                  request = “lvs.html”               

     

                  # 測試網頁內容。
                  receive = “This is a LVS Page”

     

                  emailalert = “cross@ssorc.idv.tw”

3.
使用heartbeat-ldirectord,此後便可不用再手動使用ipvsadm來設定

Debug 模式,便不會記錄到/var/log/ldirectord.log

ldirectord -d start

service ldirectord start

chkconfig ipvsadm off

chkconfig ldirectord on

附註: 當apache設定了virtual host時,注意request定義的檔該放的地方

[Q&A]

一開始沒有作用,可能原因一,domain與ip對映

[Q&A]

iptables -A INPUT -p tcp –dport 80 –syn -m state –state -NEW -j ACCEPT

–syn設定可能會造成lvs無法連線

[Q.] Can’t locate Mail/Send.pm in @INC

[A.] 安裝 Mail::Send

LVS + session

每一連線時的session,同時運作在lvs的環境下,會有一問題產生,一User登入web,但session並未同存在另一real server 上,造成等於未登入的狀況。

此時利用ipvsadm的persistent參數,讓同一來源處於都是連到同一台real server。

到這新的問題產生,同一來源一直連到同一台real server,就算此real server掛點,ipvsadm把weight改變為0後,session還是停留在此掛點的real server,為了解決這情況,
利用quescent = no,讓ipvsadm判別此real server掛點,就把此real server從table中拿掉,這時後User之後的連線就會跑到有working的real server

vi /etc/ha.d/ldirectord.cf

    quiescent = no

    virtual = 192.168.1.99:80

                  persistent = 300

ipvsadm –Ln –persistent-conn

ref: [url]http://zh.linuxvirtualserver.org/node/171[/url]

[url]http://phorum.study-area.org/viewtopic.php?t=17352&highlight=lvs[/url]

[url]http://tech.ccidnet.com/art/737/20031112/70945_3.html[/url]

[url]http://ssorc.tw/index.php?load=read&id=205[/url]

Tell others about me!

Leave a Reply

Your email address will not be published. Required fields are marked *