LVS原理與實(shí)現(xiàn) - 原理篇
LVS,全稱(chēng) Linux Virtual Server,是章文嵩博士發(fā)起的一個(gè)開(kāi)源項(xiàng)目。在社區(qū)具有很大的熱度,是一個(gè)基于四層、性能極高的反向代理服務(wù)器。至于什么是反向代理,這里就不作詳細(xì)介紹了,如果不了解可以先去閱讀反向代理相關(guān)的資料。
LVS工作原理
下面先介紹一下 LVS 的工作原理。
LVS的工作模式分為三種:NAT模式(網(wǎng)絡(luò)地址轉(zhuǎn)換)、DR模式(直接路由)?和?TUN模式(IP隧道)。
下面將詳細(xì)介紹每種工作模式的運(yùn)行原理。
名詞解析:
Director服務(wù)器:直接接收用戶請(qǐng)求的服務(wù)器,是LVS的入口。
Real-Server服務(wù)器:真實(shí)服務(wù)器,用于處理用戶請(qǐng)求的服務(wù)器。
虛擬IP(VIP):對(duì)外網(wǎng)暴露的 IP 地址,客戶端可以通過(guò) VIP 訪問(wèn) LVS 集群。
1. NAT模式
NAT模式?的運(yùn)行方式如下圖:

請(qǐng)求過(guò)程說(shuō)明:
client?發(fā)送請(qǐng)求到?LVS?的?VIP?上,Director?服務(wù)器首先根據(jù)?client?的 IP 和端口從連接信息表中查詢(xún)是否已經(jīng)存在,如果存在就直接使用當(dāng)前連接進(jìn)行處理。否則根據(jù)負(fù)載算法選擇一個(gè)?Real-Server(真正提供服務(wù)的服務(wù)器),并記錄連接到連接信息表中,然后把?client?請(qǐng)求的目的 IP 地址修改為?Real-Server?的地址,將請(qǐng)求發(fā)給?Real-Server。Real-Server?服務(wù)器收到請(qǐng)求包后,發(fā)現(xiàn)目的 IP 是自己的 IP,于是處理請(qǐng)求,然后發(fā)送回復(fù)給?Director?服務(wù)器。Director?服務(wù)器收到回復(fù)包后,修改回復(fù)包的源地址為VIP,發(fā)送給?client。
上圖中的藍(lán)色連接線表示請(qǐng)求的數(shù)據(jù)流向,而紅色連接線表示回復(fù)的數(shù)據(jù)流向。由于進(jìn)出流量都需要經(jīng)過(guò)?
Director?服務(wù)器,所以?Director?服務(wù)器可能會(huì)成功瓶頸。
下面通過(guò)一幅圖來(lái)說(shuō)明一個(gè)請(qǐng)求數(shù)據(jù)包在 LVS 服務(wù)器中的地址變化情況:

下面解釋一下請(qǐng)求數(shù)據(jù)包的地址變化過(guò)程:
client 向 LVS 集群發(fā)起請(qǐng)求,源IP地址和源端口為:
192.168.11.100:11021,而目標(biāo)IP地址和端口為:192.168.10.10:80。當(dāng)?Director?服務(wù)器接收到 client 的請(qǐng)求后,會(huì)根據(jù)調(diào)度算法選擇一臺(tái)合適的?Real-Server?服務(wù)器,并且把請(qǐng)求數(shù)據(jù)包的目標(biāo)IP地址和端口改為?Real-Server?服務(wù)器的IP地址和端口,并記錄連接信息到連接信息表中,如上圖選擇的?Real-Server?服務(wù)器的IP地址和端口為:192.168.1.2:80。當(dāng)?
Real-Server?服務(wù)器接收到請(qǐng)求后,對(duì)請(qǐng)求進(jìn)行處理,處理完后會(huì)把數(shù)據(jù)包的源IP地址和端口跟目標(biāo)IP地址和端口交互,然后發(fā)送給網(wǎng)關(guān)?192.168.1.1(也就是?Director?服務(wù)器)。Director?服務(wù)器接收到來(lái)自?Real-Server?服務(wù)器的回復(fù)數(shù)據(jù),然后根據(jù)連接信息把源IP地址更改為虛擬IP地址。
由于?
Real-Server?服務(wù)器需要把?Director?服務(wù)器設(shè)置為網(wǎng)關(guān),所以?Director?服務(wù)器與?Real-Server?服務(wù)器需要部署在同一個(gè)網(wǎng)絡(luò)下。
2. DR模式
DR模式?的運(yùn)行方式如下圖:

