LVS 工作原理圖文講解,非常詳細!

LVS 工作原理圖文講解,非常詳細!
原創 肖邦Linux DevOps技術棧 今天
作者:肖邦Linux
博客地址:https://blog.csdn.net/liwei0526vip

一、負載均衡由來

在業務初期,我們一般會先使用單臺服務器對外提供服務。隨着業務流量越來越大,單臺服務器無論如何優化,無論採用多好的硬件,總會有性能天花板,當單服務器的性能無法滿足業務需求時,就需要把多臺服務器組成集羣系統提高整體的處理性能。不過我們要使用統一的入口方式對外提供服務,所以需要一個 流量調度器 通過均衡的算法,將用戶大量的請求均衡地分發到後端集羣不同的服務器上。這就是我們後邊要說的 負載均衡。

使用負載均衡帶來的好處:

提高了系統的整體性能
提高了系統的擴展性
提高了系統的可用性

二、負載均衡類型

廣義上的負載均衡器大概可以分爲 3 類,包括:DNS 方式實現負載均衡、硬件負載均衡、軟件負載均衡。

2.1 DNS 實現負載均衡

DNS 實現負載均衡是最基礎簡單的方式。一個域名通過 DNS 解析到多個 IP,每個 IP 對應不同的服務器實例,這樣就完成了流量的調度,雖然沒有使用常規的負載均衡器,但也的確完成了簡單負載均衡的功能。

LVS 工作原理圖文講解,非常詳細!

通過 DNS 實現負載均衡的方式,最大的優點就是實現簡單,成本低,無需自己開發或維護負載均衡設備,不過存在一些缺點:

服務器故障切換延遲大,服務器升級不方便。我們知道 DNS 與用戶之間是層層的緩存,即便是在故障發生時及時通過 DNS 修改或摘除故障服務器,但中間由於經過運營商的 DNS 緩存,且緩存很有可能不遵循 TTL 規則,導致 DNS 生效時間變得非常緩慢,有時候一天後還會有些許的請求流量。

流量調度不均衡,粒度太粗。DNS 調度的均衡性,受地區運營商 LocalDNS 返回 IP 列表的策略有關係,有的運營商並不會輪詢返回多個不同的 IP 地址。另外,某個運營商 LocalDNS 背後服務了多少用戶,這也會構成流量調度不均的重要因素。

流量分配策略比較簡單,支持的算法較少。DNS 一般只支持 RR 的輪詢方式,流量分配策略比較簡單,不支持權重、Hash 等調度算法。

DNS 支持的 IP 列表有限制。我們知道 DNS 使用 UDP 報文進行信息傳遞,每個 UDP 報文大小受鏈路的 MTU 限制,所以報文中存儲的 IP 地址數量也是非常有限的,阿里 DNS 系統針對同一個域名支持配置 10 個不同的 IP 地址。

實際上生產環境中很少使用這種方式來實現負載均衡,畢竟缺點很明顯。文中之所以描述 DNS 負載均衡方式,是爲了能夠更清楚地解釋負載均衡的概念。一些大公司一般也會利用 DNS 來實現地理級別的負載均衡,實現就近訪問,提高訪問速度,這種方式一般是入口流量的基礎負載均衡,下層會有更專業的負載均衡設備實現的負載架構。

2.2 硬件負載均衡

硬件負載均衡是通過專門的硬件設備來實現負載均衡功能,類似於交換機、路由器,是一個負載均衡專用的網絡設備。目前業界典型的硬件負載均衡設備有兩款:F5 和 A10。這類設備性能強勁、功能強大,但價格非常昂貴,一般只有 “土豪” 公司纔會使用此類設備,普通業務量級的公司一般負擔不起,二是業務量沒那麼大,用這些設備也是浪費。

硬件負載均衡的優點:

功能強大:全面支持各層級的負載均衡,支持全面的負載均衡算法。

性能強大:性能遠超常見的軟件負載均衡器。

穩定性高:商用硬件負載均衡,經過了良好的嚴格測試,經過大規模使用,穩定性高。

安全防護:除了具備負載均衡外,還具備防火牆、防 DDoS ***等安全功能,貌似還支持 SNAT 功能。

