IPVS簡介
ipvs是工作在Linux內(nèi)核態(tài)的4層負(fù)載均衡;和用戶態(tài)的負(fù)載均衡軟件(如nginx、haproxy)功能類似:作為客戶端訪問的統(tǒng)一入口并將訪問請求根據(jù)調(diào)度算法轉(zhuǎn)給后端真實(shí)的服務(wù)器。相比于用戶態(tài)負(fù)載均衡,ipvs為Linux內(nèi)核子模塊性能更強(qiáng),但ipvs僅工作在4層無法處理7層數(shù)據(jù)(比如SSL證書、修改HTTP請求頭)。
IPVS調(diào)度算法
IPVS是如何決策應(yīng)該把請求調(diào)度到哪個后端RS(Real Server)上的呢?這是由負(fù)載均衡調(diào)度算法決定的。IPVS常用的調(diào)度算法有:
輪詢(Round Robin):IPVS認(rèn)為集群內(nèi)每臺RS都是相同的,會輪流進(jìn)行調(diào)度分發(fā)。從數(shù)據(jù)統(tǒng)計(jì)上看,RR模式是調(diào)度最均衡的。
加權(quán)輪詢(Weighted Round Robin):IPVS會根據(jù)RS上配置的權(quán)重,將消息按權(quán)重比分發(fā)到不同的RS上??梢越o性能更好的RS節(jié)點(diǎn)配置更高的權(quán)重,提升集群整體的性能。
最小連接數(shù)(Least Connections):IPVS會根據(jù)集群內(nèi)每臺RS的連接數(shù)統(tǒng)計(jì)情況,將消息調(diào)度到連接數(shù)最少的RS節(jié)點(diǎn)上。在長連接業(yè)務(wù)場景下,LC算法對于系統(tǒng)整體負(fù)載均衡的情況較好;但是在短連接業(yè)務(wù)場景下,由于連接會迅速釋放,可能會導(dǎo)致消息每次都調(diào)度到同一個RS節(jié)點(diǎn),造成嚴(yán)重的負(fù)載不均衡。
加權(quán)最小連接數(shù)(Weighted Least Connections):最小連接數(shù)算法的加權(quán)版~
地址哈希(Address Hash):LB上會保存一張哈希表,通過哈希映射將客戶端和RS節(jié)點(diǎn)關(guān)聯(lián)起來。
IPVS轉(zhuǎn)發(fā)模式
根據(jù)調(diào)度算法選擇一個合適的后端RS節(jié)點(diǎn),IPVS怎么將數(shù)據(jù)轉(zhuǎn)發(fā)給后端RS呢?
IPVS支持三種轉(zhuǎn)發(fā)模式:
DR模式(Direct Routing)
NAT模式(Network Address Translation)
IP隧道(IP tunneling)
三種轉(zhuǎn)發(fā)模式性能從高到低:DR > NAT > IP隧道
DR模式
DR模式下,客戶端的請求包到達(dá)負(fù)載均衡器的虛擬服務(wù)IP端口后,負(fù)載均衡器不會改寫請求包的IP和端口,但是會改寫請求包的MAC地址為后端RS的MAC地址,然后將數(shù)據(jù)包轉(zhuǎn)發(fā);真實(shí)服務(wù)器處理請求后,響應(yīng)包直接回給客戶端,不再經(jīng)過負(fù)載均衡器。所以DR模式的轉(zhuǎn)發(fā)效率是最高的。
DR模式的特點(diǎn):
數(shù)據(jù)包在LB轉(zhuǎn)發(fā)過程中,源/目的IP端口都不會變化。LB只是將數(shù)據(jù)包的MAC地址改寫為RS的MAC地址,然后轉(zhuǎn)發(fā)給相應(yīng)的RS。所以LB必須和后端RS節(jié)點(diǎn)在同一個子網(wǎng)
每臺RS上都必須在環(huán)回網(wǎng)卡(lo)上綁定VIP。因?yàn)長B轉(zhuǎn)發(fā)時并不會改寫數(shù)據(jù)包的目的IP,所以RS收到的數(shù)據(jù)包的目的IP仍是VIP,為了保證RS能夠正確處理該數(shù)據(jù)包,而不是丟棄,必須在RS的環(huán)回網(wǎng)卡上綁定VIP。這樣RS會認(rèn)為這個虛擬服務(wù)IP是自己的IP,自己是能夠處理這個數(shù)據(jù)包的,否則RS會直接丟棄該數(shù)據(jù)包。
RS上的業(yè)務(wù)進(jìn)程必須監(jiān)聽在環(huán)回網(wǎng)卡的VIP上,且端口必須和LB上的虛擬服務(wù)端口一致。因?yàn)長B不會改寫數(shù)據(jù)包的目的端口,所以RS服務(wù)的監(jiān)聽端口必須和LB上虛擬服務(wù)端口一致,否則RS會直接拒絕該數(shù)據(jù)包。
RS處理完請求后,響應(yīng)直接回給客戶端,不再經(jīng)過LB。因?yàn)镽S收到的請求數(shù)據(jù)包的源IP是客戶端的IP,所以理所當(dāng)然RS的響應(yīng)會直接回給客戶端,而不會再經(jīng)過LB。這時候要求RS和客戶端之間的網(wǎng)絡(luò)是可達(dá)的。
NAT模式
NAT模式下請求包和響應(yīng)包都需要經(jīng)過LB處理。當(dāng)客戶端的請求到達(dá)LB后,LB會對請求包做目的地址轉(zhuǎn)換(DNAT),將請求包的目的IP改寫為RS的IP。RS處理請求后將響應(yīng)返回給LB,當(dāng)LB收到RS的響應(yīng)后,LB會對響應(yīng)包做源地址轉(zhuǎn)換(SNAT),將響應(yīng)包的源IP改寫為LB的VIP。
NAT模式的特點(diǎn):
LB會修改數(shù)據(jù)包的地址。對于請求包,會進(jìn)行DNAT;對于響應(yīng)包,會進(jìn)行SNAT。
LB會透傳客戶端IP到RS(DR模式也會透傳)。雖然LB在轉(zhuǎn)發(fā)過程中做了NAT轉(zhuǎn)換,但是因?yàn)橹皇亲隽瞬糠值刂忿D(zhuǎn)發(fā),所以RS收到的請求包里是能看到客戶端IP的。
需要將RS的默認(rèn)網(wǎng)關(guān)地址配置為LB的浮動IP地址。因?yàn)镽S收到的請求包源IP是客戶端的IP,為了保證響應(yīng)包在返回時能走到LB上面,所以需要將RS的默認(rèn)網(wǎng)關(guān)地址配置為LB的虛擬服務(wù)IP地址。當(dāng)然,如果客戶端的IP是固定的,也可以在RS上添加明細(xì)路由指向LB的虛擬服務(wù)IP,不用改默認(rèn)網(wǎng)關(guān)。
LB和RS須位于同一個子網(wǎng),并且客戶端不能和LB/RS位于同一子網(wǎng)。因?yàn)樾枰獙S的默認(rèn)網(wǎng)關(guān)配置為LB的虛擬服務(wù)IP地址,所以需要保證LB和RS位于同一子網(wǎng)。又因?yàn)樾枰WCRS的響應(yīng)包能走回到LB上,則客戶端不能和RS位于同一子網(wǎng)。否則RS直接就能獲取到客戶端的MAC,響應(yīng)包就直接回給客戶端了,也就走不到LB上面了。這時候由于沒有LB做SNAT,客戶端收到的響應(yīng)包源IP是RS的IP,而客戶端的請求包目的IP是LB的虛擬服務(wù)IP,這時候客戶端無法識別響應(yīng)包,會直接丟棄。
IP隧道模式
隧道模式下LB將原始請求報文封裝在另一個IP報文中,再將封裝好的IP報文轉(zhuǎn)發(fā)給后端RS;后端RS服務(wù)器收到報文后,先將報文解封獲得原報文中目標(biāo)地址為VIP的報文,服務(wù)器發(fā)現(xiàn)VIP地址被配置在本地的IP隧道設(shè)備上,所以就處理這個請求,然后根據(jù)路由表將響應(yīng)報文直接返回給客戶。
隧道模式的特點(diǎn):
LB和RS節(jié)點(diǎn)不用處于同一子網(wǎng);解除了NAT模式和DR模式的限制。
LB和RS節(jié)點(diǎn)必須都支持隧道技術(shù),且RS節(jié)點(diǎn)也需要在TUN網(wǎng)卡上配置VIP地址;因?yàn)長B通過隧道發(fā)送報文,RS節(jié)點(diǎn)必須支持隧道才能解封裝,解封裝后拿到原始報文的目的地址為VIP,如果RS節(jié)點(diǎn)上沒有配置VIP,則會丟棄報文。
RS節(jié)點(diǎn)必須能訪問互聯(lián)網(wǎng);因?yàn)镽S節(jié)點(diǎn)是直接將響應(yīng)報文返回給客戶端,所以必須能訪問外網(wǎng)。
命令演示
IPVS為內(nèi)核子模塊,需要用ipvsadm命令添加虛擬服務(wù)規(guī)則;IPVS與ipvsadm的關(guān)系就和netfilter與iptables一樣。
ipvsadm命令參數(shù)展示
?
?
Commands: --add-service -A 增加一個虛擬服務(wù) --edit-service -E 修改一個虛擬服務(wù) --delete-service -D 刪除一個虛擬服務(wù) --clear -C 清理所有虛擬服務(wù) --restore -R 從標(biāo)準(zhǔn)輸入獲取ipvsadm命令。一般結(jié)合下邊的-S使用。 --save -S 從標(biāo)準(zhǔn)輸出輸出虛擬服務(wù)器的規(guī)則。可以將虛擬服務(wù)器的規(guī)則保存,在以后通過-R直接讀入,以實(shí)現(xiàn)自動化配置。 --add-server -a 為虛擬服務(wù)添加一個real server(RS) --edit-server -e 修改虛擬服務(wù)中的RS --delete-server -d 刪除虛擬服務(wù)中的RS --list -L|-l 列出虛擬服務(wù)表中的所有虛擬服務(wù)??梢灾付ǖ刂?。添加-c顯示連接表。 --help -h 顯示幫助信息 Options: --tcp-service -t service-address 指定虛擬服務(wù)為tcp服務(wù)。service-address要是host[:port]的形式。 --udp-service -u service-address 指定虛擬服務(wù)為udp服務(wù)。service-address要是host[:port]的形式。 --scheduler -s scheduler 指定調(diào)度算法。調(diào)度算法可以指定以下10種:rr(輪詢),wrr(權(quán)重),lc(最后連接),wlc(權(quán)重),lblc(本地最后連接),lblcr(帶復(fù)制的本地最后連接),dh(目的地址哈希),sh(源地址哈希),sed(最小期望延遲),nq(永不排隊(duì))。默認(rèn)調(diào)度算法為wlc。 --real-server -r server-address 為虛擬服務(wù)指定數(shù)據(jù)可以轉(zhuǎn)發(fā)到的真實(shí)服務(wù)器的地址。可以添加端口號。如果沒有指定端口號,則等效于使用虛擬地址的端口號。 --gatewaying -g 指定轉(zhuǎn)發(fā)模式為DR(direct routing) (default) --ipip -i 指定轉(zhuǎn)發(fā)模式為ip隧道(tunneling) --masquerading -m 指定轉(zhuǎn)發(fā)模式為NAT模式(NAT) --connection -c 列出當(dāng)前的IPVS連接。
?
環(huán)境準(zhǔn)備;VM1/VM2/VM3都是在client上的VMware虛擬機(jī)。VMware網(wǎng)絡(luò)模式為NAT。
設(shè)備名稱 | 設(shè)備ip |
---|---|
client | 7.249.241.35 |
VM1(LB) |
ip:192.168.81.128 vip: 192.168.81.100 |
VM2(RS1) | 192.168.81.129 |
VM3(RS2) | 192.168.81.130 |
確保LB節(jié)點(diǎn)上開啟contrack和forward功能
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf echo "net.ipv4.vs.conntrack=1" >> /etc/sysctl.conf sysctl -p
在虛擬機(jī)VM1(LB)上安裝ipvsadm命令
yum install ipvsadm
在虛擬機(jī)VM1(LB)上為網(wǎng)卡添加一個VIP
[root@vm1 ~]# ip addr add 192.168.81.100/24 dev eth0 [root@vm1 ~]# ip a s eth0 2: eth0:mtu 1500 qdisc mq state UP group default qlen 1000 link/ether fa:16:3e:68:5a:12 brd ffffff:ff inet 192.168.81.128/24 brd 172.16.2.255 scope global noprefixroute dynamic eth0 valid_lft 102241123sec preferred_lft 102241123sec inet 192.168.81.100/24 scope global secondary eth0 valid_lft forever preferred_lft forever inet6 fe80:3eff5a12/64 scope link valid_lft forever preferred_lft forever
在虛擬機(jī)VM1(LB)上添加ipvs虛擬配置,并指定調(diào)度算法為輪詢
ipvsadm -At 192.168.81.100:80 -s rr
在虛擬機(jī)VM1(LB)上添加RS節(jié)點(diǎn)
ipvsadm -at 192.168.81.100:80 -r 192.168.81.129:80 -m ipvsadm -at 192.168.81.100:80 -r 192.168.81.130:80 -m
在虛擬機(jī)VM1(LB)上查看虛擬配置
[root@test ~]# ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.81.100:80 rr -> 192.168.81.129:80 Masq 1 0 0 -> 192.168.81.130:80 Masq 1 0 0
為了使client能訪問vip,確保client機(jī)器上有訪問vip的路由,192.168.81.1為VMware的虛擬網(wǎng)卡VMnet8的ip
由于本次環(huán)境的LB/RS都是通過VMware虛擬出來的,虛擬機(jī)和client互通,為了使RS節(jié)點(diǎn)將響應(yīng)報文返回給LB,需要在兩個RS節(jié)點(diǎn)上添加路由,使響應(yīng)報文經(jīng)過LB從而把響應(yīng)報文的源地址換回vip
#目的地址為什么不是客戶端ip?因?yàn)閂Mware用的nat模式,client的請求到達(dá)LB時,VMware會把數(shù)據(jù)包源ip改為VMnet8網(wǎng)卡的地址`192.168.81.1`,也就是會做SNAT ip route add 192.168.81.1 via 192.168.81.128 dev eth0
訪問測試,LB將請求輪詢轉(zhuǎn)發(fā)給后端RS節(jié)點(diǎn)
審核編輯:黃飛
?
評論
查看更多