1. 程式人生 > >利用Linux架構負載均衡(Load balancer)系統(一)

利用Linux架構負載均衡(Load balancer)系統(一)

引言:
Linux在網路方面具有很強大的功能。可以用Linux架構Firewall(防火牆), IDS(入侵檢測),Cache&Proxy,大型的mail 系統,
甚至高階的路由器等,無所不能。本文介紹Linux在負載均衡方面的應用和具體的實現。本文的前半部分主要是一些理論的說明及所用
元件的簡要介紹,後半部分是具體的實現,包括軟體的安裝、配置和啟動。本文的內容是本人實驗得來的,難免有疏漏,請各位諒解!


本文的目標:
本文的目標是實現一個由兩臺Linux Load balancer(LLB)和三臺web伺服器組成一個web伺服器群,這個伺服器群對使用者來說就好象
是一臺伺服器。LLB對三臺web伺服器進行負載均衡。並且當web伺服器出現故障時LLB會自動將出現故障的web伺服器從伺服器群中剔除,
當web伺服器的故障修復後LLB會自動將web伺服器加入到伺服器群中來。其中兩臺LLB一臺為主(Master LLB),一臺為附(Slave LLB),
當Master LLB出現故障以後,Slave LLB會自動接管Master LLB的所有工作。系統結構如圖所示。

client
________|__________
| |
| |
Master LLB Slave LLB
| |
|_________________|
|
HUB
____________|_______________
| | |
| | |
webserver1 webserver2 webserver3

