【分散式技術專題】「LVS負載均衡」全面透析Web基礎架構負載均衡LVS機制的原理分析指南

2023-01-07 06:00:52

前提概要

在大規模網際網路應用中,負載均衡裝置是必不可少的組成部分,源於網際網路應用的高並
發和大流量的衝擊壓力場景下,通常會在伺服器端部署多個無狀態的應用伺服器和若干有狀態的儲存伺服器(資料庫、快取等等)實現高可用特點和機制

LVS的介紹說明

  1. 官方站點:http://www.linuxvirtualserver.org
  2. 用過LVS的童鞋,其實大家的目的性很明確,就是需要通過LVS提供的負載均衡技術和Linux作業系統實現一個高效能,高可用的伺服器群集;
  3. 並且這個叢集具有良好的可靠性、可延伸性和可操作性,從而以低廉的成本實現最優的服務效能,這也是大多數中小型公司青睞的架構;

LVS的體系架構

請求傳播路徑

負載均衡層(Load Balancer)

  1. 處於叢集最前端,一臺或多臺構成負載排程,俗稱負載排程器(Director Server);
  2. 分發請求給伺服器叢集組層的應用伺服器(Real Server);
  3. 監控應用伺服器健康狀況,動態從LVS路由表中剔除、新增;
  4. 也可以兼職Real Server的身份;

負載均衡的作用

  • 負載均衡裝置的任務就是作為應用伺服器流量的入口,挑選最合適的一臺伺服器,將使用者端的請求轉發給它處理,實現使用者端到真實伺服器端的透明轉發
  • 雲端計算以及分散式架構,本質上也是將後端伺服器作為計算資源、儲存資源,由某臺管理伺服器封裝成一個服務對外提供,使用者端不需要關心真正提供服務的是哪臺機器,在它看來,就好像它面對的是一臺擁有近乎無限能力的伺服器,而本質上,真正提供服務的,是後端的叢集支撐的計算能力。

典型的網際網路應用的拓撲結構

負載均衡的型別

  • 負載均衡可以採用硬體裝置,也可以採用軟體負載。商用硬體負載裝置成本通常較高(一臺幾十萬上百萬很正常)一般有F5和A10硬體負載均衡
  • 所以在條件允許的情冴下我們會採用軟負載,軟負載解決的兩個核心問題是:選誰、轉發,其中最著名的是 LVS(Linux Virtual Server)、Nginx、HAproxy等
軟負載均衡(LVS)

LVS 是四層負載均衡,是我們國家著名技術專家:章文嵩博士研發的,也就是說建立在 OSI 模型的第四層——傳輸層之上,傳輸層上有我們熟悉的TCP/UDPLVS支援TCP/UDP的負載均衡。

LVS的轉發主要通過修改IP地址(NAT模式,分為源地址修改SNAT和目標地址修改DNAT)、修改目標MAC(DR 模式)來實現。

LVS是在第四層做負載均衡
  • 首先,LVS不像HAProxy等七層軟負載面向的是HTTP包,所以七層負載可以做的URL解析等工作,LVS無法完成。
  • 其次,使用者存取是與伺服器端建立連線後交換封包實現的,如果在第三層網路層做負載均衡,那麼將失去「連線」的語意
  • 軟負載面向的物件應該是一個已經建立連線的使用者,而不是一個孤零零的 IP 包後面會看到,實際上 LVS 的機器代替真實的伺服器的使用者通過TCP三次握手建立了連線所以 LVS 是需要關心「連線」級別的狀態的

伺服器群組層(Server Arrary)

  1. 一臺或多臺實際執行的應用伺服器構成;
  2. 每個Real Server關聯時通過有效網路互連;

共用儲存層(Shared Storage)

提供共用儲存空間和內容一致性的儲存區域;例如:資料庫、OSS儲存、FS檔案伺服器等。

LVS相關術語

  • DS:Director Server。指的是前端負載均衡器節點。
  • RS:Real Server。後端真實的工作伺服器。
  • VIP:向外部直接面向用戶請求,作為使用者請求的目標的IP地址。
  • DIP:Director Server IP,主要用於和內部主機通訊的IP地址。
  • RIP:Real Server IP,後端伺服器的IP地址。
  • CIP:Client IP,存取使用者端的IP地址。

LVS 的工作模式主要有 4 種:

  • DR
  • NAT
  • TUNNEL
  • Full-NAT
  • TUN

返里挑選常用的 DR、NAT、Full-NAT、TUN 來簡單介紹一下。

DR(Dynamic Route 動態路由)

