負(fù)載均衡——LVS DR模式

背景

相比于nginx只能用于7層負(fù)載均衡,LVS就比較強(qiáng)大了,能在4層做負(fù)載均衡。而且性能和穩(wěn)定性上LVS也比較占優(yōu),畢竟是合入內(nèi)核模塊,不穩(wěn)定肯定不行。

關(guān)于LVS

LVS通過工作于內(nèi)核的ipvs模塊來實(shí)現(xiàn)功能,其主要工作于netfilter的INPUT鏈上。除此之外,還需要一個(gè)用戶態(tài)工具,ipvdadm,用于用戶負(fù)載集群定義和集群服務(wù)管理。

LVS DR模式工作原理

LVS DR模式的流程大概如下:


1、客戶端發(fā)送請求至VIP,也就是訪問服務(wù),請求報(bào)文源地址是CIP,目標(biāo)地址為VIP;

2、LVS調(diào)度器接收到請求,報(bào)文在PREROUTING鏈檢查,確定目的IP是本機(jī),于是將報(bào)文發(fā)送至INPUT鏈,ipvs內(nèi)核模塊確定請求的服務(wù)是我們配置的LVS集群服務(wù),然后根據(jù)用戶設(shè)定的均衡策略選擇某臺后端RS,并將目標(biāo)MAC地址修改RIP的MAC地址。因?yàn)檎{(diào)度器和后端服務(wù)器RS在同個(gè)網(wǎng)段,因此直接二層互通,將請求發(fā)給選擇的RS處理;

3、因?yàn)閳?bào)文目的mac是本機(jī),且RS上有配置VIP,因此RS能接收該報(bào)文。后端服務(wù)處理完請求后,將響應(yīng)直接發(fā)往客戶端,此時(shí)源IP地址為VIP,目標(biāo)IP為CIP。

LVS DR模式配置

1、環(huán)境準(zhǔn)備

如下,準(zhǔn)備三臺服務(wù)器,

機(jī)器 作用

192.168.0.100 VIP,LVS調(diào)度器對外服務(wù)IP

192.168.0.200 RIP,后端web服務(wù)器之一

192.168.0.300 RIP,后端web服務(wù)器之二

2、LVS調(diào)度器配置

上面我們說過lvs依賴于ipvs內(nèi)核模塊,和ipvsadm用戶態(tài)工具。因?yàn)閏entos 7已經(jīng)默認(rèn)加載ipvs模塊,因此這一步我們不需要配置。我們只需要安裝ipvsadm工具即可,

yum install -y ipvsadm

然后在LVS調(diào)度器上配置VIP,這里我們采用虛擬網(wǎng)卡,當(dāng)然也可以使用獨(dú)立網(wǎng)卡配置,

ifconfig eth0:0 192.168.0.100/24 up

接著配置LVS集群服務(wù),

[root@CentOS-7-2 ~]# ipvsadm -C

[root@CentOS-7-2 ~]# ipvsadm -A -t 192.168.0.100:80 -s rr

[root@CentOS-7-2 ~]# ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.200:80 -g

[root@CentOS-7-2 ~]# ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.300:80 -g

其中,

第一條命令是清空所有規(guī)則;

第二條命令是定義LVS服務(wù),并指定負(fù)責(zé)均衡策略為rr,即輪詢;

第三、四條命令各添加一臺后端web服務(wù)器,作為負(fù)載均衡節(jié)點(diǎn),并指定為DR模式。

ipvsadm基本命令參數(shù)如下:

-A? 指定添加的LVS負(fù)載均衡虛擬服務(wù)

-t? 指定虛擬服務(wù)器的IP地址和端口

-s? 指定調(diào)度算法,ss為輪詢,wrr為加權(quán)輪詢,dh為目標(biāo)地址散列,sh為源地址散列,lc為最少鏈接等

-a? 在對應(yīng)的VIP下添加RS節(jié)點(diǎn)

-g? 指定LVS的工作模式為DR模式

-l? 指定LVS的工作模式為tunnel模式

-m? 指定LVS的工作模式為NAT模式

添加完后端RS,我們可以查看此LVS對應(yīng)的均衡規(guī)則,

[root@CentOS-7-2 ~]# 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.0.100:80 rr

? -> 192.168.0.200:80? ? ? ? ? ? Route? 1? ? ? 0? ? ? ? ? 0? ? ? ?

? -> 192.168.0.300:80? ? ? ? ? ? Route? 1? ? ? 0? ? ? ? ? 0

3、后端RS配置

這里web服務(wù)器使用nginx搭建,因此在兩臺RS上安裝nginx,

yum install -y nginx

同時(shí)為了后面測試,我們修改web服務(wù)器的index.html內(nèi)容,

[root@192_168_0_200 ~]# cat /usr/share/nginx/html/index.html

This is 192.168.0.200

[root@192_168_0_300 ~]# cat /usr/share/nginx/html/index.html

This is 192.168.0.300

接著開始進(jìn)行LVS相關(guān)配置,

首先將VIP配置在lo接口上,(注意掩碼要配置成32位,不然RS通信會出問題)

ifconfig lo:0 192.168.0.100/32 up

接著配置對應(yīng)路由,

route add -host 192.168.0.100 dev lo

然后設(shè)置相關(guān)系統(tǒng)參數(shù),

echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore

echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce

echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

其實(shí)嚴(yán)格意義上只要配置出口網(wǎng)卡的對應(yīng)參數(shù)就可以了,配置all也只是為了保險(xiǎn)而已,文章最后面會有說明。