理論的說明及所用元件的簡要介紹:
我們這裡的所實現的負載均衡是以www.linuxvirtualserver.org專案的ipvsadm為原型,配合以其他的一些開源軟體來實現的。
在這裡,我們需要四個元件:
· ipchains
· ipvsadm, (http://www.linuxvirtualserver.org)
· keepalived, (http://keepalived.sourceforge.net)
· heartbeat , (http://www.linux-ha.org)

ipchains
ipchains是Linux下很有名的Firewall軟體,ipchains在Linux的核心中對進出Linux的資料進行控制,包括資料包的過濾和偽裝等。
在Linux的核心中有三條標準控制資料包去向的鏈:input , forward , output 。input是對進入Linux的資料包進行控制,forward是
對路由的資料包進行控制,output是對出Linux的資料包進行控制。網上有不少關於ipchains的文章,在Linux的2.4.0版本的核心中用
的是iptable。在我們的這個方案中ipchains的作用是將使用者的請求資料交給ipvsadm來處理,並由ipvsadm決定使用者的請求資料最終由
哪臺web伺服器來相應。大家也可參考IPCHAINS-HOWTO。在此不多說。

ipvsadm(www.linuxvirtualserver.org)
ipvsadm是由中國的年輕黑客維護的,他是從ipportfw發展而來的。ipvsadm是在Linux的核心中實現的,他在Linux的核心中監測需
要路由的IP資料包,ipvsadm根據使用者設定的條件對資料包進行相應的操作。瞭解ipchains的使用者知道,在Linux的核心中有三條控制數
據包去向的鏈:input , forward , output,ipvsadm是在forward的過程中對資料包進行操作的。ipvsadm的作用是為使用者選擇合適的
web伺服器。LLB在選擇伺服器時有四種不同的規則,這四種規則用於選擇哪臺伺服器處理使用者的請求。這四種規則是:Round-Robin (RR)、
Weighted Round-Robin (WRR)、 Least-Connection (LC)、 Weighted Least-Connection (WLC)。這四種規則各有自己的適應環境。


Round-Robin:

如果您的LLB選用的是這種演算法,她會將資料包均勻的分發給各臺伺服器,他把所有的伺服器放在相等的地位上,而不會實際的去考
慮各臺伺服器的差異,如響應時間、session數等!例如您有ABC三臺伺服器,那麼LLB分發資料包的順序是......ABCABCABC.....
Round-Robin演算法的好處是簡單、佔用系統資源少,缺點是無法檢測哪臺伺服器有更高的響應速度、更少的連線,所以他非常適合服
務器效能相當的環境。


Weighted Round-Robin
這種規則適用於使用者擴充套件系統時,因為這是叢集中的伺服器的效能會有較大的差別,為每一個伺服器定義一個引數是必要的。
這是一種帶引數的Round-Robin的演算法,引數的名字叫Weighed。您可以根據您的伺服器的處理能力來為每一臺伺服器分配一個
Weighted值,值越高其優先程度越高,預設值是1。例如:你有三臺伺服器,分別為A:486、B:奔騰、C:奔騰2,你可以為他們分配
Weighted值為:1、2、3,則按照Weighted Round-Robin的演算法處理資料包的伺服器的順序是:CCCBBBA
Round-Robin可以說是Weighted Round-Robin的一種特殊情況,既所有的伺服器有相同的Weighted值。


Least-Connection

這是一種動態演算法,LLB將根據每臺伺服器當前的連線數目來轉發資料包,具有最少連線的伺服器將處理下一個請求。這一種演算法能很好
的分配各種流量,對於突發的請求或大量的請求能夠做出比較平滑的處理,不會產生將請求的資料發往同一臺伺服器的情況。


Weighted Least-Connection

這種演算法是Least-Connection Scheduling的一種擴充套件,她為每一臺伺服器分配一個weighted值,然後根據這個值和每臺伺服器當前狀態
下的連線數來決定由誰來處理使用者的請求。可以舉一個例子來說明她的工作原理:
假設有n臺伺服器,每一臺伺服器的weighted值為Wi ( i=1,2. . . n) ,session為Ci (i=1,...n), ALL-CONNECTIONS 是所有伺服器
的session和,既C1+C2+....+Cn.,那麼按照下面的演算法,伺服器j將處理下一個請求:
( Cj/ALL-CONNECTIONS )/Wj=min { (Ci/ALL-CONNECTIONS)/Wi } ( i=1,..,n)

也可以簡化為:
Cj/Wj = min { Ci/Wi } (i=1,..,n)



我們可以對這四種演算法做一個比較,Round-Robin和Weighted Round-Robin是靜態的方法,對於伺服器的當前狀態不能做出很好的估計,
因此資料的分配並不是最合理。
但在伺服器的效能相當時Round-Robin卻是最好的選擇。Least-Connection 和Weighted Least-Connection是動態的方法,可以對伺服器
的當前狀態做出比較合理的估計,這樣在平衡各臺伺服器時,可以做出比較優化的選擇。


Keepalived
keepalived是一個類似於layer3, 4 & 5交換機制的軟體,也就是我們平時說的第3層、第4層和第5層交換。Keepalived的作用是檢測web
伺服器的狀態,如果有一臺web伺服器宕機,或工作出現故障,Keepalived將檢測到,並將有故障的web伺服器從系統中剔除,當web伺服器
工作正常後Keepalived自動將web伺服器加入到伺服器群中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的web
伺服器。

Layer3,4&5工作在IP/TCP協議棧的IP層,TCP層,及應用層,原理分別如下:

Layer3:Keepalived使用Layer3的方式工作式時,Keepalived會定期向伺服器群中的伺服器傳送一個ICMP的資料包
(既我們平時用的Ping程式),如果發現某臺服務的IP地址沒有啟用,Keepalived便報告這臺伺服器失效,並將它從伺服器群中剔除,
這種情況的典型例子是某臺伺服器被非法關機。Layer3的方式是以伺服器的IP地址是否有效作為伺服器工作正常與否的標準。在本文中
將採用這種方式。

Layer4:如果您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP埠的狀態來決定伺服器工作正常與否。如web server的服務
埠一般是80,如果Keepalived檢測到80埠沒有啟動,則Keepalived將把這臺伺服器從伺服器群中剔除。

Layer5:Layer5就是工作在具體的應用層了,比Layer3,Layer4要複雜一點,在網路上佔用的頻寬也要大一些。Keepalived將根據使用者的
設定檢查伺服器程式的執行是否正常,如果與使用者的設定不相符,則Keepalived將把伺服器從伺服器群中剔除。


Heartbeat
heartbeat在前面我們簡要的說明了一下,兩臺LLB可以互為備份,這個工作就是由heartbeat來完成的。Heartbeat的中文是
“心跳檢測”。Slave LLB利用heartbeat來檢測Master LLB的當前狀態,當Master LLB不能工作時(如:down機)
Slave LLB通過heartbeat來接管Master LLB的所有工作,這個接管過程在10秒以內完成,對使用者來說沒有什麼察覺。
Heartbeat中包含一個IP take over(IP 地址接管)的功能,此功能是通過ARP欺騙的手段來完成的。