目的:
1. 用 ipvsadm 作負載平衡
2. 加上
heartbeat-ldirectord 作監控,監控那一台主機掛了剃除服務,ok的就加入服務

 

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 – 也就是 lvs server ,負載控管,分流服務至實體主機

1. 安裝 ipvsadm

apt-get install ipvsadm

# 版本是 ipvsadm v1.24 2003/06/07 (compiled with popt and IPVS v1.2.0)

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. 新增 vip

ifconfig eth0:99 192.168.1.99 netmask 255.255.255.255 broadcast 192.168.1.99

4. 讓封包可以 forward

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

5. 建立 LVS

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 -Ln

7。顯示連線狀況 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  – 代表連線狀態只是首次連線

8。儲存目前 ipvsadm 設定於檔案中

ipvsadm-save > /etc/sysconfig/ipvsadm

倒回設定檔    

ipvsadm-restore < /etc/sysconfig/ipvsadm

9。ipvsadm 有個啟動檔也就是 /etc/init.d/ipvsadm,它預設會去讀取設定檔 /etc/sysconfig/ipvsadm,或 /etc/ipvsadm.rules

      所以可以建立開機時啟動 chkconfig ipvsadm on

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. 設定 vip

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. 設定 forward

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

接下來在 192.168.1.13 及 192.168.1.100 建立 web 服務,

http://192.168.1.13/index.html 及 http://192.168.1.100/index.html 個別看到 host 13 及 host 100

測試連 http://192.168.1.99/ 就會看到網頁不停的變化了。

以上的 ipvsadm 設定並不能讓服務完全不中斷,如果一台實體主機掛了,當瀏覽網站時一定會看不到服務,

這時就需要搭配 heartbeat-ldirectord 來監控主機的服務正不正常,不正常就剃除這台主機,等正常了再加入這台主機

1. 安裝

yum install heartbeat heartbeat-ldirectord

2. 編輯 /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                            

              # 測試網頁的目錄檔案名稱。
              # 附註: 當apache 設定了virtual host時,注意request 定義的檔該放的地方
              request = "lvs.html"                

 

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

 

              emailalert = "cross@ssorc.tw"

3. 使用 heartbeat-ldirectord,此後便可不用靠 /etc/init.d/ipvsadm 來啟動 lvs 服務

 

4. Debug 模式,(不會記錄到/var/log/ldirectord.log)

ldirectord -d start

5. 服務啟動及開機時啟動設定,記得把ipvsadm 的開機時啟動關閉,如果你有設定的話

service ldirectord start

chkconfig ipvsadm off

chkconfig ldirectord on

Q&A1

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

Q&A2

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

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

Q&A3

Can't locate Mail/Send.pm in @INC

安裝 Mail::Send

 

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

 

參考:
http://zh.linuxvirtualserver.org/node/171

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

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

Related posts 相關文章
HAProxy 實現 load balance 負載平衡
More...
MySQL HA 高可用性,MySQL Cluster 叢集
More...
MySQL HA 高可用性,DRBD 與 Heartbeat
More...
MySQL HA 高可用性,建立兩台 master,並用 MySQL-MMM 工具自動切換
More...

作者

留言

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。