超詳細!一文詳解負載均衡原理

2021-12-24 高效運維

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

使用負載均衡可以給我們帶來的幾個好處:

提高了系統的整體性能;

提高了系統的擴展性;

提高了系統的可用性;

負載均衡類型廣義上的負載均衡器大概可以分為 3 類,包括:DNS 方式實現負載均衡、硬體負載均衡、軟體負載均衡。(一)DNS 實現負載均衡DNS 實現負載均衡是最基礎簡單的方式。一個域名通過 DNS 解析到多個 IP,每個 IP 對應不同的伺服器實例,這樣就完成了流量的調度,雖然沒有使用常規的負載均衡器,但實現了簡單的負載均衡功能。

通過 DNS 實現負載均衡的方式,最大的優點就是實現簡單,成本低,無需自己開發或維護負載均衡設備,不過存在一些缺點:伺服器故障切換延遲大,伺服器升級不方便。我們知道 DNS 與用戶之間是層層的緩存,即便是在故障發生時及時通過 DNS 修改或摘除故障伺服器,但中間經過運營商的 DNS 緩存,且緩存很有可能不遵循 TTL 規則,導致 DNS 生效時間變得非常緩慢,有時候一天後還會有些許的請求流量。流量調度不均衡,粒度太粗。DNS 調度的均衡性,受地區運營商 LocalDNS 返回 IP 列表的策略有關係,有的運營商並不會輪詢返回多個不同的 IP 地址。另外,某個運營商 LocalDNS 背後服務了多少用戶,這也會構成流量調度不均的重要因素。流量分配策略太簡單,支持的算法太少。DNS 一般只支持 rr 的輪詢方式,流量分配策略比較簡單,不支持權重、Hash 等調度算法。DNS 支持的 IP 列表有限制。我們知道 DNS 使用 UDP 報文進行信息傳遞,每個 UDP 報文大小受鏈路的 MTU 限制,所以報文中存儲的 IP 地址數量也是非常有限的,阿里 DNS 系統針對同一個域名支持配置 10 個不同的 IP 地址。(二)硬體負載均衡硬體負載均衡是通過專門的硬體設備來實現負載均衡功能,是專用的負載均衡設備。目前業界典型的硬體負載均衡設備有兩款:F5和A10。這類設備性能強勁、功能強大,但價格非常昂貴,一般只有土豪公司才會使用此類設備,中小公司一般負擔不起,業務量沒那麼大,用這些設備也是挺浪費的。功能強大:全面支持各層級的負載均衡,支持全面的負載均衡算法。穩定性高:商用硬體負載均衡,經過了良好的嚴格測試,經過大規模使用,穩定性高。安全防護:還具備防火牆、防 DDoS 攻擊等安全功能,以及支持 SNAT 功能。(三)軟體負載均衡軟體負載均衡,可以在普通的伺服器上運行負載均衡軟體,實現負載均衡功能。目前常見的有 Nginx、HAproxy、LVS。其中的區別:Nginx:七層負載均衡,支持 HTTP、E-mail 協議,同時也支持 4 層負載均衡;HAproxy:支持七層規則的,性能也很不錯。OpenStack 默認使用的負載均衡軟體就是 HAproxy;LVS:運行在內核態,性能是軟體負載均衡中最高的,嚴格來說工作在三層,所以更通用一些,適用各種應用服務。

軟體負載均衡的優點:

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

軟體負載均衡主要包括:Nginx、HAproxy 和 LVS,三款軟體都比較常用。四層負載均衡基本上都會使用 LVS,據了解 BAT 等大廠都是 LVS 重度使用者,就是因為 LVS 非常出色的性能,能為公司節省巨大的成本。

LVS,全稱 Linux Virtual Server 是由國人章文嵩博士發起的一個開源的項目,在社區具有很大的熱度,是一個基於四層、具有強大性能的反向代理伺服器。

它現在是標準內核的一部分,它具備可靠性、高性能、可擴展性和可操作性的特點,從而以低廉的成本實現最優的性能。

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

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

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