請(qǐng)求過(guò)程說(shuō)明:
client?發(fā)送請(qǐng)求到?LVS?的?VIP?上,Director?服務(wù)器首先根據(jù) client 的 IP 和端口從連接信息表中查詢(xún)是否已經(jīng)存在,如果存在就直接使用當(dāng)前連接進(jìn)行處理。否則根據(jù)負(fù)載算法選擇一個(gè)?Real-Server(真正提供服務(wù)的服務(wù)器),并記錄連接到連接信息表中,然后通過(guò)修改請(qǐng)求數(shù)據(jù)包的目標(biāo) MAC 地址為?Real-Server?服務(wù)器的 MAC 地址(注意:IP地址不修改),并通過(guò)局域網(wǎng)把數(shù)據(jù)包發(fā)送出去。由于?
Director?服務(wù)器與?Real-Server?服務(wù)器在同一局域網(wǎng)中,所以通過(guò)數(shù)據(jù)包的目標(biāo) MAC 地址可以找到對(duì)應(yīng)的?Real-Server?服務(wù)器(以太網(wǎng)協(xié)議),而?Real-Server?服務(wù)器接收到數(shù)據(jù)包后,會(huì)對(duì)數(shù)據(jù)包進(jìn)行處理。Real-Server?服務(wù)器處理完請(qǐng)求后,把處理結(jié)果直接發(fā)送給?client,而不會(huì)通過(guò)?Director?服務(wù)器。
注意:
Real-Server?服務(wù)器必須設(shè)置回環(huán)設(shè)備的 IP 地址為 VIP 地址,因?yàn)槿绻辉O(shè)置 VIP,那么?Real-Server?服務(wù)器會(huì)認(rèn)為這個(gè)數(shù)據(jù)包發(fā)送給本機(jī)的,從而丟棄這個(gè)數(shù)據(jù)包。
下面通過(guò)一幅圖來(lái)說(shuō)明一個(gè)請(qǐng)求數(shù)據(jù)包在 LVS 服務(wù)器中的地址變化情況:

