什麼是負載均衡:
1.負載均衡叢集—LB Cluster (Load Balance)
當大量使用者并發通路時,将請求轉發到不同的機器止實作負載均衡。我們這裡使用lvs實作。LVS是Linux Virtual Server的簡寫,意即Linux虛拟伺服器,是一個虛拟的伺服器叢集系統。
什麼是IPVS:
ipvs稱之為IP虛拟伺服器(IP Virtual Server,簡寫為IPVS)。是運作在LVS下的提供負載平衡功能的一種技術,工作在OSI定義的第四層,可以在編譯linux核心的時候将功能整合進去,IPVS是LVS的關鍵,因為LVS的IP負載平衡技術就是通過IPVS子產品來實作的,IPVS是LVS叢集系統的核心軟體,它的主要作用是:安裝在Director Server上,同時在Director Server上虛拟出一個IP位址,使用者必須通過這個虛拟的IP位址通路服務。這個虛拟IP一般稱為LVS的VIP,即Virtual IP。通路的請求首先經過VIP到達負載排程器,然後由負載排程器從Real Server清單中選取一個服務節點響應使用者的請求。
Director排程器:使用者請求先到達的主機。它根據工作模型與排程方法把請求轉發到真實伺服器上
RS:RealServer,真正響應使用者請求的伺服器
VIP:Virtual IP,一般為一個公網IP,是使用者直接通路的IP,此IP所在的主機不直接提供服務,是以該主機稱為Virtual Server,一般為排程器,該IP稱為VIP
DIP:Direct IP,與RS通信的IP
RIP:Real IP,真正響應使用者請求的伺服器IP
CIP:Client IP,用戶端IP
LVS的工作模型:
1、VS/NAT(Virtual Server via Network Address Translation)
用戶端請求到達Director,Director根據ipvs上生效的排程算法修改封包的目标IP為真實伺服器的RIP,然後轉發到後端的RS上,RS收到封包後建構響應封包,然後再發到Director,Director再将封包的源IP也就是RIP還原為VIP發給用戶端,這一過程與DNAT很相似。
<a href="http://s3.51cto.com/wyfs02/M02/39/18/wKiom1O2AxCCBtbgAAIkMhu-JC4821.jpg" target="_blank"></a>
NAT:
1、RealServer應該使用私有IP位址;
2、RealServer的網關應該指向DIP;
3、RIP和DIP應該在同一個網段内;
4、進出的封包都得經過Directory,在高負載下,Directory會成為系統性能瓶頸;
5、支援端口映射;
6、RealServer可以使用任意OS;
2、VS/DR(Virtual Server via Direct Routing)
<a href="http://s3.51cto.com/wyfs02/M01/39/4E/wKiom1O35reAwVQRAAGzkyn5zTQ227.jpg" target="_blank"></a>
因為NAT模型下Director很容易成為整個系統的瓶頸,是以DR模式下Director不再轉發響應的封包,相對于響應封包,請求封包要小的多,這樣Director就被釋放出來了。
當請求封包到達路由後,路由會發出廣播,得到VIP的mac位址,把封包目标MAC改為VIP MAC位址并交給Director,Director根據排程算法選擇一個RealServer,把封包中的目标mac改為選擇的RealServer的mac,然後發給交換機,交換機根據封包目标mac将封包發向了RealServer,RealServer收到封包後,會檢查封包的目标IP,發現目标IP是VIP而本機沒有VIP就舍棄封包,是以RS上必須設定個VIP位址,然而這樣會導緻ARP響應沖突的,我們必須解決這個問題才能實作整個流程,解決這個問題的方法有很多,1、修改路由,使用靜态ARP,2、在RS上使用arptables,禁止響應對VIP的ARP廣播請求,3、在RS上修改其核心參數,并向VIP配置在與RIP不同的接口的别名上。常用的是第三種,不響應關于它的任何ARP請求,也不向外發送關于VIP的ARP廣播,這樣就不會導緻ARP沖突了。這時當封包到達RS時,RS會接受封包,并響應請求,但是預設情況下,響應封包的源IP是RIP,當這個封包發到Client時,用戶端檢查封包會發現源IP不是自己請求的IP,會舍棄該封包,是以RS的響應封包源IP應該是VIP,這就需要在RS中加條路由,凡是目标IP是VIP的封包,先從定義VIP那裝置出去,這樣源IP就是VIP了。響應封包發向Switch,經由Router響應使用者,不用經過Director了。這是生産環境中最常用的模型。
DR模式的特點:
1.DIP和RIP必須在同一個實體網絡中,它的轉發機制是基于Mac位址轉發
2.RIP可以使用私有位址(建議使用公網位址)
3.入站封包經過Directory,出站則由RealServer直接響應Client
4.叢集節點(Real Server)的網關一定不能指向DIP
5.不支援端口映射
6.絕大多數的作業系統都可以實作Real Server
7.比NAT模型的Director能帶動更多的RealServer
LVS排程算法:
分為兩類:靜态算法與動态算法
靜态:僅根據算法本身排程,不關心RS上的連接配接狀态
RR(RoundRobin):輪調,所有的請求依次輪流配置設定到後端RS,如果機器性能不一緻則負載均衡失去意義。
WRR:權重weight,不能反映伺服器的狀态,WRR在RR的基礎上加上了權重,能者多勞,性能好的多配置設定,性能差的少配置設定,比例與設定的權重值成正比。
sh:源位址哈希,持久會話。
dh:同一個用戶端請求同一個RS,相應也會通過同一個防火牆,解決防火牆的連接配接追蹤問題。
lc(least connection):Overhead=Active*256+Inactive,計算發給overhead值小的伺服器。
wlc:預設的排程算法,Overhead=(Active*256+Inactive)/Weight
sed(shortest Expect Delay):Overhead=(Active+1)*256/Weight
nq(Never Queue)
<b>lblc:</b>(dh+lc) Locality-based Least Connection
<b>lblcr:</b>Replicated and Locality-based least Connection,可以實作緩存伺服器彼此之間互相複制緩存對象,是lblc的改進版,可以使對負載均衡的損耗降到最低。
實驗一、現在我們來實作工作于VS/NAT模型的負載均衡
我通過使用ipvsadm工具管理ipvs,先安裝程式。
yum install ipvsadm -y
ipvsadm:
ipvsadm -A|E -t|u|f service-address [-s scheduler]
添加一個叢集服務,一個服務位址必須唯一,定義方式三組合一,IP位址、端口和協定,二者選一。
這官方的翻譯有點難懂哈,其實格式就是IP:端口。
-A, --add-service
Add a virtual service. A service address is uniquely defined by a
triplet: IP address, port number, and protocol. Alternatively, a vir-
tual service may be defined by a firewall-mark.
-E:編輯
-t:tcp
-u:udp
-f:firewall mark
service-address:VIP:Port
-s:指定排程算法
-C:清空規則
-Z:重置計數器
-L:檢視
-n
--rate:檢視速率
--stats:檢視狀态
--timeout:檢視逾時資訊
-c:顯示連接配接
example:ipvsadm -A -t 172.16.100.3:80 -s rr
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight] [-x upper] [-y lower]
添加一個真實伺服器到叢集
-a, --add-server
Add a real server to a virtual service.
編輯一個叢集裡的真實伺服器
-e, --edit-server
Edit a real server in a virtual service.
從叢集删除一個伺服器
-d, --delete-server
Remove a real server from a virtual service.
-r, --real-server 指定RealServer位址
-g:dr模型(預設)
-i:tun模型
-m:nat模型
-w:weight
将一個伺服器添加到叢集:
example:ipvsadm -a -t 172.16.100.3:80 -r 192.168.10.2 -m
從叢集删除一個伺服器:
example:ipvsadm -d -t 172.16.100.3:80 -r 192.168.10.7
儲存:
service ipvsadm save
/etc/sysconfig/ipvsadm
ipvsadm -S > /paht/to/ipvsadm.rules 儲存規則
ipvsadm -R < /path/to/ipvsadm.rules 恢複規則
實驗環境拓撲:
<a href="http://s3.51cto.com/wyfs02/M00/39/1C/wKioL1O2B6yR0AkvAAGcwj1erMw542.jpg" target="_blank"></a>
配置Web服務,配置IP位址這些我就省略了。
配置Director虛拟IP。
ifconfig eth0:0 192.168.1.220/24
添加一個叢集
ipvsadm -A -t 192.168.1.220:80 -s rr
添加RealServer到叢集
ipvsadm -a -t 192.168.1.200:80 -r 172.16.1.2 -m
ipvsadm -a -t 192.168.1.200:80 -r 172.16.1.3 -m
檢視清單
ipvsadm -L -n
<a href="http://s3.51cto.com/wyfs02/M02/39/26/wKiom1O2FPLBNhxJAAHHzS5QvFQ591.jpg" target="_blank"></a>
開啟資料包轉發功能
echo '1' > /proc/sys/net/ipv4/ip_forward
現在我們用浏覽器測試,第一次通路。
<a href="http://s3.51cto.com/wyfs02/M01/39/28/wKioL1O2FczTn2ttAAE-6tdxf5Y400.jpg" target="_blank"></a>
測試第二次通路。
<a href="http://s3.51cto.com/wyfs02/M01/39/28/wKiom1O2FhuhXMslAAE4vc_7Wgw606.jpg" target="_blank"></a>
檢視狀态
ipvsadm -L -n --stats
<a href="http://s3.51cto.com/wyfs02/M02/39/2C/wKiom1O2F3rBMJVeAAHUkTzfb1Q203.jpg" target="_blank"></a>
由此可以看出他們的連接配接都是平均的。
現在我們換一個排程算法。
ipvsadm -E -t 192.168.1.220:80 -s wrr
修改伺服器權重
ipvsadm -e -t 192.168.1.220:80 -r 172.16.1.2 -m -w 2
<a href="http://s3.51cto.com/wyfs02/M01/39/35/wKiom1O2JeDSSM_KAAIVKeJBdM8531.jpg" target="_blank"></a>
實驗二、實作工作于VS/DR模型的負載均衡
環境拓撲:
<a href="http://s3.51cto.com/wyfs02/M00/39/52/wKioL1O4mNSy0mibAAGsGotJ2Uk847.jpg" target="_blank"></a>
配置兩台Web伺服器,已經配置IP位址,過程我就省略了。
RealServer的配置:
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
ifconfig lo:0 192.168.1.200 broadcast 192.168.1.200 netmask 255.255.255.255 up
route add -host 192.168.1.200 dev lo:0
Director配置:
ifconfig eth0:1 192.168.1.200 broadcast 192.168.1.200 netmask 255.255.255.255 up
route add -host 192.168.1.200 dev eth0:1
iptables -F
iptables -Z
ipvsadm -C
ipvsadm -A -t 192.168.1.200:80 -s wlc
ipvsadm -a -t 192.168.1.200:80 -r 192.168.1.10 -g -w 2
ipvsadm -a -t 192.168.1.200:80 -r 192.168.1.11 -g -w 3
<a href="http://s3.51cto.com/wyfs02/M01/39/53/wKioL1O4wTyD0hIVAAG4TaDoSsg794.jpg" target="_blank"></a>
進行壓力測試,檢視狀态。
<a href="http://s3.51cto.com/wyfs02/M01/39/54/wKioL1O4xvChGVn2AALF2-qFDyA709.jpg" target="_blank"></a>
LVS Persistent
由于http是無狀态的連接配接,客戶每次請求會被當做新請求,比如我們登入了一個論壇,以重新整理頁面,伺服器會把你當新通路,你還得重新登入,這樣很不友善,尤其在電子商務類的網站上,好不容易選了好多商品準備付款,重新整理了一次或者網頁跳轉了一次資訊都丢失了。為了追蹤客戶的狀态,才有了cookies 和session。cookies是什麼?它是動态網站發給每個用戶端的一個識别碼SessionID,識别碼是有有效期的。session中文意思是會話,伺服器端發給用戶端一個識别碼,伺服器端會也會把這個識别碼儲存到檔案上,這個檔案包含了用戶端的識别碼與一些用戶端通路過頁面的資訊,是以我們登入論壇後,伺服器會給我們發一個SessionID,浏覽器會自己儲存下來,當我們再次通路的時候,httpd請求首部會包含你的SessionID,伺服器收到請求封包後會檢視該SessionID,如果伺服器上有該sessionID并在有效期内,則驗證通過,剛才的通路狀态還會存在,如果登入資訊,比如購物車中的商品。
但是負載均衡以後,用戶端請求可能被排程到不同的RealServer,而其他的RealServer中并沒有該用戶端的Session認證檔案,這樣就又無法追蹤客戶狀态了,是以LVS引入了持久連接配接,它會啟用一段記憶體空間生成一個hash表用來儲存用戶端與伺服器的請求狀态,凡是來自同一個IP的用戶端都會被排程同一個RealServer,當然這個持久連接配接是有有效期的。持久連接配接有三種:
PCC Persistent client connections 持久用戶端連接配接,将IP的所有請求都轉發到一個RS。
定義方式:
ipvsadm -A -t 172.16.1.3:0 -s rr -p
ipvsadm -a -t 172.16.1.3:0 -r 192.168.1.2 -g
ipvsadm -a -t 172.16.1.3:0 -r 192.168.1.3 -g
這裡端口寫的是0,表示所有端口請求都定義到一個伺服器。
PPC persistent port connections 将IP中的一個服務轉發到一個RS
PFM—— 基于防火牆标記的持久連接配接,可以将幾個服務定義為同一種标記轉發。
iptables為定義的服務封包打上防火牆标記,凡是有該防火牆标記的服務請求LVS都會根據他們的來源IP把他們排程到同一個RS上。
要想實作給一個資料包打标,需要在mangle表的PREROUTING鍊上實作。
example:
iptables -t mangle -A PREROUTING -d $VIP -p tcp --dport 80 -j MARK --set-mark 10 (0-99)均可
iptables -t mangle -A PREROUTING -d $VIP -p tcp --dport 443 -j MARK --set-mark 10
在定義叢集的時候,則可以使用-f選項。
ipvsadm -A -f 10 -s rr -p
實驗三、建構一個DR模型的叢集,VIP與RIP不在同一個子網内,并且使用防火牆标記的持久連接配接,來實作同一個IP來通路時,http與https的請求都發往一個RS。
<a href="http://s3.51cto.com/wyfs02/M00/39/5B/wKioL1O5h7HQK8qsAAGPQ6Q4qkQ084.jpg" target="_blank"></a>
配置Web伺服器,和配置https,我這裡就省略了。
RealServer配置核心參數,配置VIP。
Director配置IP。
ifconfig eth0 172.16.0.100/16
route add -net default gw 172.16.0.1
Director配置防火牆标記。
iptables -t mangle -A PREROUTING -d 192.168.1.200 -p tcp --dport 80 -j MARK --set-mark 6
iptables -t mangle -A PREROUTING -d 192.168.1.200 -p tcp --dport 443 -j MARK --set-mark 6
Director配置VIP和主機路由。
echo 1 > /proc/sys/net/ipv4/ip_forward
Director配置IPVSec
ipvsadm -A -f 6 -s rr -p
ipvsadm -a -f 6 -r 172.16.0.12 -g
ipvsadm -a -f 6 -r 172.16.0.11 -g
注意如果路由不知道如何找到VIP,可以在路由上加一條規則。
route add -host 192.168.1.200 gw 172.16.0.100
這時我們來測試下,通路www.tuchao.com。
<a href="http://s3.51cto.com/wyfs02/M01/39/5B/wKioL1O5hmCQYL29AAFkm2mrXD0135.jpg" target="_blank"></a>
換成https協定再測試
<a href="http://s3.51cto.com/wyfs02/M02/39/5B/wKioL1O5hqfQUuN1AAFGPpfihUo448.jpg" target="_blank"></a>
哈,實驗成功,這就完成了基于防火牆标記的持久連接配接,實作了當一個IP請求http與https,lvs都會轉發給一台RealServer。
太晚了,明天還要上班,以後這篇文章我以後還會再做完善。
有問題歡迎與我交流QQ1183710107
本文轉自qw87112 51CTO部落格,原文連結:http://blog.51cto.com/tchuairen/1434362