
本文主要包括LVS三種模式的基本工作原理介紹和可能涉及的ARP問題原理。
1、LVS簡(jiǎn)介
1.1 LVS起源
LVS是Linux Virtual Server的簡(jiǎn)稱,也叫Linux虛擬服務(wù)器, 也就是現(xiàn)在常說的四層負(fù)載均衡。 它是一個(gè)由章文嵩博士發(fā)起的自由軟件項(xiàng)目
?,F(xiàn)在LVS已經(jīng)是 Linux標(biāo)準(zhǔn)內(nèi)核的一部分,在Linux2.4內(nèi)核以前,使用LVS時(shí)必須要重新編譯內(nèi)核以支持LVS功能模塊,但是從Linux2.4內(nèi)核以后,已經(jīng)完全內(nèi)置了LVS的各個(gè)功能模塊,無需給內(nèi)核打任何補(bǔ)丁,可以直接使用LVS提供的各種功能。
1.2 LVS常用名詞概念
- loadbalance:
Load Balancer,負(fù)載均衡器,運(yùn)行LVS負(fù)責(zé)負(fù)載均衡的服務(wù)器 - DS:
Director Server,指的是前端負(fù)載均衡器節(jié)點(diǎn),也就是運(yùn)行LVS的服務(wù)器; - RS:
Real Server,后端真實(shí)的工作服務(wù)器; - VIP:
Virtual Server IP,向外部直接面向用戶請(qǐng)求,作為用戶請(qǐng)求的目標(biāo)的IP地址,一般也是DS的外部IP地址; - DIP:
Director Server IP,主要用于和內(nèi)部主機(jī)通訊的IP地址,一般也是DS的內(nèi)部IP地址; - RIP:
Real Server IP,后端服務(wù)器的IP地址; - CIP:
Client IP,訪問客戶端的IP地址;
2、LVS基本原理
一般說的LVS集群指的是對(duì)于客戶端來說的一個(gè)大型快速可靠高可用的服務(wù)器集群。LVS的核心是在LVS director上的Linux內(nèi)核中的ip_vs內(nèi)核模塊

對(duì)于LVS集群中的Director Server(以下簡(jiǎn)稱DS)來說:
- LVS屬于四層負(fù)載均衡,DS屬于四層交換,它在網(wǎng)絡(luò)中顯示為路由器,其規(guī)則與普通路由器略有不同;
- DS接受從客戶端發(fā)送過來的請(qǐng)求,并且從后端(backend)的真實(shí)服務(wù)器RS中挑選一個(gè)用來處理請(qǐng)求;
- RS可以提供正常互聯(lián)網(wǎng)服務(wù)中的任何服務(wù),因?yàn)長(zhǎng)VS是四層轉(zhuǎn)發(fā),兼容性很好,對(duì)業(yè)務(wù)無侵入性;
- RS可以在客戶端無感知的情況下添加或刪除到LVS集群中,因此允許后端的RS出現(xiàn)宕機(jī)、升級(jí)、彈性伸縮。
在調(diào)度器的實(shí)現(xiàn)技術(shù)中,IP負(fù)載均衡技術(shù)是效率最高的。在已有的IP負(fù)載均衡技術(shù)中有通過網(wǎng)絡(luò)地址轉(zhuǎn)換(Network Address Translation)將一組服務(wù)器構(gòu)成一個(gè)高性能的、高可用的虛擬服務(wù)器,我們稱之為VS/NAT技術(shù)(Virtual Server via Network Address Translation),在分析VS/NAT的缺點(diǎn)和網(wǎng)絡(luò)服務(wù)的非對(duì)稱性的基礎(chǔ)上,LVS提出通過IP隧道實(shí)現(xiàn)虛擬服務(wù)器的方法VS/TUN (Virtual Server via IP Tunneling),和通過直接路由實(shí)現(xiàn)虛擬服務(wù)器的方法VS/DR(Virtual Server via Direct Routing),它們可以極大地提高系統(tǒng)的伸縮性。所以,IPVS軟件實(shí)現(xiàn)了這三種IP負(fù)載均衡技術(shù),它們的大致原理如下
3、LVS NAT模式
NAT模式的主要實(shí)現(xiàn)原理是通過網(wǎng)絡(luò)地址轉(zhuǎn)換,LB重寫請(qǐng)求報(bào)文的目標(biāo)地址(包括IP和MAC),根據(jù)預(yù)設(shè)的調(diào)度算法,將請(qǐng)求分派給后端的RS;RS的響應(yīng)報(bào)文通過LB返回時(shí),報(bào)文的源地址被重寫,修改為L(zhǎng)B的MAC和IP,再返回給客戶,完成整個(gè)負(fù)載調(diào)度過程。