PREROUTING :剛剛進入網絡層,還未進行路由查找的包,通過此處INPUT :通過路由查找,確定發往本機的包,通過此處FORWARD :經路由查找後,要轉發的包,在POST_ROUTING之前POSTROUTING :進入網絡層已經經過路由查找,確定轉發,將要離開本設備的包,通過此處當一個數據包進入網卡,經過鏈路層之後進入網絡層就會到達 PREROUTING,接著根據目標 IP 地址進行路由查找,如果目標 IP 是本機,數據包繼續傳遞到 INPUT 上,經過協議棧後根據埠將數據送到相應的應用程式。應用程式處理請求後將響應數據包發送到 OUTPUT 上,最終通過 POSTROUTING 後發送出網卡。如果目標 IP 不是本機,而且伺服器開啟了 forward 參數,就會將數據包遞送給 FORWARD 上,最後通過 POSTROUTING 後發送出網卡。LVS基礎原理LVS 是基於 netfilter 框架,主要工作於 INPUT 鏈上,在 INPUT 上註冊 ip_vs_in HOOK 函數,進行 IPVS 主流程,大概原理如圖所示:

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

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

LVS 是工作在 INPUT 鏈上,會根據訪問的 IP:Port 判斷請求是否是 LVS 服務,如果是則進行 LVS 主流程,強行修改數據包的相關數據,並將數據包發往 POSTROUTING 鏈上。

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

開源 LVS 版本有 3 種工作模式,每種模式工作原理都不同,每種模式都有自己的優缺點和不同的應用場景,包括以下三種模式:這裡必須要提另外一種模式是 FullNAT,這個模式在開源版本中是模式沒有的。這個模式最早起源於百度,後來又在阿里發揚光大,由阿里團隊開源,代碼地址如下:https://github.com/alibaba/lvsLVS 官網也有相關下載地址,不過並沒有合進到內核主線版本。後面會有專門章節詳細介紹 FullNAT 模式。下邊分別就 DR、NAT、Tunnel 模式分別詳細介紹原理。DR 模式實現原理LVS 基本原理圖中描述的比較簡單,表述的是比較通用流程。下邊會針對 DR 模式的具體實現原理,詳細的闡述 DR 模式是如何工作的。

(一)實現原理過程① 當客戶端請求 www.sina.com.cn 主頁,請求數據包穿過網絡到達 Sina 的 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 服務,就會根據配置信息,從真實伺服器列表 中選擇一個作為 RS1,然後以 RS1 作為目標查找 Out 方向的路由,確定一下跳信息以及數據包要通過哪個網卡發出。最後將數據包投遞到 OUTPUT 鏈上。④ 數據包通過 POSTROUTING 鏈後,從網絡層轉到鏈路層,將目的 MAC 地址修改為 RealServer 伺服器 MAC 地址,記為 RMAC;而源 MAC 地址修改為 LVS 與 RS 同網段的 selfIP 對應的 MAC 地址,記為 DMAC。此時,數據包通過交換機轉發給了 RealServer 伺服器(註:為了簡單圖中沒有畫交換機)。⑤ 請求數據包到達後端真實伺服器後,鏈路層檢查目的 MAC 是自己網卡地址。到了網絡層,查找路由,目的 IP 是 VIP(lo 上配置了 VIP),判定是本地主機的數據包,經過協議棧拷貝至應用程式(比如 nginx 伺服器),nginx 響應請求後,產生響應數據包。然後以 CIP 查找出方向的路由,確定下一跳信息和發送網卡設備信息。此時數據包源、目的 IP 分別是 VIP、CIP,而源 MAC 地址是 RS1 的 RMAC,目的 MAC 是下一跳(路由器)的 MAC 地址,記為 CMAC(為了容易理解,記為 CMAC)。然後數據包通過 RS 相連的路由器轉發給真正客戶端,完成了請求響應的全過程。從整個過程可以看出,DR 模式 LVS 邏輯比較簡單,數據包通過直接路由方式轉發給後端伺服器,而且響應數據包是由 RS 伺服器直接發送給客戶端,不經過 LVS。我們知道通常請求數據包會比較小,響應報文較大,經過 LVS 的數據包基本上都是小包,所以這也是 LVS 的 DR 模式性能強大的主要原因。(二)優缺點和使用場景

響應數據不經過 lvs,性能高

對數據包修改小,信息保存完整(攜帶客戶端源 IP)

lvs 與 rs 必須在同一個物理網絡(不支持跨機房)

伺服器上必須配置 lo 和其它內核參數

不支持埠映射

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

NAT 模式實現原理

(一)實現原理與過程① 用戶請求數據包經過層層網絡,到達 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 作業系統。

能夠支持 windows 作業系統

支持埠映射。

如果 rs 埠與 vport 不一致,lvs 除了修改目的 IP,也會修改 dport 以支持埠映射。

後端 RS 需要配置網關

雙向流量對 lvs 負載壓力比較大

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

