全面分析:Web基礎(chǔ)架構(gòu)負載均衡LVS機制的原理
發(fā)布日期:2023/1/11 11:51:00 瀏覽量:
前提概要!
在大規(guī)?;ヂ?lián)網(wǎng)應(yīng)用中,負載均衡設(shè)備是必不可少的組成部分,源于互聯(lián)網(wǎng)應(yīng)用的高并發(fā)和大流量的沖擊壓力場景下,通常會在服務(wù)端部署多個無狀態(tài)的應(yīng)用服務(wù)器和若干有狀態(tài)的存儲服務(wù)器(數(shù)據(jù)庫、緩存等等)實現(xiàn)高可用特點和機制。LVS的介紹說明
- 官方站點:http://www.linuxvirtualserver.org;
- 用過LVS的朋友,其實大家的目的性很明確,就是需要通過LVS提供的負載均衡技術(shù)和Linux操作系統(tǒng)實現(xiàn)一個高性能,高可用的服務(wù)器群集;
- 并且這個集群具有良好的可靠性、可擴展性和可操作性,從而以低廉的成本實現(xiàn)最優(yōu)的服務(wù)性能,這也是大多數(shù)中小型公司青睞的架構(gòu);

負載均衡層(Load Balancer)
- 處于集群最前端,一臺或多臺構(gòu)成負載調(diào)度,俗稱負載調(diào)度器(Director Server);
- 分發(fā)請求給服務(wù)器集群組層的應(yīng)用服務(wù)器(Real Server);
- 監(jiān)控應(yīng)用服務(wù)器健康狀況,動態(tài)從LVS路由表中剔除、添加;
- 也可以兼職Real Server的身份;
- 負載均衡設(shè)備的任務(wù)就是作為應(yīng)用服務(wù)器流量的入口,挑選最合適的一臺服務(wù)器,將客戶端的請求轉(zhuǎn)發(fā)給它處理,實現(xiàn)客戶端到真實服務(wù)端的透明轉(zhuǎn)發(fā)
- 云計算以及分布式架構(gòu),本質(zhì)上也是將后端服務(wù)器作為計算資源、存儲資源,由某臺管理服務(wù)器封裝成一個服務(wù)對外提供,客戶端不需要關(guān)心真正提供服務(wù)的是哪臺機器,在它看來,就好像它面對的是一臺擁有近乎無限能力的服務(wù)器,而本質(zhì)上,真正提供服務(wù)的,是后端的集群支撐的計算能力。

負載均衡的類型
- 負載均衡可以采用硬件設(shè)備,也可以采用軟件負載。商用硬件負載設(shè)備成本通常較高(一臺幾十萬上百萬很正常)一般有F5和A10硬件負載均衡
- 所以在條件允許的情冴下我們會采用軟負載,軟負載解決的兩個核心問題是:選誰、轉(zhuǎn)發(fā),其中最著名的是 LVS(Linux Virtual Server)、Nginx、HAproxy等
LVS 是四層負載均衡,是我們國家著名技術(shù)專家:章文嵩博士研發(fā)的,也就是說建立在 OSI 模型的第四層——傳輸層之上,傳輸層上有我們熟悉的TCP/UDP,LVS支持TCP/UDP的負載均衡。
LVS的轉(zhuǎn)發(fā)主要通過修改IP地址(NAT模式,分為源地址修改SNAT和目標地址修改DNAT)、修改目標MAC(DR 模式)來實現(xiàn)。LVS是在第四層做負載均衡
- 首先,LVS不像HAProxy等七層軟負載面向的是HTTP包,所以七層負載可以做的URL解析等工作,LVS無法完成。
- 其次,用戶訪問是與服務(wù)端建立連接后交換數(shù)據(jù)包實現(xiàn)的,如果在第三層網(wǎng)絡(luò)層做負載均衡,那么將失去「連接」的語義
- 軟負載面向的對象應(yīng)該是一個已經(jīng)建立連接的用戶,而不是一個孤零零的 IP 包后面會看到,實際上 LVS 的機器代替真實的服務(wù)器的用戶通過TCP三次握手建立了連接所以 LVS 是需要關(guān)心「連接」級別的狀態(tài)的
- 一臺或多臺實際運行的應(yīng)用服務(wù)器構(gòu)成;
- 每個Real Server關(guān)聯(lián)時通過有效網(wǎng)絡(luò)互連;
提供共享存儲空間和內(nèi)容一致性的存儲區(qū)域;例如:數(shù)據(jù)庫、OSS存儲、FS文件服務(wù)器等。
LVS相關(guān)術(shù)語
- DS:Director Server。指的是前端負載均衡器節(jié)點。
- RS:Real Server。后端真實的工作服務(wù)器。
- VIP:向外部直接面向用戶請求,作為用戶請求的目標的IP地址。
- DIP:Director Server IP,主要用于和內(nèi)部主機通訊的IP地址。
- RIP:Real Server IP,后端服務(wù)器的IP地址。
- CIP:Client IP,訪問客戶端的IP地址。
- DR
- NAT
- TUNNEL
- Full-NAT
- TUN
返里挑選常用的 DR、NAT、Full-NAT、TUN 來簡單介紹一下。
DR(Dynamic Route 動態(tài)路由)
通過為請求報文重新封裝一個MAC首部進行轉(zhuǎn)發(fā),源MAC是DIP所在的接口的MAC,目標MAC是某挑選出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目標IP/PORT均保持不變;

請求由LVS接受,由真實提供服務(wù)的服務(wù)器(RealServer, RS)直接返回給用戶,返回的時
候不經(jīng)過 LVS。
流程分析
DR 模式下需要LVS和綁定同一個 VIP(RS 通過將 VIP綁定在 loopback 實現(xiàn)),此時報文的源IP為CIP,目標IP為VIP;
源地址
目的地址
CIP
VIP
源MAC地址
目的MAC地址
CIP-MAC
VIP-MAC
- 當用戶請求到達DS后,LVS只需要將網(wǎng)絡(luò)幀的MAC地址修改為某一臺RS的 MAC,該包就會被轉(zhuǎn)發(fā)到相應(yīng)的RS處理,注意此時的源IP和目標IP都沒變,LVS 只是做了一下移花接木
IPVS比對數(shù)據(jù)包請求的服務(wù)是否為集群服務(wù),若是,將請求報文中的源MAC地址修改為DIP的MAC地址,將目標MAC地址修改RIP的MAC地址, 此時的源IP和目的IP均未修改,僅修改了源MAC地址為DIP的MAC地址,目標MAC地址為RIP的MAC地址;
源地址
目的地址
CIP
VIP
源MAC地址
目的MAC地址
DIP-MAC
RIP-MAC
- 由于DS和RS在同一個網(wǎng)絡(luò)中,所以是通過二層來傳輸。目標MAC地址為RIP的MAC地址,那么此時數(shù)據(jù)包將會發(fā)至RS。
- RS 收到 LVS 轉(zhuǎn)發(fā)來的包,鏈路層發(fā)現(xiàn) MAC 是自己的,到上面的網(wǎng)絡(luò)層,發(fā)現(xiàn) IP 也是自己的,于是返個包被合法地接受,RS 感知不到前面有 LVS 的存在。處理完成之后,將響應(yīng)報文通過lo接口傳送給eth0網(wǎng)卡然后向外發(fā)出,此時的源IP地址為VIP,目標IP為CIP;
源地址
目的地址
VIP
CIP
- 響應(yīng)報文最終送達至客戶端,而當 RS 返回響應(yīng)時,只要直接向源 IP(即用戶的 IP)返回即可,不再經(jīng)過 LVS。DR 模式是性能最好的一種模式
這種模式下,有幾個要點:
主要是這種模式在于,通過LVS只是在請求階段做轉(zhuǎn)發(fā),而且修改的也不是IP地址,而是MAC地址,針對于修改后的MAC地址會自動轉(zhuǎn)發(fā)到對應(yīng)網(wǎng)段內(nèi)MAC主機的服務(wù)器上面,之后因為IP都沒有改變,之后實際RS可以直接發(fā)送給目標Client服務(wù)器,這種性能最好,但是對網(wǎng)絡(luò)層面要求比較高,對網(wǎng)絡(luò)擴展角度而言控制力度略低。NAT(Network Address Translation 網(wǎng)絡(luò)地址準換)
- NAT是一種外網(wǎng)和內(nèi)網(wǎng)地址映射的技術(shù)
- NAT模式下,網(wǎng)絡(luò)報的進出都要經(jīng)過LVS的處理
多目標IP的DNAT,通過將請求報文中的目標地址和目標端口修改為選出來的RS的RIP和PORT實現(xiàn)轉(zhuǎn)發(fā)。

流程分析
- LVS需要作為RS的網(wǎng)關(guān),當包到達LVS 時LVS 做目標地址轉(zhuǎn)換(DNAT)。此時報文的源IP為CIP,目標IP為VIP;
源地址
目的地址
CIP
VIP
- IPVS比對數(shù)據(jù)包請求的服務(wù)是否為集群服務(wù),若是,修改數(shù)據(jù)包的目標IP地址為后端服務(wù)器IP, 此時報文的源IP為CIP,目標IP為RIP;RS接收到包以后,仿佛是客戶端直接發(fā)給它的一樣。
源地址
目的地址
CIP
RIP
- RS比對發(fā)現(xiàn)目標為自己的IP,將請求處理完,返回響應(yīng)時,此時報文的源IP為RIP,目標IP為CIP;
源地址
目的地址
RIP
CIP
- 返回時RS的包通過網(wǎng)關(guān)(LVS)中轉(zhuǎn),LVS 會做源地址轉(zhuǎn)換(SNAT),將包的源地址改為VIP,這樣,這個包對客戶端看起來就仿佛是LVS直接返回給它的。此時會將源IP地址修改為自己的VIP地址,然后響應(yīng)給客戶端,此時報文的源IP為VIP,目標IP為CIP;
客戶端無法感知到后端RS 的存在
源地址
目的地址
VIP
CIP
要點
客戶端是不知道真是RS地址的,但是RS服務(wù)器卻是可以知道ClientIP的(因為數(shù)據(jù)包中會包含了ClientIP),但是由于中介LVS的原因,使得發(fā)送的時候發(fā)給VIP(LVS),返回的時候,由LVS把源地址修改為VIP,所以對于客戶端不能來講是不知道目標地址的RS的存在。這就是反向代理的概念,客戶端是不知道真正服務(wù)器的存在,知道的只有門面VIP的存在。
特性
- 要求DS具備雙網(wǎng)卡,VIP應(yīng)對公網(wǎng),而DIP必須和RIP在同一個網(wǎng)段內(nèi);
- RIP、DIP應(yīng)該使用私網(wǎng)地址,同在一個網(wǎng)段中,且RS的網(wǎng)關(guān)要指向DIP;
- 請求和響應(yīng)報文都要經(jīng)由DS轉(zhuǎn)發(fā),極高負載中,DS可能會成為系統(tǒng)瓶頸;
- RS可以使用任意OS;
在原有的IP報文外再次封裝多一層IP首部,內(nèi)部IP首部(源地址為CIP,目標IIP為VIP),外層IP首部(源地址為DIP,目標IP為RIP)。
流程分析
- 當用戶請求到達DS后,此時請求的數(shù)據(jù)報文會先到內(nèi)核空間的PREROUTING鏈,此時報文的源IP為CIP,目標IP為VIP;
源地址
目的地址
CIP
VIP
- PREROUTING檢查發(fā)現(xiàn)數(shù)據(jù)包的目標IP是本機,將數(shù)據(jù)包送至INPUT鏈;
- IPVS比對數(shù)據(jù)包請求的服務(wù)是否為集群服務(wù),若是,在請求報文的首部再次封裝一層IP報文,封裝源IP為為DIP,目標IP為RIP。然后發(fā)至POSTROUTING鏈。 此時源IP為DIP,目標IP為RIP;
IP首部源地址
IP首部目的地址
源地址
目的地址
DIP
RIP
CIP
VIP
- POSTROUTING鏈根據(jù)最新封裝的IP報文,將數(shù)據(jù)包發(fā)至RS(因為在外層封裝多了一層IP首部,所以可以理解為此時通過隧道傳輸),此時源IP為DIP,目標IP為RIP;
- RS接收到報文后發(fā)現(xiàn)是自己的IP地址,就將報文接收下來,拆除掉最外層的IP后,會發(fā)現(xiàn)里面還有一層IP首部,而且目標是自己的tun0接口VIP,那么此時RS開始處理此請求,處理完成之后,通過tun0接口送出去向外傳遞,此時的源IP地址為VIP,目標IP為CIP;
源地址
目的地址
VIP
CIP
- 響應(yīng)報文最終送達至客戶端;
1、DIP、VIP、RIP都應(yīng)該是公網(wǎng)地址;
2、RS的網(wǎng)關(guān)不能,也不可能指向DIP;
3、RS必須支持IP隧道;
Full-NAT
無論是 DR 還是 NAT 模式,不可避免的都有一個問題:LVS 和 RS 必須在同一個 vlan 下, 否則 LVS 無法作為 RS 的網(wǎng)關(guān)。
這引發(fā)的兩個問題是:
- 同一個VLAN的限制導(dǎo)致運維不方便,跨VLAN的RS無法接入
- LVS的水平擴展受到制約。當RS水平擴容時,總有一天其上的單點LVS會成為瓶頸
Full-NAT 由此而生,解決的是 LVS 和 RS 跨 VLAN 的問題,而跨 VLAN 問題解決后,LVS 和 RS 不再存在 VLAN 上的從屬關(guān)系,可以做到多個 LVS 對應(yīng)多個 RS,解決水平擴容的問 題。
Full-NAT 相比 NAT 的主要改迕是,在 SNAT/DNAT 的基礎(chǔ)上,加上另一種轉(zhuǎn)換,轉(zhuǎn)換過
程如下:

- 在包從 LVS 轉(zhuǎn)到 RS 的過程中,源地址從客戶端 IP 被替換成了 LVS 的內(nèi)網(wǎng) IP。
- 內(nèi)網(wǎng)IP之間可以通過多個交換機跨VLAN通信
- 當RS處理完接受到的包,返回時,會將返個包返回給LVS的內(nèi)網(wǎng)IP,返一步也不受限于VLAN。
- LVS 收到包后,在 NAT 模式修改源地址的基礎(chǔ)上,再把RS發(fā)來的包中的目標地址從LVS內(nèi)網(wǎng) IP 改為客戶端的 IP。
Full-NAT主要的思想是把網(wǎng)關(guān)和其下機器的通信,改為了普通的網(wǎng)絡(luò)通信,從而解決了跨 VLAN 的問題。采用返種方式,LVS 和 RS 的部署在 VLAN 上將不再有任何限制,大大提高了運維部署的便利性。
上面其實是把內(nèi)網(wǎng)ip和內(nèi)網(wǎng)ip之間通過交換機進行轉(zhuǎn)換捆綁,從而可以跨vlan進行服務(wù)請求代理。Session
客戶端與服務(wù)端的通信,一次請求可能包含多個TCP 包,LVS 必須保證同一連接的TCP包,必須被轉(zhuǎn)發(fā)到同一臺RS,否則就亂套了。為了確保返一點,LVS 內(nèi)部維護著一個 Session的 Hash 表,通過客戶端的某些信息可以找到應(yīng)該轉(zhuǎn)發(fā)到哪一臺 RS 上。LVS 集群化
采用 Full-NAT 模式后,可以搭建 LVS 的集群,拓撲結(jié)構(gòu)如下圖:

容災(zāi)
容災(zāi)分為 RS 的容災(zāi)和 LVS 的容災(zāi)。
RS 的容災(zāi)可以通過 LVS 定期健康檢測實現(xiàn),如果某臺 RS 失去心跳,則認為其已經(jīng)下線, 不會在轉(zhuǎn)發(fā)到該 RS 上。
LVS 的容災(zāi)可以通過主備+心跳的方式實現(xiàn)。主 LVS 失去心跳后,備 LVS 可以作為熱備立 即替換。
容災(zāi)主要是靠 KeepAlived 來做的。(心跳以及下線剔除或者替換工作主要通過keepalived進行控制)
馬上咨詢: 如果您有業(yè)務(wù)方面的問題或者需求,歡迎您咨詢!我們帶來的不僅僅是技術(shù),還有行業(yè)經(jīng)驗積累。
QQ: 39764417/308460098 Phone: 13 9800 1 9844 / 135 6887 9550 聯(lián)系人:石先生/雷先生