- 當(dāng)用戶訪問服務(wù)器群集提供的服務(wù)時(shí),發(fā)往虛擬服務(wù)器IP(VIP/LB的外部IP地址)的數(shù)據(jù)包將到達(dá)LB
- LB檢查數(shù)據(jù)包的目標(biāo)地址和端口號(hào)。如果符合在LVS的規(guī)則表中定義添加的服務(wù),則根據(jù)調(diào)度算法從后端群集中選擇一個(gè)RS,并將該連接添加到記錄已建立連接的哈希表中
- 然后,將數(shù)據(jù)包的目標(biāo)地址和端口重寫為所選RS的地址和端口,然后將數(shù)據(jù)包轉(zhuǎn)發(fā)到RS
- 當(dāng)傳入的數(shù)據(jù)包符合在LVS的規(guī)則表中定義添加的服務(wù)并且可以在哈希表中找到所選的RS時(shí),該數(shù)據(jù)包將被重寫并直接轉(zhuǎn)發(fā)到所選的RS
- 當(dāng)RS處理完請(qǐng)求之后,會(huì)把回復(fù)數(shù)據(jù)包返回給LB,此時(shí)LB會(huì)將數(shù)據(jù)包的源地址和端口重寫為虛擬服務(wù)的源地址和端口,然后發(fā)送給客戶端
- 連接終止或超時(shí)后,連接記錄將在哈希表中刪除

LVS的NAT模式需要開啟LB的內(nèi)核中的ip_forward功能
echo 1 > /proc/sys/net/ipv4/ip_forward
4、LVS via IP Tunneling(TUN)
采用NAT技術(shù)時(shí),雖然對(duì)于客戶端來說整個(gè)服務(wù)器集群中的LVS負(fù)載均衡過程是無感的(因?yàn)閷?duì)于客戶端來說請(qǐng)求包發(fā)送的目標(biāo)IP和響應(yīng)包返回的源IP都沒有改變),但是由于請(qǐng)求和響應(yīng)報(bào)文都必須經(jīng)過LB進(jìn)行重寫,當(dāng)客戶請(qǐng)求越來越多時(shí),LB的處理能力將成為整個(gè)集群中的瓶頸。
為了解決這個(gè)問題,LB把請(qǐng)求報(bào)文通過IP隧道轉(zhuǎn)發(fā)至RS,而RS將響應(yīng)直接返回給客戶端,所以LB只需要處理請(qǐng)求報(bào)文。由于一般網(wǎng)絡(luò)服務(wù)應(yīng)答的數(shù)據(jù)包要比請(qǐng)求數(shù)據(jù)包大許多,采用 VS/TUN技術(shù)后,集群系統(tǒng)的最大吞吐量可以大大提高。

- 客戶端請(qǐng)求LVS集群提供的服務(wù),數(shù)據(jù)包發(fā)送到VIP
- LB檢查數(shù)據(jù)包的目的地址和端口,如果符合在LVS的規(guī)則表中定義添加的服務(wù),則根據(jù)調(diào)度算法從后端群集中選擇一個(gè)RS,并將該連接添加到記錄已建立連接的哈希表中
- LB對(duì)請(qǐng)求的數(shù)據(jù)包進(jìn)行封裝,在VIP外面再封裝一層目標(biāo)RS的IP地址,然后將它發(fā)送到對(duì)應(yīng)的RS上
- 當(dāng)傳入的數(shù)據(jù)包符合在LVS的規(guī)則表中定義添加的服務(wù)并且可以在哈希表中找到所選的RS時(shí),該數(shù)據(jù)包將被直接封裝IP并轉(zhuǎn)發(fā)到所選的RS
- RS接收到數(shù)據(jù)包后,對(duì)其進(jìn)行解封并且處理請(qǐng)求,然后將響應(yīng)數(shù)據(jù)包直接發(fā)送到客戶端
- 連接終止或超時(shí)后,連接記錄將在哈希表中刪除

注意在這種模式下的RS可以是在物理位置上分離的服務(wù)器(如可以分布在不同地區(qū)的機(jī)房),只要擁有在任意網(wǎng)絡(luò)中的任意真實(shí)IP即可(相對(duì)VIP而言)。此外,此時(shí)的RS需要支持IP封裝協(xié)議并且需要和LB直接配置好IP隧道,同時(shí)VIP需要配置到非ARP響應(yīng)的網(wǎng)卡設(shè)備上。