下面解釋一下請(qǐng)求數(shù)據(jù)包的地址變化過(guò)程:
client 向 LVS 集群發(fā)起請(qǐng)求,源IP地址和源端口為:
192.168.11.100:11021,而目標(biāo)IP地址和端口為:192.168.10.10:80。當(dāng)?Director?服務(wù)器接收到 client 的請(qǐng)求后,會(huì)根據(jù)調(diào)度算法選擇一臺(tái)合適的?Real-Server?服務(wù)器,并且把請(qǐng)求數(shù)據(jù)包的目標(biāo) MAC 地址改為?Real-Server?服務(wù)器的 MAC 地址,并記錄連接信息到連接信息表中,然后通過(guò)局域網(wǎng)把數(shù)據(jù)包發(fā)送出去。當(dāng)?
Real-Server?服務(wù)器處理完請(qǐng)求后,會(huì)把處理結(jié)果直接發(fā)送給?client。如果?Real-Server?服務(wù)器與?client?在同一個(gè)局域網(wǎng),那么直接通過(guò)把目標(biāo) MAC 地址修改為?client?的 MAC 地址。否則,通過(guò)把目標(biāo) MAC 地址修改為路由器的 MAC 地址,然后通過(guò)路由器發(fā)送出去。
從上圖可以看出,整個(gè)請(qǐng)求過(guò)程中,數(shù)據(jù)包只有 MAC 地址發(fā)生變化。另外,由于?
DR模式?只有入口需要經(jīng)過(guò)?Director?服務(wù)器,而出口不需要經(jīng)過(guò)?Director?服務(wù)器,所以性能比?NAT模式?要高。
3. TUN模式
TUN模式?比較復(fù)雜一些,并且國(guó)內(nèi)使用得比較少,所以這里就不作介紹,有興趣自己查閱相關(guān)資料。
調(diào)度算法
上面介紹了 LVS 的工作模式,下面介紹一下 LVS 的調(diào)度算法。
由于 LVS 需要選擇合適的?Real-Server(RS)?服務(wù)器處理請(qǐng)求,所以需要根據(jù)不同的需求選擇不同的調(diào)度算法來(lái)選擇?Real-Server?服務(wù)器。LVS 的調(diào)度算法主要有以下幾種:
1. 輪詢(xún)調(diào)度(Round-Robin,RR)
最簡(jiǎn)單的調(diào)度算法,按照順序?qū)⒄?qǐng)求依次轉(zhuǎn)發(fā)給后端的RS。大部分情況下,RS的性能狀態(tài)都是各不一致的,這種算法顯然無(wú)法滿足合理利用資源的要求。
2. 帶權(quán)重的輪詢(xún)調(diào)度(Weighted Round-Robin,WRR)
在輪詢(xún)算法的基礎(chǔ)上加上權(quán)重設(shè)置,權(quán)重越高的RS被分配到的請(qǐng)求越多。適用于按照服務(wù)器性能高低,配置不同的權(quán)重,以達(dá)到合理的資源利用。
3. 最小連接調(diào)度(Least-Connection, LC)
把新的請(qǐng)求分配給連接數(shù)最少的RS。連接數(shù)少說(shuō)明服務(wù)器空閑。
4. 帶權(quán)重的最小連接調(diào)度(Weight Least-Connection, WLC)
在最小連接算法的基礎(chǔ)上加上權(quán)重設(shè)置,這樣可以人為地控制請(qǐng)求分配。
5. 基于局部性的最小連接調(diào)度(Locality-Based Least Connection, LBLC)
針對(duì)請(qǐng)求報(bào)文目標(biāo)IP地址的負(fù)載均衡調(diào)度。目前主要用于Cache集群系統(tǒng),因?yàn)樵贑ache集群中客戶請(qǐng)求報(bào)文的目標(biāo)IP地址是變化的。
算法的設(shè)計(jì)目標(biāo)是在服務(wù)器的負(fù)載基本平衡情況下,將相同目標(biāo)IP地址的請(qǐng)求調(diào)度到同一臺(tái)服務(wù)器,來(lái)提高各臺(tái)服務(wù)器的訪問(wèn)局部性和主存Cache命中率,提升整個(gè)集群系統(tǒng)的處理能力。
LBLC調(diào)度算法先根據(jù)請(qǐng)求的目標(biāo)IP地址找出該目標(biāo)IP地址最近使用的服務(wù)器,若該服務(wù)器是可用的且沒(méi)有超載,將請(qǐng)求發(fā)送到該服務(wù)器;若服務(wù)器不存在,或者該服務(wù)器超載且有服務(wù)器處于其一半的工作負(fù)載,則用“最小連接”的原則選出一個(gè)可用的服務(wù)器,將請(qǐng)求發(fā)送到該服務(wù)器。
6. 帶復(fù)制的基于局部性最小連接調(diào)度(Locality-Based Least Connections with Replication, LBLCR)
也是針對(duì)請(qǐng)求報(bào)文目標(biāo)IP地址的負(fù)載均衡調(diào)度,與LBLC算法不同之處:LBLC維護(hù)一個(gè)目標(biāo)IP到一臺(tái)服務(wù)器的映射,而LBLCR則需要維護(hù)一個(gè)目標(biāo)IP到一組服務(wù)器的映射。
LBLCR調(diào)度算法先根據(jù)請(qǐng)求的目標(biāo)IP地址找到對(duì)應(yīng)的服務(wù)器組,按“最小連接”原則從該服務(wù)器組中選出一臺(tái)服務(wù)器,若服務(wù)器沒(méi)有超載,則將請(qǐng)求發(fā)送到該服務(wù)器;若服務(wù)器超載,則按“最小連接”原則從整個(gè)集群中選出一臺(tái)服務(wù)器,將該服務(wù)器加入到服務(wù)組中,將請(qǐng)求發(fā)送給這臺(tái)服務(wù)器。同時(shí),當(dāng)該服務(wù)器組有一段時(shí)間沒(méi)有被修改,將最忙的服務(wù)器從服務(wù)器組中刪除,以降低復(fù)制的程度。
7. 目標(biāo)地址散列調(diào)度(Destination Hashing, DH)
也是針對(duì)請(qǐng)求報(bào)文目標(biāo)IP地址的負(fù)載均衡調(diào)度,但它是一種靜態(tài)映射算法,通過(guò)一個(gè)散列(Hash)函數(shù)將一個(gè)目標(biāo)IP地址映射到一臺(tái)服務(wù)器。DH算法先根據(jù)請(qǐng)求的目標(biāo)IP地址,作為散列鍵(Hash Key)從靜態(tài)分配的散列表找出對(duì)應(yīng)的服務(wù)器,若該服務(wù)器是可用的且為超載,將請(qǐng)求發(fā)送到該服務(wù)器,否則返回空。
8. 源地址散列調(diào)度(Source Hashing, SH)
該算法正好與DH調(diào)度算法相反,它根據(jù)請(qǐng)求的源IP地址,作為散列鍵從靜態(tài)分配的散列表找出對(duì)應(yīng)的服務(wù)器,若該服務(wù)器是可用的且未超載,將請(qǐng)求發(fā)送到該服務(wù)器,否則返回空。算法流程與目標(biāo)地址散列調(diào)度算法基本相似,只不過(guò)將請(qǐng)求的目標(biāo)IP地址換成請(qǐng)求的源IP地址。
總結(jié)
本文主要簡(jiǎn)單的介紹了 LVS 的運(yùn)行原理與調(diào)度算法,更多相關(guān)的資料可以查閱參考鏈接,而 LVS 的實(shí)現(xiàn)部分將會(huì)在另外一篇文章介紹。
參考鏈接:
http://www.linuxvirtualserver.org/Documents.html
http://www.linuxvirtualserver.org/VS-NAT.html
http://www.linuxvirtualserver.org/VS-DRouting.html
http://www.linuxvirtualserver.org/VS-IPTunneling.html
https://blog.51cto.com/blief/1745134