通過為請求報文重新封裝一個MAC首部進行轉發,源MAC是DIP所在的介面的MAC,目標MAC是某挑選出的RS的RIP所在介面的MAC地址;源IP/PORT,以及目標IP/PORT均保持不變;

請求由LVS接受,由真實提供服務的伺服器(RealServer, RS)直接返回給使用者,返回的時
候不經過 LVS。

流程分析

DR 模式下需要LVS和繫結同一個 VIP(RS 通過將 VIP繫結在 loopback 實現),此時報文的源IP為CIP,目標IP為VIP;

源地址 目的地址
CIP VIP

源MAC地址 目的MAC地址
CIP-MAC VIP-MAC
  1. 當用戶請求到達DS後,LVS只需要將網路幀的MAC地址修改為某一臺RS的 MAC,該包就會被轉發到相應的RS處理,注意此時的源IP和目標IP都沒變,LVS 只是做了一下移花接木

IPVS比對封包請求的服務是否為叢集服務,若是,將請求報文中的源MAC地址修改為DIP的MAC地址,將目標MAC地址修改RIP的MAC地址, 此時的源IP和目的IP均未修改,僅修改了源MAC地址為DIP的MAC地址,目標MAC地址為RIP的MAC地址;

源地址 目的地址
CIP VIP

源MAC地址 目的MAC地址
DIP-MAC RIP-MAC
  1. 由於DS和RS在同一個網路中,所以是通過二層來傳輸。目標MAC地址為RIP的MAC地址,那麼此時封包將會發至RS。

  2. RS 收到 LVS 轉發來的包,鏈路層發現 MAC 是自己的,到上面的網路層,發現 IP 也是自己的,於是返個包被合法地接受,RS 感知不到前面有 LVS 的存在。處理完成之後,將響應報文通過lo介面傳送給eth0網路卡然後向外發出,此時的源IP地址為VIP,目標IP為CIP;

源地址 目的地址
VIP CIP
  1. 響應報文最終送達至使用者端,而當 RS 返回響應時,只要直接向源 IP(即使用者的 IP)返回即可,不再經過 LVS。DR 模式是效能最好的一種模式

這種模式下,有幾個要點:

主要是這種模式在於,通過LVS只是在請求階段做轉發,而且修改的也不是IP地址,而是MAC地址,針對於修改後的MAC地址會自動轉發到對應網段內MAC主機的伺服器上面,之後因為IP都沒有改變,之後實際RS可以直接傳送給目標client伺服器,這種效能最好,但是對網路層面要求比較高,對網路擴充套件角度而言控制力度略低。


NAT(Network Address Translation 網路地址準換)

  • NAT是一種外網和內網地址對映的技術
  • NAT模式下,網路報的進出都要經過LVS的處理
原理

多目標IP的DNAT,通過將請求報文中的目標地址和目標埠修改為選出來的RS的RIP和PORT實現轉發。

流程分析
  1. LVS需要作為RS的閘道器,當包到達LVS 時LVS 做目標地址轉換(DNAT)。此時報文的源IP為CIP,目標IP為VIP;
源地址 目的地址
CIP VIP
  1. IPVS比對封包請求的服務是否為叢集服務,若是,修改封包的目標IP地址為後端伺服器IP, 此時報文的源IP為CIP,目標IP為RIP;RS接收到包以後,彷彿是使用者端直接發給它的一樣。
源地址 目的地址
CIP RIP
  1. RS比對發現目標為自己的IP,將請求處理完,返回響應時,此時報文的源IP為RIP,目標IP為CIP;
源地址 目的地址
RIP CIP
  1. 返回時RS的包通過閘道器(LVS)中轉,LVS 會做源地址轉換(SNAT),將包的源地址改為VIP,這樣,這個包對使用者端看起來就彷彿是LVS直接返回給它的。此時會將源IP地址修改為自己的VIP地址,然後響應給使用者端,此時報文的源IP為VIP,目標IP為CIP;

使用者端無法感知到後端RS 的存在

源地址 目的地址
VIP CIP
要點

使用者端是不知道真是RS地址的,但是RS伺服器卻是可以知道ClientIP的(因為封包中會包含了ClientIP),但是由於中介LVS的原因,使得傳送的時候發給VIP(LVS),返回的時候,由LVS把源地址修改為VIP,所以對於使用者端不能來講是不知道目標地址的RS的存在。這就是反向代理的概念,使用者端是不知道真正伺服器的存在,知道的只有門面VIP的存在

特性
  1. 要求DS具備雙網路卡,VIP應對公網,而DIP必須和RIP在同一個網段內;
  2. RIP、DIP應該使用私網地址,同在一個網段中,且RS的閘道器要指向DIP;
  3. 請求和響應報文都要經由DS轉發,極高負載中,DS可能會成為系統瓶頸;
  4. RS可以使用任意OS;