需要LB和RS上面的服務(wù)使用的端口必須保持一致,因此在添加配置規(guī)則的時(shí)候無需指定RS的端口。
Note that the services running on the real servers must run on the same port as virtual service, so it is not necessary to specify the service port on the real servers.
5、LVS via Direct Routing(DR)
VS/DR通過改寫請(qǐng)求報(bào)文的MAC地址,將請(qǐng)求發(fā)送到RS,而RS將響應(yīng)直接返回給客戶。和VS/TUN技術(shù)一樣,VS/DR技術(shù)可極大地提高集群系統(tǒng)的伸縮性。這種方法沒有IP隧道的開銷,對(duì)集群中的RS也沒有必須支持IP隧道協(xié)議的要求,但是因?yàn)槭褂玫氖荕AC地址進(jìn)行二層轉(zhuǎn)發(fā),所以要求LB和RS都有一塊網(wǎng)卡連在同一物理網(wǎng)段上。

- 客戶端請(qǐng)求LVS集群提供的服務(wù),數(shù)據(jù)包發(fā)送到VIP
- LB檢查數(shù)據(jù)包的目的地址和端口,如果符合在LVS的規(guī)則表中定義添加的服務(wù),則根據(jù)調(diào)度算法從后端群集中選擇一個(gè)RS,并將該連接添加到記錄已建立連接的哈希表中
- LB對(duì)請(qǐng)求的數(shù)據(jù)包進(jìn)行封裝,在VIP外面再封裝一層目標(biāo)RS的MAC地址,然后將它發(fā)送到對(duì)應(yīng)的RS上
- 當(dāng)傳入的數(shù)據(jù)包符合在LVS的規(guī)則表中定義添加的服務(wù)并且可以在哈希表中找到所選的RS時(shí),該數(shù)據(jù)包將被直接封裝IP并轉(zhuǎn)發(fā)到所選的RS
- 由于RS的本地lo接口上面綁定了VIP,且這時(shí)MAC地址是RS自身的MAC地址,所以RS接收到數(shù)據(jù)包后會(huì)處理請(qǐng)求,然后將響應(yīng)數(shù)據(jù)包直接發(fā)送到客戶端
- 連接終止或超時(shí)后,連接記錄將在哈希表中刪除

由于LB只是簡(jiǎn)單地對(duì)數(shù)據(jù)包的MAC地址更改為RS的MAC地址并且將其重新發(fā)送到局域網(wǎng)中,所以要求LB和RS必須要在同一個(gè)局域網(wǎng)中,這樣才能直接利用MAC來進(jìn)行二層傳輸。

注意DR模式也同樣不支持指定RS的服務(wù)端口,因此LB和RS的端口也必須保持一致。
6、ARP in LVS
細(xì)心觀察上面的DR模式,我們會(huì)發(fā)現(xiàn):
LB把數(shù)據(jù)包發(fā)送給RS的時(shí)候只修改了MAC,盡管在交換機(jī)上會(huì)根據(jù)MAC直接把包發(fā)送給RS,但是RS在接受到數(shù)據(jù)包之后還是會(huì)檢查數(shù)據(jù)包的目的IP和端口,此時(shí)數(shù)據(jù)包的目的IP依舊是VIP。所以這就是為什么需要在RS的網(wǎng)卡上面也綁定VIP的原因。(一般綁定在loopback接口)
那么當(dāng)LB和RS都綁定了VIP的時(shí)候,問題又來了:
當(dāng)客戶端的請(qǐng)求數(shù)據(jù)包傳到LVS集群所在的網(wǎng)關(guān)的時(shí)候,它是不知道LB的MAC地址的,因此需要通過ARP協(xié)議來進(jìn)行查詢,也就是在局域網(wǎng)中發(fā)送ARP請(qǐng)求,看誰會(huì)響應(yīng),響應(yīng)的就是要發(fā)送的MAC地址。而這個(gè)時(shí)候,由于DR模式下的LB和RS都在同一個(gè)局域網(wǎng)中且都綁定了VIP,那么它們就都會(huì)響應(yīng)這個(gè)ARP請(qǐng)求。這樣一來客戶端的數(shù)據(jù)包就不一定會(huì)發(fā)送到LB上面,也就不一定會(huì)觸發(fā)整個(gè)負(fù)載均衡效果。
因此這種情況下一般都會(huì)對(duì)RS上面的網(wǎng)卡接口的ARP請(qǐng)求設(shè)置進(jìn)行修改:
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
我們看一下kernel的文檔中對(duì)這兩個(gè)參數(shù)的相關(guān)描述
arp_ignore的意義
arp_ignore - INTEGER
Define different modes for sending replies in response to received ARP requests that resolve local target IP addresses:
0 - (default): reply for any local target IP address, configured on any interface
1 - reply only if the target IP address is local address configured on the incoming interface
2 - reply only if the target IP address is local address configured on the incoming interface and both with the sender's IP address are part from same subnet on this interface
3 - do not reply for local addresses configured with scope host, only resolutions for global and link addresses are replied
4-7 - reserved
8 - do not reply for all local addresses The max value from conf/{all,interface}/arp_ignore is used when ARP request is received on the {interface}

arp_ignore設(shè)置為0時(shí),無論收到的ARP請(qǐng)求的IP是否是eth上面的IP,只要在宿主機(jī)上有網(wǎng)卡有對(duì)應(yīng)的IP,就會(huì)發(fā)送ARP應(yīng)答。

arp_ignore設(shè)置為1即意味著對(duì)應(yīng)的網(wǎng)卡在收到了目標(biāo)IP不是自己的網(wǎng)卡的IP的數(shù)據(jù)包的ARP請(qǐng)求時(shí)不會(huì)進(jìn)行回應(yīng),而在DR模式中,對(duì)應(yīng)的VIP是綁定在lo接口上的,而lo接口并不是物理網(wǎng)卡,實(shí)際上數(shù)據(jù)包都是從物理網(wǎng)卡eth上進(jìn)來,因此這時(shí)就不會(huì)對(duì)目標(biāo)IP是VIP的數(shù)據(jù)包進(jìn)行ARP回應(yīng)。使得訪問能夠順利地到達(dá)LB上面,再從LB上面進(jìn)行負(fù)載均衡。
arp_annouce的意義
arp_announce - INTEGER
Define different restriction levels for announcing the local source IP address from IP packets in ARP requests sent on interface:
- 0 - (default) Use any local address, configured on any interface
- 1 - Try to avoid local addresses that are not in the target's subnet for this interface. This mode is useful when target hosts reachable via this interface require the source IP address in ARP requests to be part of their logical network configured on the receiving interface. When we generate the request we will check all our subnets that include the target IP and will preserve the source address if it is from such subnet. If there is no such subnet we select source address according to the rules for level 2.
- 2 - Always use the best local address for this target. In this mode we ignore the source address in the IP packet and try to select local address that we prefer for talks with the target host. Such local address is selected by looking for primary IP addresses on all our subnets on the outgoing interface that include the target IP address. If no suitable local address is found we select the first local address we have on the outgoing interface or on all other interfaces, with the hope we will receive reply for our request and even sometimes no matter the source IP address we announce. The max value from conf/{all,interface}/arp_announce is used.
每個(gè)機(jī)器或者交換機(jī)中都有一張ARP表,ARP表的作用就是用于記錄IP地址和MAC地址的對(duì)應(yīng)關(guān)系。當(dāng)收到一個(gè)ARP表中沒有記錄的IP地址的ARP請(qǐng)求,就會(huì)在本機(jī)的ARP表中新增對(duì)應(yīng)的IP和MAC記錄;當(dāng)收到一個(gè)已知IP地址(arp表中已有記錄的地址)的arp請(qǐng)求,則會(huì)根據(jù)arp請(qǐng)求中的源MAC刷新自己的arp表。
如果arp_announce參數(shù)配置為0,則網(wǎng)卡在發(fā)送arp請(qǐng)求時(shí),可能選擇的源IP地址并不是該網(wǎng)卡自身的IP地址,這時(shí)候收到該arp請(qǐng)求的其他節(jié)點(diǎn)或者交換機(jī)上的arp表中記錄的該網(wǎng)卡IP和MAC的對(duì)應(yīng)關(guān)系就不正確。
所以DR模式下要求arp_announce參數(shù)要求配置為2。
- 在這個(gè)模式下會(huì)忽略IP數(shù)據(jù)包中的源地址并且嘗試選擇能與目標(biāo)地址主機(jī)通信的本機(jī)地址
- 首先就是查找本機(jī)所有的出口網(wǎng)卡上的IP地址所屬的子網(wǎng)里面包含了目標(biāo)的IP地址的IP
- 如果沒有上述的合適的IP地址,那么就會(huì)選擇出口網(wǎng)卡的第一個(gè)IP地址或者是在所有的網(wǎng)卡中最有可能能夠接收到請(qǐng)求的IP地址
由于在DR模式中RS和LB的物理網(wǎng)卡是處于同一個(gè)局域網(wǎng)中的,所以會(huì)直接解析到對(duì)應(yīng)的物理網(wǎng)卡的MAC地址。