Tunnel 模式在國內使用的比較少,不過據說騰訊使用了大量的 Tunnel 模式。它也是一種單臂的模式,只有請求數據會經過 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 可能會有一定的難度吧。

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

單臂模式,對 lvs 負載壓力小

對數據包修改較小,信息保存完整

可跨機房(不過在國內實現有難度)

需要在後端伺服器安裝配置 ipip 模塊

需要在後端伺服器 tunl0 配置 vip

隧道頭部的加入可能導致分片,影響伺服器性能

隧道頭部 IP 地址固定,後端伺服器網卡 hash 可能不均

不支持埠映射

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

到此為止,已經將 LVS 原理講清楚了,內容比較多,建議多看兩遍,由於文章篇幅太長,實踐操作的內容就放到下篇文章再來講好了。

XOPS 風向標!GOPS 全球運維大會 2021 · 深圳站,招行、電信、騰訊、阿里、京東等名企專家已集結,你想要的都在這裡了,文末掃碼立即報名~

近期好文:

高效運維」公眾號誠邀廣大技術人員投稿,

投稿郵箱:jiachen@greatops.net,或添加聯繫人微信:greatops1118.

相關焦點

  • (實用篇)詳解 Nginx代理功能與負載均衡
    本篇文章主要介紹了詳解 Nginx代理功能與負載均衡,先描述一些關於代理功能的配置,再說明負載均衡詳細,有興趣的可以了解一下。 序言Nginx的代理功能與負載均衡功能是最常被用到的,關於nginx的基本語法常識與配置已在上篇文章中有說明,這篇就開門見山,先描述一些關於代理功能的配置,再說明負載均衡詳細。
  • 負載均衡的原理
    張大胖眼前一亮, 突然有了主意:「有了!我們有個中間層啊,對,就是DNS,我們可以設置一下,讓我們網站的域名映射到多個伺服器的IP,用戶面對的是我們系統的域名,然後我們可以採用一種輪詢的方式, 用戶1的機器做域名解析的時候,DNS返回IP1, 用戶2的機器做域名解析的時候,DNS返回IP2. 這樣不就可以實現各個機器的負載相對均衡了嗎?」
  • 負載均衡詳解
    解決訪問統一入口問題,我們可以在集群前面增加負載均衡設備,實現流量分發。負載均衡(Load Balance),意思是將負載(工作任務,訪問請求)進行平衡、分攤到多個操作單元(伺服器,組件)上進行執行。是解決高性能,單點故障(高可用),擴展性(水平伸縮)的終極解決方案。一、負載均衡原理系統的擴展可分為縱向(垂直)擴展和橫向(水平)擴展。
  • 一文詳解HAProxy負載均衡,看完後醍醐灌頂!(內附網盤連結和提取碼)
    HAProxy 跟 LVS 類似,是一款負載均衡軟體;從效率上來講 HAProxy
  • 使用 LVS 實現負載均衡原理及安裝配置詳解
    load balance 集群的簡寫,翻譯成中文就是負載均衡集群。常用的負載均衡開源軟體有nginx、lvs、haproxy,商業的硬體負載均衡設備F5、Netscale。這裡主要是學習 LVS 並對其進行了詳細的總結記錄。
  • 一文詳解負載均衡和反向代理的真實區別
    連結:https://www.zhihu.com/question/20553431/answer/130698230一、SLB 產生背景SLB(伺服器負載均衡):在多個提供相同服務的伺服器的情況下,負載均衡設備存在虛擬服務地址,當大量客戶端從外部訪問虛擬服務IP位址時,負載均衡設備將這些報文請求根據負載均衡算法,將流量均衡的分配給後臺伺服器以平衡各個伺服器的負載壓力,避免在還有伺服器壓力較小情況下其他服務達到性能臨界點出現運行緩慢甚至宕機情況,從而提高服務效率和質量。
  • 通俗易懂負載均衡器
    負載均衡基本上意味著在多個伺服器之間分配網絡流量,這樣可以確保沒有任何一臺伺服器自己承擔所有負載。當網絡流量平衡時,應用程式就可以平穩運行。像往常一樣,我帶來了另一本漫畫教程,該教程將以最簡單的方式解釋負載均衡器。從上圖可以看到,有一個簡單的客戶端-伺服器方案。這裡只有一個客戶端,因此我們的伺服器可以輕鬆地滿足客戶端的請求。
  • 詳解Keepalived和HAProxy高可用負載均衡
    概述軟體負載均衡技術是指可以為多個後端伺服器節點提供前端IP流量分發調度服務的軟體技術。Keepalived和HAProxy是眾多軟負載技術中的兩種,其中Keepalived既可以實現負載均衡也可以實現高可用,而HAProxy則更加專注於提供高性能TCP和HTTP反向代理和負載均衡能力。
  • 負載均衡原理的解析
    二、DNS負載均衡DNS負責提供域名解析服務,當訪問某個站點時,實際上首先需要通過該站點域名的DNS伺服器來獲取域名指向的IP位址,在這一過程中,DNS伺服器完成了域名到IP位址的映射,同樣,這樣映射也可以是一對多的
  • DNS全局負載均衡(GSLB)基本原理
    DNS全局負載均衡(GSLB)基本原理原理採用「全局負載均衡(GSLB
  • 一文詳解 LVS、Nginx 及 HAProxy工作原理
    LVS 是四層負載均衡,也就是說建立在 OSI 模型的第四層——傳輸層之上,傳輸層上有我們熟悉的 TCP/UDP,LVS 支持 TCP/UDP 的負載均衡。因為 LVS 是四層負載均衡,因此它相對於其它高層負載均衡的解決辦法,比如 DNS 域名輪流解析、應用層負載的調度、客戶端的調度等,它的效率是非常高的。所謂四層負載均衡 ,也就是主要通過報文中的目標地址和埠。
  • 一文秒懂分布式架構下的「負載均衡」
    大致可以分為以下幾種,其中最常用的是四層和七層負載均衡。負載均衡伺服器對外依然提供一個 VIP(虛 IP),集群中不同的機器採用相同 IP 地址,但機器的 MAC 地址不一樣。當負載均衡伺服器接受到請求之後,通過改寫報文的目標 MAC 地址的方式將請求轉發到目標機器實現負載均衡。
  • Nginx代理功能與負載均衡詳解
    ,再說明負載均衡詳細。 如果負載均衡中其中web2發生這樣的情況,nginx首先會去web1請求,但是nginx在配置不當的情況下會繼續分發請求道web2,然後等待web2響應,直到我們的響應時間超時,才會把請求重新分發給web1,這裡的響應時間如果過長,用戶等待的時間就會越長。下面的配置是解決方案之一。
  • 負載均衡原理的概述、原理解析
    負載均衡作為目前伺服器集群部署的一款常用設備,當一臺機器性能無法滿足業務的增長需求時,不是去找一款性能更好的機器,而是通過負載均衡,利用集群來滿足客戶增長的需求
  • 詳解幾種常用負載均衡
    大致可以分為以下幾種,其中最常用的是四層和七層負載均衡: 二層負載均衡負載均衡伺服器對外依然提供一個VIP(虛IP),集群中不同的機器採用相同IP位址,但機器的MAC地址不一樣。當負載均衡伺服器接受到請求之後,通過改寫報文的目標MAC地址的方式將請求轉發到目標機器實現負載均衡。
  • 多載波MLB負載均衡效果對比
    一、基本原理        移動性負載均衡MLB(Mobility Load Balancing)是通過判斷本小區的負載高低,進行小區間負載信息交互
  • 一文理清負載均衡(nginx,LVS)的工作原理
    Nginx 負載均衡是對七層網絡通信模型中的應用層(HTTP,HTTPS)進行的。Nginx 是以反向代理的方式進行負載均衡Nginx 的 upstream 目前支持 6 種算法分配方式:但是,有些請求佔用的時間很長,會導致所在的後端負載較高,這種情況下,least_conn這種方式就可以達到更好的負載均衡效果least_conn;server 10.168.226.1:8080 weight=1;server 10.168.226.2:8080 weight=2;注意:這種負載均衡策略適合請求處理時間長短不一致造成伺服器過載的情況
  • linux負載均衡總結性說明(四層負載/七層負載)
    詳解如下:一,什麼是負載均衡1)負載均衡(Load Balance)建立在現有網絡結構之上,它提供了一種廉價有效透明的方法擴展網絡設備和伺服器的帶寬、增加吞吐量、加強網絡數據處理能力、提高網絡的靈活性和可用性。
  • 負載均衡基礎知識
    一、什麼是負載均衡?
  • IIS負載均衡-Application Request Route詳解第二篇:創建與配置Server Farm
    本系列雖然不難,但是很多的一些知識都是默認需要掌握的,例如:負載均衡的概念,原理,Web Farm等。另外,還可以設置伺服器的權重值(weight),以後之後,我們可以為在ARR中選擇基於權重的負載均衡算法。6.      添加之後,可以看到結果,如下所示: