LVS 所提供的 IP 負(fù)載均衡的三種技術(shù)
1.LVS和負(fù)載均衡簡(jiǎn)介:
LVS是Linux Virtual Server的簡(jiǎn)寫(xiě),意即Linux虛擬服務(wù)器,是一個(gè)虛擬的服務(wù)器集群系統(tǒng)。
負(fù)載均衡就是有兩臺(tái)或者以上的服務(wù)器或者站點(diǎn)為我們提供服務(wù),我們將來(lái)自客戶(hù)端的請(qǐng)求靠某種算法盡量平均分?jǐn)偟竭@些集群中,從而避免一臺(tái)服務(wù)器因?yàn)樨?fù)載太高而出現(xiàn)故障。簡(jiǎn)而言之便是將所有的負(fù)載均分到多臺(tái)服務(wù)器中,即使其中某個(gè)出現(xiàn)故障,用戶(hù)也能正常訪問(wèn),得到服務(wù)。
廣泛使用的是用軟件的方式來(lái)實(shí)現(xiàn)負(fù)載均衡,實(shí)現(xiàn)效果不錯(cuò),并且不需要成本是很多企業(yè)選擇的方式。
以軟件實(shí)現(xiàn)的負(fù)載均衡有兩種方式:
- 基于應(yīng)用層負(fù)載均衡
 - 基于IP層負(fù)載均衡
 
文章主要就是介紹基于IP層負(fù)載均衡;
2.基于 IP 層負(fù)載均衡:
基于 IP 層負(fù)載均衡:用戶(hù)通過(guò)虛擬 IP 地址(Virtual IP Address)訪問(wèn)服務(wù)時(shí),訪問(wèn)請(qǐng)求的報(bào)文會(huì)到達(dá)負(fù)載調(diào)度器,由它進(jìn)行負(fù)載均衡調(diào)度,從一組真實(shí)服務(wù)器選出一個(gè),將報(bào)文處理并轉(zhuǎn)發(fā)給選定服務(wù)器的地址。實(shí)服務(wù)器的回應(yīng)報(bào)文經(jīng)過(guò)負(fù)載調(diào)度器時(shí),將報(bào)文的源地址和源端口改為 Virtual IP Address 和相應(yīng)的端口,再把報(bào)文發(fā)給用戶(hù)。
而 IP 的負(fù)載技術(shù)有以下三種模式:
- 通過(guò)NAT實(shí)現(xiàn)虛擬服務(wù)器(VS/NAT)
 - 通過(guò)IP隧道實(shí)現(xiàn)虛擬服務(wù)器(VS/TUN)
 - 通過(guò)直接路由實(shí)現(xiàn)虛擬服務(wù)器(VS/DR)
 
3.VS/NAT 實(shí)現(xiàn)虛擬服務(wù)器
由于 IPv4 中 IP 地址空間的日益緊張和安全方面的原因,很多網(wǎng)絡(luò)使用保留 IP 地址(10.0.0.0/255.0.0.0、 172.16.0.0/255.128.0.0和192.168.0.0/255.255.0.0)。這些地址不在 Internet 上使用,而是專(zhuān)門(mén)為內(nèi)部網(wǎng)絡(luò)預(yù)留的。
當(dāng)內(nèi)部網(wǎng)絡(luò)中的主機(jī)要訪問(wèn) Internet 或被 Internet 訪問(wèn)時(shí),就需要采用網(wǎng)絡(luò)地址轉(zhuǎn)換(Network Address Translation, 以下簡(jiǎn)稱(chēng)NAT),將內(nèi)部地址轉(zhuǎn)化為 Internet 上可用的外部地址。
NAT 的工作原理是報(bào)文頭(目標(biāo)地址、源地址和端口等)被正確改寫(xiě)后,客戶(hù)相信 它們連接一個(gè) IP 地址,而不同 IP 地址的服務(wù)器組也認(rèn)為它們是與客戶(hù)直接相連的。由此,可以用 NAT 方法將不同 IP 地址的并行網(wǎng)絡(luò)服務(wù)變成在一個(gè)IP地址上的一個(gè)虛擬服務(wù)。
VS/NAT(Virtual Server via Network Address Translation)實(shí)現(xiàn)的虛擬服務(wù)器是這樣的一個(gè)結(jié)構(gòu),主要經(jīng)過(guò)這樣的一些步驟:

LVS-NAT
- 客戶(hù)端通過(guò) Internet 向服務(wù)器發(fā)起請(qǐng)求,而請(qǐng)求的 IP 地址指向的是調(diào)度器上對(duì)外公布的 IP 地址;(因?yàn)樗⒉皇钦嬲幚碚?qǐng)求的服務(wù)器 IP 地址,所以稱(chēng)之為 虛擬 IP 地址,簡(jiǎn)稱(chēng)為 VIP,Virtual IP Address)
 - 請(qǐng)求報(bào)文到達(dá)調(diào)度器(Load Balancer),調(diào)度器根據(jù)調(diào)度算法從一組真實(shí)的服務(wù)器(因?yàn)樗麄兪钦嬲幚碛脩?hù)請(qǐng)求的服務(wù)器,所以稱(chēng)為真實(shí)服務(wù)器,Real server。其 IP 地址也被稱(chēng)為真實(shí) IP,簡(jiǎn)稱(chēng)為 RIP)中選出一臺(tái)當(dāng)前負(fù)載不高的服務(wù)器。然后將客戶(hù)端的請(qǐng)求報(bào)文中的目標(biāo)地址(Load Balancer 的 VIP)和端口通過(guò) iptables 的 NAT 改寫(xiě)為選定服務(wù)器的 IP 地址和服務(wù)的端口。最后將修改后的報(bào)文發(fā)送給選出的服務(wù)器。同時(shí),調(diào)度器在連接Hash 表中記錄這個(gè)連接;當(dāng)這個(gè)連接的下一個(gè)報(bào)文到達(dá)時(shí),從連接Hash表中可以得到原選定服務(wù)器的地址和端口,進(jìn)行同樣的改寫(xiě)操作,并將報(bào)文傳給原選定的服務(wù)器。
 - Real Server 接收到報(bào)文之后,做出了響應(yīng)的處理,然后將響應(yīng)的報(bào)文發(fā)送給 Load Balancer;
 - Load Balancer 接收到響應(yīng)的報(bào)文時(shí),將報(bào)文的源地址和源端口改為Virtual IP Address和相應(yīng)的端口,再把報(bào)文發(fā)給用戶(hù)。
 
這樣,客戶(hù)所看到的只是在 Virtual IP Address 上提供的服務(wù),而服務(wù)器集群的結(jié)構(gòu)對(duì)用戶(hù)是透明的。
下面,舉個(gè)例子來(lái)進(jìn)一步說(shuō)明VS/NAT,如圖所示:

NAT-eg
VS/NAT 的配置如下表所示,所有到IP地址為205.100.106.2和端口為80的流量都被負(fù)載均衡地調(diào)度的真實(shí)服務(wù)器172.16.1.3:80和 172.16.1.4:8080上。目標(biāo)地址為205.100.106.2:21的報(bào)文被轉(zhuǎn)移到172.16.1.3:21上。而到其他端口的報(bào)文將被拒絕。
| 
             Protocol  | 
            
             Virtual IP Address  | 
            
             Port  | 
            
             Real IP Address  | 
            
             Port  | 
        
|---|---|---|---|---|
| 
             TCP  | 
            
             205.100.106.2  | 
            
             80  | 
            
             172.16.1.3  | 
            
             80  | 
        
| 
             172.16.1.4  | 
            
             8080  | 
        |||
| 
             TCP  | 
            
             205.100.106.2  | 
            
             21  | 
            
             172.16.1.3  | 
            
             21  | 
        
當(dāng)客戶(hù)端訪問(wèn)Web服務(wù)的時(shí)候,報(bào)文中可能有以下的源地址和目標(biāo)地址:
| 
             SOURCE  | 
            
             DEST  | 
        
|---|---|
| 
             203.100.106.1:3456  | 
            
             205.100.106.2:80  | 
        
報(bào)文到達(dá)調(diào)度器之后,調(diào)度器從調(diào)度列表中選出一臺(tái)服務(wù)器,例如是172.16.1.4:8080。該報(bào)文會(huì)被改寫(xiě)為如下地址,并將它發(fā)送給選出的服務(wù)器。
| 
             SOURCE  | 
            
             DEST  | 
        
|---|---|
| 
             203.100.106.1:3456  | 
            
             172.16.1.4:8080  | 
        
Real Server 收到修改后的報(bào)文之后,做出響應(yīng),然后將響應(yīng)報(bào)文返回到調(diào)度器,報(bào)文如下:
| 
             SOURCE  | 
            
             DEST  | 
        
|---|---|
| 
             172.16.1.4:8080  | 
            
             203.100.106.1:3456  | 
        
響應(yīng)報(bào)文的源地址會(huì)被 Load Balacer 改寫(xiě)為虛擬服務(wù)的地址,再將報(bào)文發(fā)送給客戶(hù):
| 
             SOURCE  | 
            
             DEST  | 
        
|---|---|
| 
             205.100.106.2:80  | 
            
             203.100.106.1:3456  | 
        
這樣,客戶(hù)認(rèn)為是從202.103.106.5:80服務(wù)得到正確的響應(yīng),而不會(huì)知道該請(qǐng)求是 Real Server1 還是 Real Server2 處理的。
這便是 VS/NAT 的處理數(shù)據(jù)包的整個(gè)過(guò)程,它有這樣的一些特點(diǎn):
- 集群節(jié)點(diǎn),也就是 Real Server 與 Load Balacer 必須在同一個(gè) IP 網(wǎng)絡(luò)中
 - Load Balancer 位于 Real Server 與客戶(hù)端之間,處理進(jìn)出的所有通信
 - RIP 通常是私有地址,僅用于各個(gè)集群節(jié)點(diǎn)之間的通信。
 - Real Server 的網(wǎng)關(guān)必須指向 Load Balancer
 - 支持端口映射:也就是Real Server 的端口可以自己設(shè)定,沒(méi)有必須是與 Load Balancer 一樣
 
VS/NAT 的優(yōu)勢(shì)在于可以做到端口映射,但是 Load Balancer 將可能成為集群的瓶頸。因?yàn)樗械某鋈雸?bào)文都需要 Load Balancer 處理,請(qǐng)求報(bào)文較小不是問(wèn)題,但是響應(yīng)報(bào)文往往較大,都需要 NAT 轉(zhuǎn)換的話(huà),大流量的時(shí)候,Load Balancer 將會(huì)處理不過(guò)來(lái)。一般使用 VS/NAT 的話(huà),處理 Real Server 數(shù)量達(dá)到 10~20 臺(tái)左右將是極限,并且效率往往不高。
4.VS/DR 實(shí)現(xiàn)虛擬服務(wù)器
在VS/NAT 的集群系統(tǒng)中,請(qǐng)求和響應(yīng)的數(shù)據(jù)報(bào)文都需要通過(guò)負(fù)載調(diào)度器,當(dāng)真實(shí)服務(wù)器的數(shù)目在10臺(tái)和20臺(tái)之間時(shí),負(fù)載調(diào)度器將成為整個(gè)集群系統(tǒng)的新瓶頸。大多數(shù) Internet服務(wù)都有這樣的特點(diǎn):請(qǐng)求報(bào)文較短而響應(yīng)報(bào)文往往包含大量的數(shù)據(jù)。
既然同時(shí)處理進(jìn)出報(bào)文會(huì)大大的影響效率,增加機(jī)器的負(fù)載,那么若是僅僅處理進(jìn)來(lái)的報(bào)文,即在負(fù)載調(diào)度器中只負(fù)責(zé)調(diào)度請(qǐng)求,而出去的報(bào)文由 Real Server 直接發(fā)給客戶(hù)端這樣豈不是高效許多。
VS/DR(Virtual Server via Direct Routing)利用大多數(shù)Internet服務(wù)的非對(duì)稱(chēng)特點(diǎn),負(fù)載調(diào)度器中只負(fù)責(zé)調(diào)度請(qǐng)求,而服務(wù)器直接將響應(yīng)返回給客戶(hù),可以極大地提高整個(gè)集群 系統(tǒng)的吞吐量。
VS/DR 實(shí)現(xiàn)的虛擬服務(wù)器是這樣的一個(gè)結(jié)構(gòu),主要經(jīng)過(guò)這樣的一些步驟:

DR-sturct
- 客戶(hù)端通過(guò) Internet 向服務(wù)器發(fā)起請(qǐng)求,而請(qǐng)求的 IP 地址指向的是調(diào)度器上對(duì)外公布的 IP 地址;
 - 請(qǐng)求報(bào)文到達(dá)調(diào)度器(Load Balancer),調(diào)度器根據(jù)各個(gè)服務(wù)器的負(fù)載情況,動(dòng)態(tài)地選擇一臺(tái)服務(wù)器,不修改也不封裝IP報(bào)文,而是將數(shù)據(jù)幀的MAC地址改為選出服務(wù)器的MAC地址,再將修改后 的數(shù)據(jù)幀在與服務(wù)器組的局域網(wǎng)上發(fā)送。因?yàn)閿?shù)據(jù)幀的MAC地址是選出的服務(wù)器,所以服務(wù)器肯定可以收到這個(gè)數(shù)據(jù)幀;
 - Real Server 接收到報(bào)文之后,發(fā)現(xiàn)報(bào)文的目標(biāo)地址 VIP 是在本地的網(wǎng)絡(luò)設(shè)備上,服務(wù)器處理這個(gè)報(bào)文,然后根據(jù)路由表將響應(yīng)報(bào)文直接返回給客戶(hù)。
 

change-MAC
在VS/DR中,根據(jù)缺省的TCP/IP協(xié)議棧處理,請(qǐng)求報(bào)文的目標(biāo)地址為VIP,響應(yīng)報(bào)文的源地址肯定也為VIP,所以響應(yīng)報(bào)文不需要作任何修改,可以直接返回給客戶(hù),客戶(hù)認(rèn)為得到正常的服務(wù),而不會(huì)知道是哪一臺(tái)服務(wù)器處理的。
這便是 VS/DR 的處理數(shù)據(jù)包的整個(gè)過(guò)程,它有這樣的一些特點(diǎn):
- 集群節(jié)點(diǎn),也就是 Real Server 與 Load Balacer 必須在同一個(gè)物理網(wǎng)絡(luò)中(若是不同網(wǎng)段的話(huà)結(jié)構(gòu)將變得復(fù)雜)
 - RIP 通常是私有地址,也可以是公網(wǎng)地址,以便于遠(yuǎn)程管理與監(jiān)控。
 - Load Balancer 僅僅負(fù)責(zé)處理入站的請(qǐng)求,Real Server 將直接響應(yīng)客戶(hù)端
 - Real Server 的網(wǎng)關(guān)不能指向 Load Balancer
 - 不支持端口映射:也就是Real Server 的端口必須是與 Load Balancer 對(duì)外服務(wù)的一樣
 
5.VS/TUN 實(shí)現(xiàn)虛擬服務(wù)器
VS/DR 限制 Real Server 與 Load Balancer 必須在同一個(gè)物理網(wǎng)絡(luò)中,那若是分散在各地豈不是無(wú)法使用?所以有了 VS/TUN(Virtual Server via IP Tunneling)的誕生。
IP隧道(IP tunneling)是將一個(gè)IP報(bào)文封裝在另一個(gè)IP報(bào)文的技術(shù),這可以使得目標(biāo)為一個(gè)IP地址的數(shù)據(jù)報(bào)文能被封裝和轉(zhuǎn)發(fā)到另一個(gè)IP地址。IP隧道技術(shù)亦稱(chēng)為IP封裝技術(shù)(IP encapsulation)。IP隧道主要用于移動(dòng)主機(jī)和虛擬私有網(wǎng)絡(luò)(Virtual Private Network),在其中隧道都是靜態(tài)建立的,隧道一端有一個(gè)IP地址,另一端也有唯一的IP地址。
我們利用IP隧道技術(shù)將請(qǐng)求報(bào)文封裝轉(zhuǎn)發(fā)給后端服務(wù)器,響應(yīng)報(bào)文能從后端服務(wù)器直接返回給客戶(hù)。但在這里,后端服務(wù)器有一組而非一個(gè),所以我們不可能靜態(tài)地建立一一對(duì)應(yīng)的隧道,而是動(dòng)態(tài)地選擇 一臺(tái)服務(wù)器,將請(qǐng)求報(bào)文封裝和轉(zhuǎn)發(fā)給選出的服務(wù)器。這樣,我們可以利用IP隧道的原理將一組服務(wù)器上的網(wǎng)絡(luò)服務(wù)組成在一個(gè)IP地址上的虛擬網(wǎng)絡(luò)服務(wù)。 VS/TUN的體系結(jié)構(gòu)如圖所示,各個(gè)服務(wù)器將VIP地址配置在自己的IP隧道設(shè)備上。

Tunnel-sturct
它的連接調(diào)度和管理與VS/NAT中的一樣,只是它的報(bào)文轉(zhuǎn)發(fā)方法不同。調(diào)度器根據(jù)各個(gè)服務(wù)器的負(fù)載情況,動(dòng)態(tài)地選擇一臺(tái)服務(wù)器, 將請(qǐng)求報(bào)文封裝在另一個(gè) IP 報(bào)文中,再將封裝后的 IP 報(bào)文轉(zhuǎn)發(fā)給選出的服務(wù)器;服務(wù)器收到報(bào)文后,先將報(bào)文解封獲得原來(lái)目標(biāo)地址為 VI P的報(bào)文,服務(wù)器發(fā)現(xiàn)VIP地址被配置在本地的 IP隧道設(shè)備上,所以就處理這個(gè)請(qǐng)求,然后根據(jù)路由表將響應(yīng)報(bào)文直接返回給客戶(hù)。
這便是 VS/TUN 的處理數(shù)據(jù)包的整個(gè)過(guò)程,它有這樣的一些特點(diǎn):
- 集群節(jié)點(diǎn),也就是 Real Server 與 Load Balacer 可以跨越公網(wǎng)
 - RIP 必須是公網(wǎng)地址。
 - Load Balancer 僅僅負(fù)責(zé)處理入站的請(qǐng)求,Real Server 將直接響應(yīng)客戶(hù)端
 - Real Server 的網(wǎng)關(guān)不能指向 Load Balancer
 - 不支持端口映射:也就是Real Server 的端口必須是與 Load Balancer 對(duì)外服務(wù)的一樣
 
這便是 LVS 所提供的 IP 負(fù)載均衡的三種技術(shù),我們可以根據(jù)自己的情況做出不同的選擇。
















 
 
 
 
 
 
 