4、測試

使用curl命令對vip進(jìn)行訪問,

[root@CentOS-7-3 /home]# curl? http://192.168.0.100:80

This is 192.168.0.200

[root@CentOS-7-3 /home]# curl? http://192.168.0.100:80

This is 192.168.0.300

[root@CentOS-7-3 /home]# curl? http://192.168.0.100:80

This is 192.168.0.200

[root@CentOS-7-3 /home]# curl? http://192.168.0.100:80

This is 192.168.0.300

可見結(jié)果符合我們設(shè)置的輪詢策略。

幾點(diǎn)思考

1、為什么所有RS上都要配置VIP

因?yàn)楫?dāng)調(diào)度器把請求轉(zhuǎn)發(fā)給對應(yīng)RS時(shí),并沒有修改報(bào)文目的IP,因此請求報(bào)文目的IP仍為VIP,所以如果RS沒有配置VIP,那么報(bào)文到達(dá)RS后就會被丟棄。

2、為什么所有RS要設(shè)置arp_ignore=1和arp_announce=2

arp_ignore=1:只響應(yīng)目的IP地址為接收網(wǎng)卡上的本地地址的arp請求

因?yàn)槲覀冊赗S上都配置了VIP,因此此時(shí)是存在IP沖突的,當(dāng)外部客戶端向VIP發(fā)起請求時(shí),會先發(fā)送arp請求,此時(shí)調(diào)度器和RS都會響應(yīng)這個(gè)請求。如果某個(gè)RS響應(yīng)了這個(gè)請求,則之后該客戶端的請求就都發(fā)往該RS,并沒有經(jīng)過LVS,因此也就沒有真正的負(fù)載均衡,LVS也就沒有存在的意義。因此我們需要設(shè)置RS不響應(yīng)對VIP的arp請求,這樣外部客戶端的所有對VIP的arp請求才會都解析到調(diào)度器上,然后經(jīng)由LVS的調(diào)度器發(fā)往各個(gè)RS。

系統(tǒng)默認(rèn)arp_ignore=0,表示響應(yīng)任意網(wǎng)卡上接收到的對本機(jī)IP地址的arp請求(包括環(huán)回網(wǎng)卡上的地址),而不管該目的IP是否在接收網(wǎng)卡上。也就是說,如果機(jī)器上有兩個(gè)網(wǎng)卡設(shè)備A和B,即使在A網(wǎng)卡上收到對B IP的arp請求,也會回應(yīng)。而arp_ignore設(shè)置成1,則不會對B IP的arp請求進(jìn)行回應(yīng)。由于lo肯定不會對外通信,所以如果只有一個(gè)對外網(wǎng)口,其實(shí)只要設(shè)置這個(gè)對外網(wǎng)口即可,不過為了保險(xiǎn),很多時(shí)候都對all也進(jìn)行設(shè)置。

arp_announce=2:網(wǎng)卡在發(fā)送arp請求時(shí)使用出口網(wǎng)卡IP作為源IP

當(dāng)RS處理完請求,想要將響應(yīng)發(fā)回給客戶端,此時(shí)想要獲取目的IP對應(yīng)的目的MAC地址,那么就要發(fā)送arp請求。arp請求的目的IP就是想要獲取MAC地址的IP,那arp請求的源IP呢?自然而然想到的是響應(yīng)報(bào)文的源IP地址,但也不是一定是這樣,arp請求的源IP是可以選擇的,而arp_announce的作用正是控制這個(gè)地址如何選擇。系統(tǒng)默認(rèn)arp_announce=0,也就是源ip可以隨意選擇。這就會導(dǎo)致一個(gè)問題,如果發(fā)送arp請求時(shí)使用的是其他網(wǎng)口的IP,達(dá)到網(wǎng)絡(luò)后,其他機(jī)器接收到這個(gè)請求就會更新這個(gè)IP的mac地址,而實(shí)際上并不該更新,因此為了避免arp表的混亂,我們需要將arp請求的源ip限制為出口網(wǎng)卡ip,因此需要設(shè)置arp_announce=2。

3、為什么RS上的VIP要配置在lo上

由上可知,只要RS上的VIP不響應(yīng)arp請求就可以了,因此不一定要配置在lo上,也可以配置在其他網(wǎng)口。由于lo設(shè)備不會直接接收外部請求,因此只要設(shè)置機(jī)器上的出口網(wǎng)卡不響應(yīng)非本網(wǎng)卡上的arp請求接口。但是如果VIP配置在其他網(wǎng)口上,除了上面的配置,還需要配置該網(wǎng)口不響應(yīng)任何arp請求,也就是arp_ignore要設(shè)置為8。

4、為什么RS上lo配置的VIP掩碼為32位

這是由于lo設(shè)備的特殊性導(dǎo)致, 如果lo綁定192.168.0.200/24,則該設(shè)備會響應(yīng)該網(wǎng)段所有IP(192.168.0.1~192.168.0.254) 的請求,而不是只響應(yīng)192.168.0.200這一個(gè)地址。

5、為什么調(diào)度器與RS要在同一網(wǎng)段中

根據(jù)DR模式的原理,調(diào)度器只修改請求報(bào)文的目的mac,也就是轉(zhuǎn)發(fā)是在二層進(jìn)行,因此調(diào)度器和RS需要在同一個(gè)網(wǎng)段,從而ip_forward也不需要開啟。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容