在大規模網際網路應用中,負載均衡裝置是必不可少的組成部分,源於網際網路應用的高並
發和大流量的衝擊壓力場景下,通常會在伺服器端部署多個無狀態的應用伺服器和若干有狀態的儲存伺服器(資料庫、快取等等)實現高可用特點和機制。
LVS 是四層負載均衡,是我們國家著名技術專家:章文嵩博士研發的,也就是說建立在 OSI 模型的第四層——傳輸層之上,傳輸層上有我們熟悉的TCP/UDP,LVS支援TCP/UDP的負載均衡。
LVS的轉發主要通過修改IP地址(NAT模式,分為源地址修改SNAT和目標地址修改DNAT)、修改目標MAC(DR 模式)來實現。
提供共用儲存空間和內容一致性的儲存區域;例如:資料庫、OSS儲存、FS檔案伺服器等。
返里挑選常用的 DR、NAT、Full-NAT、TUN 來簡單介紹一下。
通過為請求報文重新封裝一個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 |
IPVS比對封包請求的服務是否為叢集服務,若是,將請求報文中的源MAC地址修改為DIP的MAC地址,將目標MAC地址修改RIP的MAC地址, 此時的源IP和目的IP均未修改,僅修改了源MAC地址為DIP的MAC地址,目標MAC地址為RIP的MAC地址;
源地址 | 目的地址 |
---|---|
CIP | VIP |
源MAC地址 | 目的MAC地址 |
---|---|
DIP-MAC | RIP-MAC |
由於DS和RS在同一個網路中,所以是通過二層來傳輸。目標MAC地址為RIP的MAC地址,那麼此時封包將會發至RS。
RS 收到 LVS 轉發來的包,鏈路層發現 MAC 是自己的,到上面的網路層,發現 IP 也是自己的,於是返個包被合法地接受,RS 感知不到前面有 LVS 的存在。處理完成之後,將響應報文通過lo介面傳送給eth0網路卡然後向外發出,此時的源IP地址為VIP,目標IP為CIP;
源地址 | 目的地址 |
---|---|
VIP | CIP |
這種模式下,有幾個要點:
主要是這種模式在於,通過LVS只是在請求階段做轉發,而且修改的也不是IP地址,而是MAC地址,針對於修改後的MAC地址會自動轉發到對應網段內MAC主機的伺服器上面,之後因為IP都沒有改變,之後實際RS可以直接傳送給目標client伺服器,這種效能最好,但是對網路層面要求比較高,對網路擴充套件角度而言控制力度略低。
多目標IP的DNAT,通過將請求報文中的目標地址和目標埠修改為選出來的RS的RIP和PORT實現轉發。
源地址 | 目的地址 |
---|---|
CIP | VIP |
源地址 | 目的地址 |
---|---|
CIP | RIP |
源地址 | 目的地址 |
---|---|
RIP | CIP |
使用者端無法感知到後端RS 的存在
源地址 | 目的地址 |
---|---|
VIP | CIP |
使用者端是不知道真是RS地址的,但是RS伺服器卻是可以知道ClientIP的(因為封包中會包含了ClientIP),但是由於中介LVS的原因,使得傳送的時候發給VIP(LVS),返回的時候,由LVS把源地址修改為VIP,所以對於使用者端不能來講是不知道目標地址的RS的存在。這就是反向代理的概念,使用者端是不知道真正伺服器的存在,知道的只有門面VIP的存在。
在原有的IP報文外再次封裝多一層IP首部,內部IP首部(源地址為CIP,目標IIP為VIP),外層IP首部(源地址為DIP,目標IP為RIP)。
源地址 | 目的地址 |
---|---|
CIP | VIP |
PREROUTING檢查發現封包的目標IP是本機,將封包送至INPUT鏈;
IPVS比對封包請求的服務是否為叢集服務,若是,在請求報文的首部再次封裝一層IP報文,封裝源IP為為DIP,目標IP為RIP。然後發至POSTROUTING鏈。 此時源IP為DIP,目標IP為RIP;
IP首部源地址 | IP首部目的地址 | 源地址 | 目的地址 |
---|---|---|---|
DIP | RIP | CIP | VIP |
POSTROUTING鏈根據最新封裝的IP報文,將封包發至RS(因為在外層封裝多了一層IP首部,所以可以理解為此時通過隧道傳輸),此時源IP為DIP,目標IP為RIP;
RS接收到報文後發現是自己的IP地址,就將報文接收下來,拆除掉最外層的IP後,會發現裡面還有一層IP首部,而且目標是自己的tun0介面VIP,那麼此時RS開始處理此請求,處理完成之後,通過tun0介面送出去向外傳遞,此時的源IP地址為VIP,目標IP為CIP;
源地址 | 目的地址 |
---|---|
VIP | CIP |
1、DIP、VIP、RIP都應該是公網地址;
2、RS的閘道器不能,也不可能指向DIP;
3、RS必須支援IP隧道;
無論是 DR 還是 NAT 模式,不可避免的都有一個問題:LVS 和 RS 必須在同一個 VLAN 下,
否則 LVS 無法作為 RS 的閘道器。
這引發的兩個問題是:
Full-NAT 由此而生,解決的是 LVS 和 RS 跨 VLAN 的問題,而跨 VLAN 問題解決後,LVS
和 RS 不再存在 VLAN 上的從屬關係,可以做到多個 LVS 對應多個 RS,解決水平擴容的問
題。
Full-NAT 相比 NAT 的主要改迕是,在 SNAT/DNAT 的基礎上,加上另一種轉換,轉換過
程如下:
Full-NAT主要的思想是把閘道器和其下機器的通訊,改為了普通的網路通訊,從而解決了跨
VLAN 的問題。採用返種方式,LVS 和 RS 的部署在 VLAN 上將不再有任何限制,大大提高了運維部署的便利性。
上面其實是把內網ip和內網ip之間通過交換機進行轉換捆綁,從而可以跨vlan進行服務請求代理。
使用者端與伺服器端的通訊,一次請求可能包含多個TCP 包,LVS 必須保證同一連線的TCP包,必須被轉發到同一臺RS,否則就亂套了。為了確保返一點,LVS 內部維護著一個 Session的 Hash 表,通過使用者端的某些資訊可以找到應該轉發到哪一臺 RS 上。
採用 Full-NAT 模式後,可以搭建 LVS 的叢集,拓撲結構如下圖:
容災分為 RS 的容災和 LVS 的容災。
RS 的容災可以通過 LVS 定期健康檢測實現,如果某臺 RS 失去心跳,則認為其已經下線,
不會在轉發到該 RS 上。
LVS 的容災可以通過主備+心跳的方式實現。主 LVS 失去心跳後,備 LVS 可以作為熱備立
即替換。
容災主要是靠 KeepAlived 來做的。(心跳以及下線剔除或者替換工作主要通過keepalived進行控制)
本文來自部落格園,作者:洛神灬殤,轉載請註明原文連結:https://www.cnblogs.com/liboware/p/17031837.html,任何足夠先進的科技,都與魔法無異。