一、集群與分布式系統
1 集群
1-1概念
集群式架構是將多個相同或相似的節點組合在一起,形成一個邏輯上的 “整體”,對外提供統一的服務或資源。節點之間通常具有較高的同構性(硬件、軟件配置相似),且緊密協作。
1-2 三種類型
高可用(High Availability )
高可用是指系統在長時間內保持穩定運行、減少停機時間的能力,核心是通過容錯設計避免單點故障。
核心目標:
- 減少停機時間:通過冗余、自動故障轉移等機制,確保服務 “不間斷”(或中斷時間極短)。
- 提升可靠性:即使部分節點故障,系統仍能正常提供服務。
關鍵指標:
可用性等級,通常用 “幾個 9” 表示,例如:
- 99.9%:每年允許停機約 8.76 小時。
- 99.99%:每年允許停機約 52.56 分鐘。
- 99.999%:每年允許停機約 5.26 分鐘(“五個九”,高可用系統的常見目標)。
負載均衡(Load Balance )
負載均衡是一種分配網絡請求或計算任務到多個節點的技術,目的是避免單一節點過載,提升系統整體性能和穩定性。
核心目標:
- 均衡負載:將流量 / 任務分散到多個節點,防止某節點因壓力過大宕機。
- 提高吞吐量:通過并行處理提升系統的并發能力(如同時處理更多用戶請求)。
- 擴展靈活性:可通過增加節點輕松擴展系統容量(水平擴展)。
高性能計算(High-Performance Computing)
高性能計算是通過多節點并行計算處理復雜、大規模計算任務的技術,核心是提升計算速度和處理能力。
核心目標:
- 解決大規模問題:處理單臺計算機無法完成的復雜任務(如氣候模擬、基因測序、流體力學分析)。
- 并行計算:將任務拆分到多個節點,同時計算并匯總結果,大幅縮短處理時間。
3-3典型應用場景
負載均衡集群:如 Web 服務器集群(Nginx、Apache 集群),通過分發請求避免單點過載。
高可用集群:如數據庫集群(MySQL 主從、PostgreSQL 流復制),確保服務不中斷。
2 分布式
2-1 概念
分布式架構是將一個復雜的系統拆分為多個獨立的子系統(節點),每個節點負責一部分功能,通過網絡協同完成整體任務。節點之間可以異構,且分工明確。
2-2 典型應用場景:
- 分布式服務架構:如微服務系統(Spring Cloud、Dubbo),將業務拆分為獨立服務。
- 分布式存儲:如 HDFS(分布式文件系統)、Ceph,將數據分散存儲在多個節點。
- 分布式計算:比如Hadoop集群,將計算任務分發到多個節點并行處理。
- 分布式數據庫:如 MongoDB 分片集群、TiDB,數據分散存儲在不同節點,提升讀寫性能。
區別與聯系
分布式是并聯工作的,集群是串聯工作的。
分布式是以縮短單個任務的執行時間來提升效率的,而集群則是通過提高單位時間內執行的任務數來提升效率
分布式中的每一個節點,都可以做集群。 而集群并不一定就是分布式的。
分布式一個業務拆分成多個子業務,每個子業務分別部署在不同的服務器上,如果某臺服務器掛掉,那么這塊業務會隨服務器一快損失
集群則是同一個業務部署在多臺服務器上,即便某臺服務器掛掉,其他服務器立刻頂上,不會對業務造成過大影響
二、lvs簡介
1 概念
LVS(Linux Virtual Server)是一個開源的**負載均衡軟件,由中國工程師章文嵩博士主導開發。它基于 Linux 內核,通過 IP 層的流量分發實現高性能負載均衡,廣泛應用于大型網站、分布式系統和云計算環境中。
2 名詞解釋
VS:Virtual Server 調度器
RS:RealServer 負責真正提供服務的服務器
CIP:Client IP 客戶端IP
VIP: Virtual serve IP 調度器外網IP
DIP: Director IP 調度器內網的IP
RIP: Real server IP 真實服務器IP
3 lvs集群體系結構
工作原理
VS根據請求報文的目標IP和目標協議及端口進行修改(根據模式更改)并調度轉發到某一個RS(根據調度算法挑選)。
訪問流程
CIP<->VIP==DIP<->RIP
架構
負載均衡層(Load Balancer):
一臺或多臺LVS服務器構成負載調度器,也稱為Director Server。
負責接收客戶端的請求,并根據調度算法將請求分發給后端的Real Server。
監控Real Server的健康狀況,動態地從LVS路由表中添加或剔除不健康的服務器。
服務器群組層(Server Array):
由一臺或多臺實際運行的應用服務器構成,也稱為Real Server。
負責處理LVS分發過來的請求,并將處理結果返回給客戶端。
Real Server之間可以通過有效網絡互連,實現數據的共享和通信。
共享存儲層(Shared Storage)(可選):
提供共享存儲空間和內容一致性的存儲區域,如數據庫、OSS存儲、FS文件服務器等。
在需要共享數據或資源的分布式系統中,共享存儲層是不可或缺的。
三、工作模式
NAT模式
地址轉換:Network Address Translation,簡稱:NAT 模式,類似于防火墻的私有網絡結構,負載調度器作為所有服務器節點的網關,作為客戶機的訪問入口,也是各節點回應客戶機的訪問出口,服務器節點使用私有 IP 地址,與負載調度器位于同一個物理網絡,安全性要優于其他兩種方式
- 雙向地址轉換:請求階段用 DNAT,響應階段用 SNAT,所有數據必須經過 LVS。
- 后端服務器隱藏:RS 僅需與 LVS 私網通信,無需暴露公網,安全性高。
- 性能瓶頸:LVS 是數據傳輸的唯一出入口,高并發場景下可能成為帶寬或處理能力瓶頸。
- 適用場景:小規模后端集群(通常 RS 數量≤10 臺),對成本敏感且安全性要求較高的場景。
實現原理
1、 客戶端發出的請求數據包經過網絡到達 LVS 網卡,數據包源 IP 為 CIP,目的 IP 為 VIP。
2、然后進入 PREROUTING 鏈中,根據目的 IP 查找路由,確定是否為本機 IP 地址,隨后將數據包轉發至 INPUT 鏈中,源 IP 和 目的 IP 不變。
3、 到達 LVS 后,通過目的 IP 和目的 PORT 查找是否為 IPVS 服務,如是 IPVS 服務,將會選擇一個 RS 來作為后端服務器,數據包的目的 IP 地址將會修改為 RIP,這時并以 RIP 為目的 IP 去查找路由,確定下一跳及 PORT 信息后,數據包將會轉發至 OUTPUT 鏈中。
4、 被修改過的數據包經過 POSTROUTING 鏈后,到達 RS 服務器,數據包源 IP 為 CIP,目的 IP 為 RIP。
5、 RS 服務器經過處理后,將會把數據包發送至用戶空間的應用程序,待處理完成后,發送響應數據包,RS 服務器的默認網關為 LVS 的 IP,應用程序將會把數據包轉發至下一跳 LVS 服務器,數據包源 IP 為 RIP,目的 IP 為 CIP。
6、 LVS 服務器收到 RS 服務器響應的數據包后,查找路由,目的 IP 不是本機 IP并且 LVS 服務器開啟了 FORWARD 模式,會將數據包轉發給它,數據包不變。
7、 LVS 服務器收到響應數據包后,根據目的 IP 和 目的 PORT 查找相應的服務,這時,源 IP 為 VIP,通過查找路由,確定下一跳信息
注意
1.RIP和DIP應在同一個IP網絡,且應使用私網地址;RS的網關要指向DIP
2.請求報文和響應報文都必須經由Director轉發,Director易成為系統瓶頸
3.支持端口映射,可修改請求報文的目標PORT
4.VS必須是Linux系統,RS可以是任意OS系統
NAT 模式的優缺點
一、優點
- 部署簡單,網絡架構要求低:后端服務器(RS)只需將默認網關指向 LVS 的 DIP,對 RS 的操作系統和應用無特殊要求,兼容性強(支持 Linux、Windows 等)。LVS 與 RS 可不在同一網段,網絡拓撲靈活,適合跨網段部署場景。
- 安全性較高:后端服務器隱藏在私有網絡中,不直接暴露公網,僅通過 LVS 的 VIP 對外提供服務,可減少 RS 被直接攻擊的風險。
- 支持端口映射:可在 LVS 上配置 VIP 端口與 RS 端口的映射,適合后端服務端口不一致的場景。
二、缺點
- 性能瓶頸明顯:所有數據包必須經過 LVS,LVS 需對每個包進行 IP 地址轉換,計算開銷大,容易成為系統瓶頸。
- 網絡延遲較高:響應數據包需從 RS→LVS→客戶端,比 DR 模式的 “RS 直接回客戶端” 多一次轉發,增加了網絡延遲,對實時性要求高的業務(如視頻通話、高頻交易)不友好。
DR模式
DR(Direct Routing,直接路由)模式是一種高性能的負載均衡技術,其核心通過修改數據包的 MAC 地址實現請求分發,且響應數據直接從后端服務器返回給客戶端,大幅減少了負載均衡器的流量壓力。
- 高性能:LVS 僅處理請求分發(改 MAC),響應數據不經過 LVS,避免了帶寬瓶頸,支持大規模后端集群(通常可承載數百臺 RS)。
- 網絡限制:LVS 與 RS 必須在同一二層網段(共享交換機),否則無法通過 MAC 地址轉發。
- 安全性:RS 需綁定 VIP,若配置不當可能導致 VIP 沖突;且 RS 可直接與客戶端通信,需做好安全隔離。
- 適用場景:高并發、大流量場景(如 Web 服務、視頻點播),對性能要求極高的業務。
實現原理
- 客戶端發出的請求數據包經過網絡到達 LVS 網卡,數據包源 IP 為 CIP(客戶端 IP),目的 IP 為 VIP(虛擬服務 IP)。
- 數據包進入 PREROUTING 鏈,LVS 根據目的 IP(VIP)查找路由,確認 VIP 為本機服務 IP 后,將數據包轉發至 INPUT 鏈,此時源 IP(CIP)和目的 IP(VIP)均保持不變。
- 到達 LVS 后,通過目的 IP(VIP)和目的 PORT(服務端口)匹配到 IPVS 服務,LVS 根據負載均衡算法選擇一臺 RS(后端服務器)。與 NAT 模式不同,DR 模式不修改目的 IP(仍為 VIP),僅將數據包的目的 MAC 地址修改為選中 RS 的 MAC 地址(R-MAC),隨后以該 MAC 地址為目標查找二層路由,確定下一跳后將數據包轉發至 OUTPUT 鏈。
- 被修改 MAC 地址的數據包經過 POSTROUTING 鏈后,通過二層網絡(同網段交換機)送達 RS 服務器。此時數據包的源 IP 仍為 CIP,目的 IP 仍為 VIP(因 RS 的回環網卡已綁定 VIP,可正常接收該數據包)。
- RS 服務器接收數據包后,經處理轉發至用戶空間的應用程序,處理完成后生成響應數據包。由于 RS 的默認網關指向客戶端所在網絡的網關(而非 LVS),響應數據包直接通過三層路由發送,源 IP 為 VIP(RS 回環網卡上的 VIP,確保客戶端識別),目的 IP 為 CIP。
- 響應數據包不經過 LVS,直接通過公網路由到達客戶端所在網絡,最終送達客戶端。
- 客戶端接收響應數據包,其源 IP 為 VIP(與請求的目標 IP 一致),目的 IP 為 CIP,整個過程對客戶端透明,感知不到后端 RS 的存在。
注意
由于所有 RS 的回環網卡都綁定了 VIP,可能導致局域網內的 ARP 沖突(當交換機詢問 “VIP 對應的 MAC 是哪個” 時,多臺 RS 會同時響應)。因此需在 RS 上做ARP 抑制配置
不支持端口映射(端口不能修改)
Director 與所有 RS 必須在同一物理網段(共享二層交換機),依賴 MAC 地址轉發,跨網段會導致失敗。
RS 的默認網關需指向客戶端所在網絡的網關(而非 DIP),確保響應數據包能直接回傳客戶端,不經過 Director。
RS 的lo網卡綁定 VIP 時,需設置子網掩碼為255.255.255.255,避免廣播沖突。
DR模式優缺點
一、優點
- 性能極高,吞吐量巨大:DR 模式下,LVS 僅負責修改數據包的 MAC 地址,不修改 IP 地址,避免了 IP 地址轉換的開銷。響應數據包從 RS 直接返回給客戶端,LVS 僅處理入站請求,極大降低了負載均衡器的壓力,可支持大規模并發訪問。
- 網絡路徑短,延遲低:客戶端請求經 LVS 轉發至 RS 后,RS 直接回包給客戶端,減少了 “客戶端→LVS→RS→LVS→客戶端” 的冗余路徑,降低了網絡延遲。
- 可擴展性強:由于 LVS 負載較輕,理論上可掛載大量后端 RS,適合高并發場景(如電商秒殺、視頻直播等)。
二、缺點
- 網絡環境限制嚴格:LVS 和所有 RS 必須在同一物理局域網內,且共享同一個 VIP,因為數據包通過 MAC 地址轉發
- VIP 沖突與 ARP 廣播問題需特殊處理:所有 RS 和 LVS 都需配置 VIP(RS 通常在回環接口 lo 上配置 VIP,且需關閉 ARP 響應和廣播,避免客戶端或網關收到多個 VIP 的 ARP 應答導致沖突)。
- 后端服務器需與 LVS 同網段,靈活性低:無法像 NAT 模式那樣通過網關跨網段轉發,RS 必須和 LVS 在同一子網,限制了網絡架構的靈活性。
TUN模式
轉發方式:不修改請求報文的IP首部(源IP為CIP,目標IP為VIP),而在原IP報文之外再封裝一個IP首部
(源IP是DIP,目標IP是RIP),將報文發往挑選出的目標RS;RS直接響應給客戶端(源IP是VIP,目標IP
是CIP)
實現原理
1.客戶端發送請求數據包,包內有源IP+vip+dport
2.到達vs調度器后對客戶端發送過來的數據包重新封裝添加IP報文頭,新添加的IP報文頭中包含
TUNSRCIP(DIP)+TUNDESTIP(RSIP1)并發送到RS1
3.RS收到VS調度器發送過來的數據包做出響應,生成的響應報文中包含SRCIP(VIP)+DSTIP(CIP)
+port,響應數據包通過網絡直接回傳給client
注意
1.DIP, VIP, RIP都應該是公網地址
2.RS的網關一般不能指向DIP
3.請求報文要經由Director,但響應不能經由Director
4.不支持端口映射
5.RS的OS須支持隧道功能
四、lvs調度算法
類型
靜態方法:僅根據算法本身進行調度,不考慮RS的負載情況
動態方法:主要根據每RS當前的負載狀態及調度算法進行調度Overhead=value較小的RS將被調度
靜態算法
- 輪詢(Round Robin, rr)
- 原理:按順序依次將請求分配給 RS,循環往復。
- 優點:實現簡單,公平分配請求。
- 缺點:忽略服務器性能差異,可能導致性能弱的服務器過載。
- 適用場景:后端服務器性能相近的場景。
- 加權輪詢(Weighted Round Robin, wrr)
- 原理:為每個 RS 分配權重(如性能強的服務器權重高),按權重比例分配請求。
- 優點:根據服務器性能差異化分配,利用率更高。
- 缺點:權重需人工預設,無法動態適應服務器負載變化。
- 適用場景:服務器性能差異明顯(如新舊服務器混用)。
- 源地址哈希(Source Hashing, sh)
- 原理:根據客戶端 IP 地址計算哈希值,將同一客戶端的請求始終路由到固定 RS。
- 優點:實現會話粘性(Session Affinity),適合需保持會話狀態的業務(如購物車)。
- 缺點:可能導致負載不均(如部分客戶端請求特別頻繁)。
- 適用場景:有會話保持需求的業務(如 PHP Session、無狀態服務除外)。
- 目標地址哈希(Destination Hashing, dh)
- 原理:根據目標 IP(如 VIP)或端口計算哈希值,將請求路由到固定 RS。
- 優點:適合內容緩存場景(如 CDN),確保相同內容始終由同一 RS 處理。
- 缺點:靈活性低,不適合動態業務。
- 適用場景:內容分發網絡(CDN)、靜態資源緩存。
動態算法
- 最小連接(Least Connections, lc)
- 原理:將請求分配給當前連接數最少的 RS,認為連接數少的服務器負載低。
- 優點:自動平衡服務器負載,避免單臺服務器過載。
- 缺點:未考慮連接的活躍程度(如長連接與短連接的差異)。
- 適用場景:連接生命周期差異不大的業務。
- 加權最小連接(Weighted Least Connections, wlc)
- 原理:在最小連接基礎上,結合服務器性能權重(如
active_conns/weight
),優先分配給 “單位權重連接數” 最少的 RS。 - 優點:綜合考慮服務器性能和實時負載,分配更精準。
- 缺點:需預設權重,且計算復雜度略高。
- 適用場景:服務器性能差異明顯,且連接生命周期相近的業務。
- 原理:在最小連接基礎上,結合服務器性能權重(如
- 最短期望延遲(Shortest Expected Delay, sed)
- 原理:計算每個 RS 的預期處理時間(overhead=(activeconns+1+inactiveconns) x 256/weight),選擇預期延遲最小的 RS。
- 優點:相比 wlc,更傾向于為低負載服務器分配新請求,避免高負載服務器堆積請求。
- 缺點:仍依賴預設權重。
- 適用場景:連接建立成本較高的業務(如數據庫連接)。
- 永不排隊(Never Queue, nq)
- 原理:若 RS 的連接數為 0,直接分配;否則選擇連接數最少的 RS。
- 優點:避免新請求在高負載服務器排隊,快速響應。
- 缺點:可能導致部分服務器過載,部分閑置。
- 適用場景:對響應時間敏感、請求處理時間差異大的業務。
- 基于局部性的最小連接(Locality-Based Least Connections, lblc)
- 原理:結合源地址哈希和最小連接算法,優先將請求分配給已處理過該客戶端請求且負載較低的 RS,否則選擇全局連接數最少的 RS。
- 優點:兼顧會話粘性和負載均衡,適合緩存集群(如 Redis 集群)。
- 缺點:實現復雜度較高。
- 適用場景:內容緩存、分布式存儲系統。
4.15內核后新增調度算法
1.FO(Weighted Fai Over)調度算法:常用作灰度發布
- 在此FO算法中,遍歷虛擬服務所關聯的真實服務器鏈表,找到還未過載(未設置IP_VS_DEST_FOVERLOAD標志)的且權重最高的真實服務器,進行調度
- 當服務器承接大量鏈接,我們可以對此服務器進行過載標記(IP_VS_DEST_F OVERLOAD),那么vs調度器就不會把鏈接調度到有過載標記的主機中。
2.OVF(Overflow-connection)調度算法
基于真實服務器的活動連接數量和權重值實現。將新連接調度到權重值最高的真實服務器,直到其活動
連接數量超過權重值,之后調度到下一個權重值最高的真實服務器,在此OVF算法中,遍歷虛擬服務相關
聯的真實服務器鏈表,找到權重值最高的可用真實服務器。一個可用的真實服務器需要同時滿足以下條
件:
- 未過載(未設置IP_VS_DEST_F OVERLOAD標志)
- 真實服務器當前的活動連接數量小于其權重值
- 其權重值不為零
五、lvs部署命令介紹
lvs軟件相關信息
程序包:ipvsadm
Unit File: ipvsadm.service
主程序:/usr/sbin/ipvsadm
規則保存工具:/usr/sbin/ipvsadm-save
規則重載工具:/usr/sbin/ipvsadm-restore
配置文件:/etc/sysconfig/ipvsadm-config
ipvs調度規則文件:/etc/sysconfig/ipvsadm
ipvsadm命令
虛擬服務
ipvsadm -A|E -t|u|f 服務/IP/火墻標記 [-s 算法] [-p [超時時間]]
-A #添加
-E #修改
-t #tcp服務
-u #udp服務
-f #firewall mask 火墻標記,是一個數字
-s #指定調度算法,默認為WLC
-p #設置持久連接超時,持久連接可以理解為在同一個時間段同一個來源的請求調度到同一Realserver
真實服務器
ipvsadm -a|e -t|u|f 服務/IP/火墻標記 -r realserver-address [-g|i|m] [-w weight]
-a #添加realserver
-e #更改realserver-t #tcp協議
-u #udp協議
-f #火墻 標簽-r #realserver地址-g #DR模式
-i #TUN模式
-m #NAT模式-w #設定權重
其他
ipvsadm
-Z #清空計數器
-C #清空lvs策略
-L #查看lvs策略
-n #不做解析
--rate :輸出速率信息
部署NAT模式集群案例
實驗環境
主機 | ip及網卡模式 | 角色 |
---|---|---|
client | 192.168.60.100 GW:192.168.60.2 NAT模式 | 測試機 |
lvs | vip:eth0 192.168.60.200 NAT模式 dip:eth1 192.168.182.200 僅主機模式 | 調度器(VS) |
rs1 | 192.168.182.210 GW:192.168.60.200 僅主機模式 | 真實服務器(RS) |
rs2 | 192.168.182.220 GW:192.168.60.200 僅主機模式 | 真實服務器(RS) |
網絡部署
client
vim /etc/NetworkManager/system-connections/eth0.nmconnection
#寫入配置
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=192.168.60.100/24,192.168.60.2
dns=8.8.8.8#使配置生效
nmcli connection reload #重新加載網絡配置
nmcli connection up eth0 #重啟網卡
lvs
#編輯eth0網卡配置文件
vim /etc/NetworkManager/system-connections/eth0.nmconnection
#寫入配置
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=192.168.60.200/24
dns=8.8.8.8#編輯eth1網卡配置文件
vim /etc/NetworkManager/system-connections/eth1.nmconnection
#寫入配置
[connection]
id=eth1
type=ethernet
interface-name=eth1[ipv4]
method=manual
address1=192.168.182.200/24
dns=8.8.8.8#使配置生效
nmcli connection reload #重新加載網絡配置
nmcli connection up eth0 #重啟網卡
nmcli connection up eth1#開啟內核路由功能
#編輯內核參數文件
vim /etc/sysctl.conf
#啟用IP轉發,讓主機內網卡可以通信,使Linux系統充當路由器
net.ipv4.ip_forward = 1
#是配置立即生效
sysctl -p
rs1
vim /etc/NetworkManager/system-connections/eth0.nmconnection
#寫入配置
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=192.168.182.210/24,192.168.182.200 #網關設置為dip,
dns=8.8.8.8#關閉防火墻
systemctl disable --now firewalld.service
rs2
vim /etc/NetworkManager/system-connections/eth0.nmconnection
#寫入配置
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=192.168.182.220/24,192.168.182.200
dns=8.8.8.8nmcli connection reload #重新加載網絡配置
nmcli connection up eth0 #重啟網卡
程序、文件部署
lvs
#安裝ipvsadm
dnf install ipvsadm-1.31-6.el9.x86_64 -y#關閉防火墻
systemctl disable --now firewalld.service
rs1
#安裝httpd
dnf install httpd
#開啟服務,啟用80端口
systemctl start httpd
#寫入apache默認頁面
echo RS1 192.168.182.210 > /var/www/html/index.html#關閉防火墻
systemctl disable --now firewalld.service
rs2
#安裝httpd
dnf install httpd
#開啟服務,啟用80端口
systemctl start httpd
#寫入apache默認頁面
echo RS2 192.168.182.220 > /var/www/html/index.html#關閉防火墻
systemctl disable --now firewalld.service
添加調度策略
lvs
#添加虛擬服務器 指定其ip和端口192.168.60.200:80 算法為Round Robin(輪詢)
ipvsadm -A -t 192.168.60.200:80 -s rr
#為虛擬服務器指定后端真實服務器 模式為nat
ipvsadm -a -t 192.168.60.200:80 -r 192.168.182.210:80 -m
ipvsadm -a -t 192.168.60.200:80 -r 192.168.182.220:80 -m#保存規則
ipvsadm -Sn > /etc/sysconfig/ipvsadm#設置開機自啟動,需要先將文件規則/etc/sysconfig/ipvsadm
systemctl enable --now ipvsadm.service
測試
client
lvs
部署DR模式集群案例
實驗環境
#五臺主機環境相同
[root@RS2 ~]# hostnamectlStatic hostname: RS2Icon name: computer-vmChassis: vm 🖴Machine ID: a4903574870e4a5680ed175ce460853aBoot ID: 987e45e2cdbe4679833e155842096ebbVirtualization: vmware
Operating System: Red Hat Enterprise Linux 9.4 (Plow) CPE OS Name: cpe:/o:redhat:enterprise_linux:9::baseosKernel: Linux 5.14.0-427.13.1.el9_4.x86_64Architecture: x86-64Hardware Vendor: VMware, Inc.Hardware Model: VMware Virtual Platform
Firmware Version: 6.00
網絡部署
主機 | ip及網卡模式 | 角色 |
---|---|---|
client | eth0:192.168.60.100 NAT模式 GW:192.168.60.200 | 測試機 |
route | eth0:192.168.60.200 NAT模式 eth1:192.168.182.200 僅主機模式 | 路由器 |
lvs | eth0:192.168.60.230 僅主機模式 vip:192.168.182.100 GW:192.168.182.200 | 調度器 |
rs1 | eth0:192.168.60.210 僅主機模式 vip:192.168.182.100 GW:192.168.182.2 | 真實服務器 |
rs2 | eth0:192.168.60.220 僅主機模式 vip:192.168.182.100 GW:192.168.182.2 | 真實服務器 |
client
vim /etc/NetworkManager/system-connections/eth0.nmconnection
#寫入配置
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=192.168.60.100/24,192.168.60.200#使配置生效
nmcli connection reload #重新加載網絡配置
nmcli connection up eth0 #重啟網卡
route
#編輯eth0網卡配置文件
vim /etc/NetworkManager/system-connections/eth0.nmconnection
#寫入配置
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=192.168.60.200/24#編輯eth1網卡配置文件
vim /etc/NetworkManager/system-connections/eth1.nmconnection
#寫入配置
[connection]
id=eth1
type=ethernet
interface-name=eth1[ipv4]
method=manual
address1=192.168.182.200/24#使配置生效
nmcli connection reload #重新加載網絡配置
nmcli connection up eth0 #重啟網卡
nmcli connection up eth1#開啟內核路由功能
#編輯內核參數文件
vim /etc/sysctl.conf
#啟用IP轉發,讓主機內網卡可以通信,使Linux系統充當路由器
net.ipv4.ip_forward = 1
#是配置立即生效
sysctl -p
lvs
#編輯eth0網卡配置文件
vim /etc/NetworkManager/system-connections/eth0.nmconnection
#寫入配置
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=192.168.182.230/24,192.168.182.200#編輯lo網卡配置文件
vim /etc/NetworkManager/system-connections/lo.nmconnection
#寫入配置
[connection]
id=lo
type=loopback
interface-name=lo[ipv4]
method=manual
address1=127.0.0.1/8
address2=192.168.182.100/32 #vip#修改權限
chmod 600 /etc/NetworkManager/system-connections/lo.nmconnection#使配置生效
nmcli connection reload #重新加載網絡配置
nmcli connection up eth0 #重啟網卡
nmcli connection up lo#ip 查看配置是否生效,如果ip未添加
[root@RS1 system-connections]#ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 00:0c:29:1d:88:df brd ff:ff:ff:ff:ff:ffaltname enp3s0altname ens160inet 192.168.182.210/24 brd 192.168.182.255 scope global noprefixroute eth0valid_lft forever preferred_lft foreverinet6 fe80::869f:ac0c:2ae7:302e/64 scope link noprefixroute valid_lft forever preferred_lft forever#查看連接 可以看到有兩個lo
[root@RS1 system-connections]# nmcli connetcion show
NAME UUID TYPE DEVICE
eth0 7ba00b1d-8cdd-30da-91ad-bb83ed4f7474 ethernet eth0
lo d4597a3b-5641-4c5a-81cd-ccf60082d7f8 loopback lo
lo b2baf1f3-48fa-398c-a8e1-e2e1f6a15e21 loopback -- #刪除第一個lo 配置生效
[root@RS1 system-connections]# nmcli c delete d4597a3b-5641-4c5a-81cd-ccf60082d7f8
Connection 'lo' (d4597a3b-5641-4c5a-81cd-ccf60082d7f8) successfully deleted.
rs1
#編輯eth0網卡配置文件
vim /etc/NetworkManager/system-connections/eth0.nmconnection
#寫入配置
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=192.168.182.210/24,192.168.182.2#編輯lo網卡配置文件
vim /etc/NetworkManager/system-connections/lo.nmconnection
#寫入配置
[connection]
id=lo
type=loopback
interface-name=lo[ipv4]
method=manual
address1=127.0.0.1/8
address2=192.168.182.100/32 #vip#修改權限
chmod 600 /etc/NetworkManager/system-connections/lo.nmconnection#使配置生效
nmcli connection reload #重新加載網絡配置
nmcli connection up eth0 #重啟網卡
nmcli connection up lo#設定lo不對外響應
vim /etc/sysctl.conf
#寫入
#arp_ignore(ARP 忽略策略):僅當 ARP 請求的目標 IP 配置在接收請求的網卡上時,才響應;否則忽略。
#arp_announce(ARP 宣告策略):強制使用與目標 IP 同網段的本地 IP 作為源 IP(必須同網段,否則不發送)。
net.ipv4.conf.all.arp_ignore =1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore =1
net.ipv4.conf.lo.arp_announce =2
#
sysctl -p
rs2
vim /etc/NetworkManager/system-connections/eth0.nmconnection
#寫入配置
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address1=192.168.182.220/24,192.168.182.2#編輯lo網卡配置文件
vim /etc/NetworkManager/system-connections/lo.nmconnection
#寫入配置
[connection]
id=lo
type=loopback
interface-name=lo[ipv4]
method=manual
address1=127.0.0.1/8
address2=192.168.182.100/32 #vip#修改權限
chmod 600 /etc/NetworkManager/system-connections/lo.nmconnection#使配置生效
nmcli connection reload #重新加載網絡配置
nmcli connection up eth0 #重啟網卡
nmcli connection up lo#設定lo不對外響應
vim /etc/sysctl.conf
#寫入
net.ipv4.conf.all.arp_ignore =1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore =1
net.ipv4.conf.lo.arp_announce =2
#
sysctl -p
程序、文件部署
lvs
#安裝ipvsadm
dnf install ipvsadm-1.31-6.el9.x86_64 -y#關閉防火墻
systemctl disable --now firewalld.service
rs1
#安裝httpd
dnf install httpd
#開啟服務,啟用80端口
systemctl start httpd
#寫入apache默認頁面
echo RS1 192.168.182.210 > /var/www/html/index.html#關閉防火墻
systemctl disable --now firewalld.service
rs2
#安裝httpd
dnf install httpd
#開啟服務,啟用80端口
systemctl start httpd
#寫入apache默認頁面
echo RS2 192.168.182.220 > /var/www/html/index.html#關閉防火墻
systemctl disable --now firewalld.service
添加調度策略
#添加虛擬服務器 指定其ip和端口192.168.182.100:80 算法為Round Robin(輪詢)
ipvsadm -A -t 192.168.182.100:80 -s rr
#為虛擬服務器指定后端真實服務器 模式為DR
ipvsadm -a -t 192.168.182.100:80 -r 192.168.182.210:80 -g
ipvsadm -a -t 192.168.182.100:80 -r 192.168.182.220:80 -g#保存規則
ipvsadm -Sn > /etc/sysconfig/ipvsadm#設置開機自啟動,需要先將文件規則/etc/sysconfig/ipvsadm
systemctl enable --now ipvsadm.service
測試
client
lvs
防火墻標記解決輪詢調度問題
現象
在RS中同時開放80和443端口,那么默認控制是分開輪詢的,這樣我們就出現了一個輪詢錯亂的問題,當我第一次訪問80被輪詢到RS1后下次訪問443仍然可能會被輪詢到RS1上
原因
LVS 內核模塊將每個虛擬服務(VIP:Port)視為獨立實體,并且每個實體都擁有自己的:
- 調度算法實例(如 RR 計數器)
- 活動連接列表
- 服務器權重配置
這意味這80和443端口的輪詢序列都是獨立的
解決方法
1.合并端口
本質:讓所有請求(無論是原始 80 還是 443)最終都通過同一個端口(443) 進入負載均衡系統,共享同一套調度上下文
ipvs
# 創建虛擬服務,監聽443端口,使用輪詢(RR)算法
ipvsadm -A -t 192.168.1.1:443 -s rr# 添加后端RS服務器,注意端口為443(假設RS1和RS2都提供HTTPS服務)
ipvsadm -a -t 192.168.1.1:443 -r 192.168.10.1:443 -g # -g表示DR模式
ipvsadm -a -t 192.168.1.1:443 -r 192.168.10.2:443 -g
iptables 重定向規則(將 80→443)
# 將80端口請求重定向到443
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 443#
rs僅監聽443端口
2.iptables mark 標記
無論合并端口還是標記,核心目標都是打破 “VIP:Port 獨立調度” 的限制
iptables mark
本質通過標記將不同端口的請求邏輯上歸為同一組,讓 LVS 對它們使用同一個調度上下文(共享 RR 計數器)。
MARK
屬于 iptables
的一種目標(target),借助它能夠給通過規則的數據包附上特定數值。這些被標記的數據包可以在后續的規則或者其他網絡子系統(像路由表)中被識別出來,進而實現有針對性的處理。
MARK target 可用于給特定的報文打標記,–set-mark value
value 可為0xffff格式,表示十六進制數字借助于防火墻標記來分類報文,而后基于標記定義集群服
務:可將多個不同的應用使用同一個集群服務進行調度
環境
配置于此不過多贅述,參考DR集群案例
新增配置
rs1,rs2
#安裝加密模塊,實現https協議服務
yum install mod_ssl -y
#重啟httpd,是配置生效
systemctl restart httpd
lvs
# 向mangele PREROUTING鏈 添加規則 用于匹配ip-192.168.182.100 協議-tcp 端口:80\443 ,滿足以上條件者打上標記666
#將80和443歸為同一組,使用同一個集群服務調度
iptables -t mangle -A PREROUTING -d 192.168.182.100 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 666#寫入規則
ipvsadm -A -f 666 -s rr
ipvsadm -a -f 666 -r 192.168.182.210 -g
ipvsadm -a -f 666 -r 192.168.182.220 -g
測試
連續訪問80,443五次,可以從每次結果看出,完全遵照rr算法結果,每次訪問的主機不同