硬件負載均衡的缺點:

價格昂貴,就是貴。

擴展性差,無法進行擴展和定製。

調試和維護比較麻煩,需要專業人員。

注:至今沒有用過硬件負載均衡,不過有幸曾經與 F5 有過一面之緣。

2.3 軟件負載均衡

軟件負載均衡,可以在普通的服務器上運行負載均衡軟件,實現負載均衡功能。目前常見的有 Nginx、HAproxy、LVS。其中的區別:

Nginx :是 7 層負載均衡,支持 HTTP、E-mail 協議,貌似也支持 4 層負載均衡了。

HAproxy :是 7 層負載均衡軟件,支持 7 層規則的設置,性能也很不錯。OpenStack 默認使用的負載均衡軟件就是 HAproxy。

LVS :是純 4 層的負載均衡,運行在內核態,性能是軟件負載均衡中最高的,因爲是在四層,所以也更通用一些。

軟件負載均衡的優點:

簡單:無論是部署還是維護都比較簡單。

便宜:買個 Linux 服務器,裝上軟件即可。

靈活:4 層和 7 層負載均衡可以根據業務進行選擇;也可以根據業務特點,比較方便進行擴展和定製功能。

三、開源負載均衡器 LVS

軟件負載均衡主要包括:Nginx、HAproxy 和 LVS。其實三款負載均衡軟件都十分常用。四層負載均衡基本上都會使用 LVS,據瞭解如 BAT 等大廠都是 LVS 重度使用者,就是因爲 LVS 非常出色的性能,能爲公司節省很大成本。

瞭解到很多大公司使用的 LVS 都是定製版的,做過很多性能方面的優化,比開源版本性能會高出很多。目前只有淘寶開源過優化過的 alibaba/LVS,支持 FNAT 模式,但是也很久沒有更新過了。另外愛奇藝去年開源出了 DPDK 版本的 LVS,名叫 DPVS,性能非常強悍。

目前較爲熟悉的負載均衡軟件是 LVS,且大部分中小型公司使用開源的 LVS 足夠滿足業務需求。

3.1 netfilter基本原理

LVS 是基於 Linux 內核中 netfilter 框架實現的負載均衡系統,所以要學習 LVS 之前必須要先簡單瞭解 netfilter 基本工作原理。netfilter 其實很複雜也很重要,平時我們說的 Linux 防火牆就是 netfilter,不過我們平時操作的都是 iptables,iptables 只是用戶空間編寫和傳遞規則的工具而已,真正工作的是 netfilter。通過下圖可以簡單瞭解下 netfilter 的工作機制:
LVS 工作原理圖文講解,非常詳細!

netfilter 是內核態的 Linux 防火牆機制,作爲一個通用、抽象的框架,提供了一整套的 hook 函數管理機制,提供諸如數據包過濾、網絡地址轉換、基於協議類型的連接跟蹤的功能。

通俗點講,就是 netfilter 提供一種機制,可以在數據包流經過程中,根據規則設置若干個關卡(hook 函數)來執行相關的操作。netfilter 總共設置了 5 個點,包括:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING

PREROUTING :剛剛進入網絡層,還未進行路由查找的包,通過此處;
INPUT :通過路由查找,確定發往本機的包,通過此處;
FORWARD :經路由查找後,要轉發的包,在POST_ROUTING之前;
OUTPUT :從本機進程剛發出的包,通過此處;
POSTROUTING :進入網絡層已經經過路由查找,確定轉發,將要離開本設備的包,通過此處;

當一個數據包進入網卡,經過鏈路層之後進入網絡層就會到達 PREROUTING,接着根據目標 IP 地址進行路由查找,如果目標 IP 是本機,數據包繼續傳遞到 INPUT 上,經過協議棧後根據端口將數據送到相應的應用程序;應用程序處理請求後將響應數據包發送到 OUTPUT 上,最終通過 POSTROUTING 後發送出網卡。如果目標 IP 不是本機,而且服務器開啓了 forward 參數,就會將數據包遞送給 FORWARD 上,最後通過 POSTROUTING 後發送出網卡。

3.2 LVS基本原理