TUN

在原有的IP報文外再次封裝多一層IP首部,內部IP首部(源地址為CIP,目標IIP為VIP),外層IP首部(源地址為DIP,目標IP為RIP)。

流程分析
  1. 當用戶請求到達DS後,此時請求的資料包文會先到核心空間的PREROUTING鏈,此時報文的源IP為CIP,目標IP為VIP;
源地址 目的地址
CIP VIP
  1. PREROUTING檢查發現封包的目標IP是本機,將封包送至INPUT鏈;

  2. IPVS比對封包請求的服務是否為叢集服務,若是,在請求報文的首部再次封裝一層IP報文,封裝源IP為為DIP,目標IP為RIP。然後發至POSTROUTING鏈。 此時源IP為DIP,目標IP為RIP;

IP首部源地址 IP首部目的地址 源地址 目的地址
DIP RIP CIP VIP
  1. POSTROUTING鏈根據最新封裝的IP報文,將封包發至RS(因為在外層封裝多了一層IP首部,所以可以理解為此時通過隧道傳輸),此時源IP為DIP,目標IP為RIP;

  2. RS接收到報文後發現是自己的IP地址,就將報文接收下來,拆除掉最外層的IP後,會發現裡面還有一層IP首部,而且目標是自己的tun0介面VIP,那麼此時RS開始處理此請求,處理完成之後,通過tun0介面送出去向外傳遞,此時的源IP地址為VIP,目標IP為CIP;

源地址 目的地址
VIP CIP
  1. 響應報文最終送達至使用者端;
特性

1、DIP、VIP、RIP都應該是公網地址;
2、RS的閘道器不能,也不可能指向DIP;
3、RS必須支援IP隧道;


Full-NAT

無論是 DR 還是 NAT 模式,不可避免的都有一個問題:LVS 和 RS 必須在同一個 VLAN 下,
否則 LVS 無法作為 RS 的閘道器

這引發的兩個問題是:

  1. 同一個VLAN的限制導致運維不方便,跨VLAN的RS無法接入
  2. LVS的水平擴充套件受到制約。當RS水平擴容時,總有一天其上的單點LVS會成為瓶頸

Full-NAT 由此而生,解決的是 LVS 和 RS 跨 VLAN 的問題,而跨 VLAN 問題解決後,LVS
和 RS 不再存在 VLAN 上的從屬關係,可以做到多個 LVS 對應多個 RS,解決水平擴容的問
題。

Full-NAT 相比 NAT 的主要改迕是,在 SNAT/DNAT 的基礎上,加上另一種轉換,轉換過
程如下:

  • 在包從 LVS 轉到 RS 的過程中,源地址從使用者端 IP 被替換成了 LVS 的內網 IP。
  • 內網IP之間可以通過多個交換機跨VLAN通訊
  • 當RS處理完接受到的包,返回時,會將返個包返回給LVS的內網IP,返一步也不受限於VLAN。
  • LVS 收到包後,在 NAT 模式修改源地址的基礎上,再把RS發來的包中的目標地址從LVS內網 IP 改為使用者端的 IP。

Full-NAT主要的思想是把閘道器和其下機器的通訊,改為了普通的網路通訊,從而解決了跨
VLAN 的問題。採用返種方式,LVS 和 RS 的部署在 VLAN 上將不再有任何限制,大大提高了運維部署的便利性

上面其實是把內網ip和內網ip之間通過交換機進行轉換捆綁,從而可以跨vlan進行服務請求代理。

Session

使用者端與伺服器端的通訊,一次請求可能包含多個TCP 包,LVS 必須保證同一連線的TCP包,必須被轉發到同一臺RS,否則就亂套了。為了確保返一點,LVS 內部維護著一個 Session的 Hash 表,通過使用者端的某些資訊可以找到應該轉發到哪一臺 RS 上

LVS 叢集化

採用 Full-NAT 模式後,可以搭建 LVS 的叢集,拓撲結構如下圖:

容災

容災分為 RS 的容災和 LVS 的容災。

RS 的容災可以通過 LVS 定期健康檢測實現,如果某臺 RS 失去心跳,則認為其已經下線,
不會在轉發到該 RS 上。

LVS 的容災可以通過主備+心跳的方式實現。主 LVS 失去心跳後,備 LVS 可以作為熱備立
即替換。

容災主要是靠 KeepAlived 來做的。(心跳以及下線剔除或者替換工作主要通過keepalived進行控制)