LVS 是基於 netfilter 框架,主要工作於 INPUT 鏈上,在 INPUT 上註冊 ip_vs_in HOOK 函數,進行 IPVS 主流程,大概原理如圖所示:
LVS 工作原理圖文講解,非常詳細!

當用戶訪問 www.sina.com.cn 時,用戶數據通過層層網絡,最後通過交換機進入 LVS 服務器網卡,並進入內核網絡層。

進入 PREROUTING 後經過路由查找,確定訪問的目的 VIP 是本機 IP 地址,所以數據包進入到 INPUT 鏈上。

IPVS 是工作在 INPUT 鏈上,會根據訪問的 vip+port 判斷請求是否 IPVS 服務,如果是則調用註冊的 IPVS HOOK 函數,進行 IPVS 相關主流程,強行修改數據包的相關數據,並將數據包發往 POSTROUTING 鏈上。

POSTROUTING 上收到數據包後,根據目標 IP 地址(後端服務器),通過路由選路,將數據包最終發往後端的服務器上。

開源 LVS 版本有 3 種工作模式,每種模式工作原理截然不同,說各種模式都有自己的優缺點,分別適合不同的應用場景,不過最終本質的功能都是能實現均衡的流量調度和良好的擴展性。主要包括以下三種模式:

DR 模式
NAT 模式
Tunnel 模式

另外必須要說的模式是 FullNAT,這個模式在開源版本中是模式沒有的,代碼 沒有合併進入內核主線版本,後面會有專門章節詳細介紹 FullNAT 模式。下邊分別就 DR、NAT、Tunnel 模式分別詳細介紹原理。

3.3 DR 模式實現原理

LVS 基本原理圖(上圖)中描述的比較簡單,表述的是比較通用流程。下邊會針對 DR 模式的具體實現原理,詳細的闡述 DR 模式是如何工作的。

LVS 工作原理圖文講解,非常詳細!

其實 DR 是最常用的工作模式,因爲它的強大的性能。下邊以一次請求和響應數據流的過程來描述 DR 模式的具體原理。

(一)實現原理過程

① 當客戶端請求 www.sina.com.cn 主頁,經過 DNS 解析到 IP 後,向新浪服務器發送請求數據,數據包經過層層網絡到達新浪負載均衡 LVS 服務器,到達 LVS 網卡時的數據包:源 IP 是客戶端 IP 地址 CIP,目的 IP 是新浪對外的服務器 IP 地址,也就是 VIP;此時源 MAC 地址是 CMAC,其實是 LVS 連接的路由器的 MAC 地址(爲了容易理解記爲 CMAC),目標 MAC 地址是 VIP 對應的 MAC,記爲 VMAC。

② 數據包到達網卡後,經過鏈路層到達 PREROUTING 位置(剛進入網絡層),查找路由發現目的 IP 是 LVS 的 VIP,就會遞送到 INPUT 鏈上,此時數據包 MAC、IP、Port 都沒有修改。

③ 數據包到達 INPUT 鏈,INPUT 是 LVS 主要工作的位置。此時 LVS 會根據目的 IP 和 Port 來確認是否是 LVS 定義的服務,如果是定義過的 VIP 服務,就會根據配置的 Service 信息,從 RealServer 中選擇一個作爲後端服務器 RS1,然後以 RS1 作爲目標查找 Out 方向的路由,確定一下跳信息以及數據包要通過哪個網卡發出。最後將數據包通過 INET_HOOK 到 OUTPUT 鏈上(Out 方向剛從四層進入網絡層)。

④ 數據包通過 POSTROUTING 鏈後,從網絡層轉到鏈路層,將目的 MAC 地址修改爲 RealServer 服務器 MAC 地址,記爲 RMAC;而源 MAC 地址修改爲 LVS 與 RS 同網段的 selfIP 對應的 MAC 地址,記爲 DMAC。此時,數據包通過交換機轉發給了 RealServer 服務器(注:爲了簡單圖中沒有畫交換機)。

⑤ 請求數據包到達 RealServer 服務器後,鏈路層檢查目的 MAC 是自己網卡地址。到了網絡層,查找路由,目的 IP 是 VIP(lo 上配置了 VIP),判定是本地主機的數據包,經過協議棧後拷貝至應用程序(比如這裏是 nginx 服務器),nginx 響應請求後,產生響應數據包。以目的 VIP 爲 dst 查找 Out 路由,確定嚇一跳信息和發送網卡設備信息,發送數據包。此時數據包源、目的 IP 分別是 VIP、CIP,而源 MAC 地址是 RS1 的 RMAC,目的 MAC 是下一跳(路由器)的 MAC 地址,記爲 CMAC(爲了容易理解,記爲 CMAC)。然後數據包通過 RS 相連的路由器轉發給真正客戶端。

從整個過程可以看出,DR 模式 LVS 邏輯非常簡單,數據包通過路由方式直接轉發給 RS,而且響應數據包是由 RS 服務器直接發送給客戶端,不經過 LVS。我們知道一般請求數據包會比較小,響應報文較大,經過 LVS 的數據包基本上都是小包,上述幾條因素是 LVS 的 DR 模式性能強大的主要原因。

(二)優缺點和使用場景

DR 模式的優點
a. 響應數據不經過 lvs,性能高
b. 對數據包修改小,信息保存完整(攜帶客戶端源 IP)

DR 模式的缺點
a. lvs 與 rs 必須在同一個物理網絡(不支持跨機房)
b. rs 上必須配置 lo 和其它內核參數
c. 不支持端口映射

DR 模式的使用場景

如果對性能要求非常高,可以首選 DR 模式,而且可以透傳客戶端源 IP 地址。

3.4 NAT 模式實現原理

lvs 的第 2 種工作模式是 NAT 模式,下圖詳細介紹了數據包從客戶端進入 lvs 後轉發到 rs,後經 rs 再次將響應數據轉發給 lvs,由 lvs 將數據包回覆給客戶端的整個過程。

LVS 工作原理圖文講解,非常詳細!

(一)實現原理與過程

① 用戶請求數據包經過層層網絡,到達 lvs 網卡,此時數據包源 IP 是 CIP,目的 IP 是 VIP。

② 經過網卡進入網絡層 prerouting 位置,根據目的 IP 查找路由,確認是本機 IP,將數據包轉發到 INPUT 上,此時源、目的 IP 都未發生變化。

③ 到達 lvs 後,通過目的 IP 和目的 port 查找是否爲 IPVS 服務。若是 IPVS 服務,則會選擇一個 RS 作爲後端服務器,將數據包目的 IP 修改爲 RIP,並以 RIP 爲目的 IP 查找路由信息,確定下一跳和出口信息,將數據包轉發至 output 上。

④ 修改後的數據包經過 postrouting 和鏈路層處理後,到達 RS 服務器,此時的數據包源 IP 是 CIP,目的 IP 是 RIP。

⑤ 到達 RS 服務器的數據包經過鏈路層和網絡層檢查後,被送往用戶空間 nginx 程序。nginx 程序處理完畢,發送響應數據包,由於 RS 上默認網關配置爲 lvs 設備 IP,所以 nginx 服務器會將數據包轉發至下一跳,也就是 lvs 服務器。此時數據包源 IP 是 RIP,目的 IP 是 CIP。

⑥ lvs 服務器收到 RS 響應數據包後,根據路由查找,發現目的 IP 不是本機 IP,且 lvs 服務器開啓了轉發模式,所以將數據包轉發給 forward 鏈,此時數據包未作修改。

⑦ lvs 收到響應數據包後,根據目的 IP 和目的 port 查找服務和連接表,將源 IP 改爲 VIP,通過路由查找,確定下一跳和出口信息,將數據包發送至網關,經過複雜的網絡到達用戶客戶端,最終完成了一次請求和響應的交互。

NAT 模式雙向流量都經過 LVS,因此 NAT 模式性能會存在一定的瓶頸。不過與其它模式區別的是,NAT 支持端口映射,且支持 windows 操作系統。

(二)優點、缺點與使用場景

NAT 模式優點
a. 能夠支持 windows 操作系統
b. 支持端口映射。如果 rs 端口與 vport 不一致,lvs 除了修改目的 IP,也會修改 dport 以支持端口映射。

NAT 模式缺點
a. 後端 RS 需要配置網關
b. 雙向流量對 lvs 負載壓力比較大

NAT 模式的使用場景
如果你是 windows 系統,使用 lvs 的話,則必須選擇 NAT 模式了。

3.5 Tunnel 模式實現原理

Tunnel 模式在國內使用的比較少,不過據說騰訊使用了大量的 Tunnel 模式。它也是一種單臂的模式,只有請求數據會經過 lvs,響應數據直接從後端服務器發送給客戶端,性能也很強大,同時支持跨機房。下邊繼續看圖分析原理。

LVS 工作原理圖文講解,非常詳細!

(一)實現原理與過程

① 用戶請求數據包經過多層網絡,到達 lvs 網卡,此時數據包源 IP 是 cip,目的 ip 是 vip。

② 經過網卡進入網絡層 prerouting 位置,根據目的 ip 查找路由,確認是本機 ip,將數據包轉發到 input 鏈上,到達 lvs,此時源、目的 ip 都未發生變化。

③ 到達 lvs 後,通過目的 ip 和目的 port 查找是否爲 IPVS 服務。若是 IPVS 服務,則會選擇一個 rs 作爲後端服務器,以 rip 爲目的 ip 查找路由信息,確定下一跳、dev 等信息,然後 IP 頭部前邊額外增加了一個 IP 頭(以 dip 爲源,rip 爲目的 ip),將數據包轉發至 output 上。

④ 數據包根據路由信息經最終經過 lvs 網卡,發送至路由器網關,通過網絡到達後端服務器。

⑤ 後端服務器收到數據包後,ipip 模塊將 Tunnel 頭部卸載,正常看到的源 ip 是 cip,目的 ip 是 vip,由於在 tunl0 上配置 vip,路由查找後判定爲本機 ip,送往應用程序。應用程序 nginx 正常響應數據後以 vip 爲源 ip,cip 爲目的 ip 數據包發送出網卡,最終到達客戶端。

Tunnel 模式具備 DR 模式的高性能,又支持跨機房訪問,聽起來比較完美了。不過國內運營商有一定特色性,比如 RS 的響應數據包的源 IP 爲 VIP,VIP 與後端服務器有可能存在跨運營商的情況,有可能被運營商的策略封掉。Tunnel 在生產環境確實沒有使用過,在國內推行 Tunnel 可能會有一定的難度吧!

(二)優點、缺點與使用場景

Tunnel 模式的優點
a. 單臂模式,對 lvs 負載壓力小
b. 對數據包修改較小,信息保存完整
c. 可跨機房(不過在國內實現有難度)

Tunnel 模式的缺點
a. 需要在後端服務器安裝配置 ipip 模塊
b. 需要在後端服務器 tunl0 配置 vip
c. 隧道頭部的加入可能導致分片,影響服務器性能
d. 隧道頭部 IP 地址固定,後端服務器網卡 hash 可能不均
e. 不支持端口映射

Tunnel 模式的使用場景
理論上,如果對轉發性能要求較高,且有跨機房需求,Tunnel 可能是較好的選擇。

3.6 涉及的概念術語

上述內容中涉及到很多術語或縮寫,這裏簡單解釋下具體的含義,便於理解。

CIP:Client IP,表示的是客戶端 IP 地址。

VIP:Virtual IP,表示負載均衡對外提供訪問的 IP 地址,一般負載均衡 IP 都會通過 Virtual IP 實現高可用。

RIP:RealServer IP,表示負載均衡後端的真實服務器 IP 地址。

DIP:Director IP,表示負載均衡與後端服務器通信的 IP 地址。

CMAC:客戶端的 MAC 地址,準確的應該是 LVS 連接的路由器的 MAC 地址。

VMAC:負載均衡 LVS 的 VIP 對應的 MAC 地址。

DMAC:負載均衡 LVS 的 DIP 對應的 MAC 地址。

RMAC:後端真實服務器的 RIP 地址對應的 MAC 地址。

基礎性的原理知識,暫時理解到這裏就可以了,下一篇以實踐的方式來進一步瞭解 LVS 的工作原理和基本使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章