目錄
1.1 LVS簡介
1.2 LVS體系結構
1.3 LVS相關術語
1.4 LVS工作模式
1.5?LVS工作原理
1.6 LVS調度算法
2.LVS相關實驗部署
2.1 lvs軟件相關信息
2.1.1 ipsadm常見參數
2.1.2 試例
2.2 LVS部署NAT模式
2.2.1 實驗環境
2.2.2 實驗步驟
2.2.2.1 實驗基礎環境
2.2.2.2 追加配置
2.3 LVS部署DR模式
2.3.1 實驗環境
2.3.2?實驗步驟
2.3.2.1 實驗基礎環境
2.3.2.2 追加配置
2.4 防火墻標記解決調度問題
2.4.1 問題重現
2.4.2 解決方法
1.1 LVS簡介
?????????LVS 是 Linux Virtual Server 的簡稱,也就是 Linux 虛擬服務器。這是一個由章文嵩博士發起的一個開源項目,它的官方網站是http://www.linuxvirtualserver.org/,現在 LVS 已經是 Linux 內核標準的一部分。
????????LVS 可以達到的技術目標是:通過 LVS 達到的負載均衡技術和 Linux 操作系統實現一個高性能高可用的 Linux 服務器集群,它具有良好的可靠性、可擴展性和可操作性。從而以低廉的成本實現最優的性能。
1.2 LVS體系結構
????????LVS 架構從邏輯上可分為Load Balance(負載調度器)、Real Server(Server 集群層)和Shared Storage(共享存儲層)。
????????第一層:Load Balance(負載調度器),它是訪問整個群集系統的唯一入口,對外使用所有服務器共有的虛擬IP地址,也成為群集IP地址。
????????負載均衡器:是服務器群集系統的單個入口點,可運行 IPVS,該 IPVS 在 Linux 內核或KTCPVS 內部實現 IP 負載均衡技術,在 Linux 內核中實現應用程序級負載平衡。使用 IPVS 時,要求所有服務器提供相同的服務和內容,負載均衡器根據指定的調度算法和每個服務器的負載將新的客戶端請求轉發到服務器。無論選擇哪個服務器,客戶端都應獲得相同的結果。使用 KTCPVS 時,服務器可以具有不同的內容,負載均衡器可以根據請求的內容將請求轉發到其他服務器。由于 KTCPVS 是在 Linux 內核內部實現的,因此中繼數據的開銷很小,因此仍可以具有較高的吞吐量。
????????第二層:Real Server(Server 集群層),群集所提供的應用服務,比如:HTTP、FTP服務器池來承擔,每個節點具有獨立的真實IP地址,只處理調度器分發過來的客戶機請求。
????????服務器群集的節點可根據系統所承受的負載進行分擔。當所有服務器過載時,可添加多臺服務器來處理不斷增加的工作負載。對于大多數 Internet 服務(例如Web),請求通常沒有高度關聯,并且可以在不同服務器上并行運行。因此,隨著服務器群集的節點數增加,整體性能幾乎可以線性擴展。
????????第三層:Shared Storage(共享存儲層),為服務器池中的所有節點提供穩定、一致的文件存儲服務,確保整個群集的統一性,可使用 NAS 設備或提供 NFS (Network File System)網絡文件系統共享服務的專用服務器。
????????共享存儲:可以是數據庫系統,網絡文件系統或分布式文件系統。服務器節點需要動態更新的數據應存儲在基于數據的系統中,當服務器節點并行在數據庫系統中讀寫數據時,數據庫系統可以保證并發數據訪問的一致性。靜態數據通常保存在網絡文件系統(例如 NFS 和 CIFS)中,以便可以由所有服務器節點共享數據。但是,單個網絡文件系統的可伸縮性受到限制,例如,單個NFS / CIFS 只能支持 4 到 8 個服務器的數據訪問。對于大型集群系統,分布式/集群文件系統可以用于共享存儲,例如 GPFS,Coda 和 GFS,然后共享存儲也可以根據系統需求進行擴展。
1.3 LVS相關術語
- LB (Load Balancer 負載均衡)
- HA (High Available 高可用)
- Failover (失敗切換)
- Cluster (集群)
- LVS (Linux Virtual Server Linux 虛擬服務器)
- DS (Director Server),指的是前端負載均衡器節點
- RS (Real Server),后端真實的工作服務器
- VIP (Virtual IP),虛擬的IP地址,向外部直接面向用戶請求,作為用戶請求的目標的 IP 地址
- DIP (Director IP),主要用于和內部主機通訊的 IP 地址
- RIP (Real Server IP),后端服務器的 IP 地址
- CIP (Client IP),訪問客戶端的 IP 地址
訪問流程:CIP <--> VIP == DIP <--> RIP
1.4 LVS工作模式
LVS有4種工作模式模式(NAT,TUN,DR,fullnat), 但fullnat工作模式默認不支持
LVS-NAT(Network Address Translation):在該模式下,負載均衡器不僅需要修改請求報文的目標地址,還需要修改響應報文的源地址,適用于小規模集群。?
LVS-DR(Direct Routing):在該模式下,負載均衡器只修改請求報文的目標MAC地址,而不修改IP地址,后端服務器直接將響應報文發回客戶端,適用于大規模集群。
LVS-TUN(IP Tunneling):該模式通過IP隧道將請求轉發到后端服務器,后端服務器直接將響應報文發回客戶端,適用于地理位置分散的集群。
1.5?LVS工作原理
LVS-NAT工作原理
????????調度器接收客戶端請求后,會修改請求報文的目標 IP 地址(即 VIP)為后端真實服務器的 IP 地址(RIP),同時記錄這個連接。真實服務器處理完請求后,將響應報文返回給調度器,調度器再把響應報文的源 IP 地址修改回 VIP,最后發送給客戶端。整個過程中,客戶端只和調度器有網絡交互,對真實服務器無感知。
LVS-DR工作原理
????????調度器接收到客戶端請求后,會通過修改數據幀的 MAC 地址(把目標 MAC 地址改為后端真實服務器的 MAC 地址),將請求轉發給真實服務器。真實服務器處理完請求后,直接把響應報文發送給客戶端。和 TUN 模式一樣,真實服務器需要配置 VIP,并且能直接和客戶端通信。不過與 TUN 模式不同的是,DR 模式是通過修改 MAC 地址來轉發請求,而不是封裝 IP 報文。
?LVS-TUN工作原理
????????調度器收到客戶端請求后,會在原有的 IP 報文外面再封裝一層新的 IP 頭,新 IP 頭的目標地址是后端真實服務器的 IP 地址。真實服務器收到這個封裝后的報文后,會解封裝獲取原始請求,然后直接將響應報文發送給客戶端(源 IP 地址為 VIP)。這種模式要求真實服務器和調度器都得有公網 IP,且真實服務器能直接和客戶端通信。
LVS-fullnat工作原理
????????該模式是對 NAT 模式的改進。調度器在接收客戶端請求后,會同時修改請求報文的源 IP 地址(改為調度器的 IP 地址)和目標 IP 地址(改為后端真實服務器的 IP 地址)。真實服務器處理完請求后,將響應報文發送給調度器,調度器再把響應報文轉發給客戶端。這種模式的優勢在于,調度器和真實服務器可以不在同一個網段,而且真實服務器可以使用私有 IP 地址。
4種工作模式的對比
特性 | NAT 模式 | TUN 模式 | DR 模式 | ?fullnat模式 |
---|---|---|---|---|
轉發機制 | 修改 IP 包的源 / 目標 IP 地址 | 在原 IP 包外封裝新 IP 頭 | 修改 MAC 地址 | 同時修改源和目標 IP 地址 |
請求流向 | 客戶端 → 調度器 → 真實服務器 | 客戶端 → 調度器 → 真實服務器 | 客戶端 → 調度器 → 真實服務器 | 客戶端 → 調度器 → 真實服務器 |
響應流向 | 真實服務器 → 調度器 → 客戶端 | 真實服務器 → 客戶端 | 真實服務器 → 客戶端 | 真實服務器 → 調度器 → 客戶端 |
真實服務器網關配置 | 需要指向調度器 | 無需指向調度器 | 無需指向調度器 | 需要指向調度器 |
真實服務器 IP 類型 | 公網或私網 IP | 公網 IP | 公網或私網 IP | 私網 IP |
網絡拓撲要求 | 調度器與真實服務器 需同網段 | 調度器與真實服務器 可跨網段 | 調度器與真實服務器 需同網段 | 調度器與真實服務器 可跨網段 |
調度器壓力 | 高(處理所有請求和響應) | 中(僅處理請求) | 低(僅處理請求) | 中(處理所有請求和響應) |
性能 | 較低(轉發效率低) | 高(直接路由響應) | 最高(直接路由響應) | 中(NAT 改進版) |
部署復雜度 | 低(單網卡即可) | 高(需支持 IP 隧道) | 中(需配置 ARP 抑制) | 中(需支持雙向 NAT) |
典型應用場景 | 小規模集群,RS 為私有 IP | 大規模互聯網服務 | 大規模高性能集群 | 跨網段部署的私有云環境 |
1.6 LVS調度算法
LVS調度算法分為兩種:靜態調度算法和動態調度算法
靜態調度算法:即調度器不會去判斷后端服務器的繁忙與否,一如既往得將請求派發下去。
動態調度算法:調度器會去判斷后端服務器的繁忙程度,然后依據調度算法動態得派發請求。
靜態調度算法:rr,wrr,dh,sh
動態調度算法:wlc,lc,lblc,lblcr,SED,NQ
rr | 輪詢:Round Robin,將收到的訪問請求按順序輪流分配給群集中的各節點真實服務器中,不管服務器實際的連接數和系統負載。 |
wrr | 加權輪詢:Weighted Round Robin,根據真實服務器的處理能力輪流分配收到的訪問請求,調度器可自動查詢各節點的負載情況,并動態跳轉其權重,保證處理能力強的服務器承擔更多的訪問量。 |
dh | 目標地址散列調度算法:DH,該算法是根據目標 IP 地址通過散列函數將目標 IP 與服務器建立映射關系,出現服務器不可用或負載過高的情況下,發往該目標 IP 的請求會固定發給該服務器。 |
sh | 源地址散列調度算法:SH,與目標地址散列調度算法類似,但它是根據源地址散列算法進行靜態分配固定的服務器資源。 |
wlc | 加權最少連接:Weighted Least Connections,服務器節點的性能差異較大的情況下,可以為真實服務器自動調整權重,權重較高的節點將承擔更大的活動連接負載。 |
lc | 最少連接:Least Connections,根據真實服務器已建立的連接數進行分配,將收到的訪問請求優先分配給連接數少的節點,如所有服務器節點性能都均衡,可采用這種方式更好的均衡負載。 |
lblc | 基于局部性的最少連接:LBLC,基于局部性的最少連接調度算法用于目標 IP 負載平衡,通常在高速緩存群集中使用。如服務器處于活動狀態且處于負載狀態,此算法通常會將發往 IP 地址的數據包定向到其服務器。如果服務器超載(其活動連接數大于其權重),并且服務器處于半負載狀態,則將加權最少連接服務器分配給該 IP 地址。 |
lblcr | 復雜的基于局部性的最少連接:LBLCR,具有復雜調度算法的基于位置的最少連接也用于目標IP負載平衡,通常在高速緩存群集中使用。與 LBLC 調度有以下不同:負載平衡器維護從目標到可以為目標提供服務的一組服務器節點的映射。對目標的請求將分配給目標服務器集中的最少連接節點。如果服務器集中的所有節點都超載,則它將拾取群集中的最少連接節點,并將其添加到目標服務器群中。如果在指定時間內未修改服務器集群,則從服務器集群中刪除負載最大的節點,以避免高度負載。 |
SED | 最短延遲調度:SED,最短的預期延遲調度算法將網絡連接分配給具有最短的預期延遲的服務器。如果將請求發送到第 i 個服務器,則預期的延遲時間為(Ci +1)/ Ui,其中 Ci 是第 i 個服務器上的連接數,而 Ui 是第 i 個服務器的固定服務速率(權重) 。 |
NQ | 永不排隊調度:NQ,從不隊列調度算法采用兩速模型。當有空閑服務器可用時,請求會發送到空閑服務器,而不是等待快速響應的服務器。如果沒有可用的空閑服務器,則請求將被發送到服務器,以使其預期延遲最小化(最短預期延遲調度算法)。 |
在4.15版本內核以后新增調度算法
FO | (Weighted Fai Over)調度算法,常用作灰度發布。在此算法中,遍歷虛擬服務所關聯的真實服務器鏈表,找到還未過載(未設置IP_VS_DEST_FOVERLOAD標志)的且權重最高的真實服務器,進行調度,當服務器承接大量鏈接,對此服務器進行過載標記(IP_VS_DEST_F OVERLOAD),那么vs調度器就不會把鏈接調度到有過載標記的主機中 |
OVF | (Overflow-connection)調度算法,基于真實服務器的活動連接數量和權重值實現。將新連接調度到權重值最高的真實服務器,直到其活動連接數量超過權重值,之后調度到下一個權重值最高的真實服務器,在此OVF算法中,遍歷虛擬服務相關聯的真實服務器鏈表,找到權重值最高的可用真實服務器。一個可用的真實服務器需要同時滿足以下條件:1.未過載(未設置IP_VS_DEST_F OVERLOAD標志)? 2.真實服務器當前的活動連接數量小于其權重值? 3.其權重值不為零 |
2.LVS相關實驗部署
實驗環境均為紅帽9.1的虛擬主機
2.1 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
2.1.1 ipsadm常見參數
選項 | 作用 |
-A | 添加一個虛擬服務,使用IP地址、端口號、協議來唯一定義一個虛擬服務 |
-E | 編輯一個虛擬服務 |
-D? | 刪除一個虛擬服務 |
-C | ?清空虛擬服務表 |
-R? | 從標準輸入中還原虛擬服務規則 |
-S | 保存虛擬服務規則值標準輸出,輸出的規則可以使用-R導入還原 |
-a | 在虛擬服務中添加一臺真實服務器 |
-e | 在虛擬服務中編輯一臺真實服務器 |
-d | 在虛擬服務中減少一臺真實服務器 |
-L | 顯示虛擬服務列表 |
-t? | 使用TCP服務,該參數后需要跟主機與端口信息 |
-u | 使用UDP服務,該參數會需要跟主機與端口信息 |
-s | 指定LVS所采用的的調度算法 |
-r | 設置真實服務器IP地址與端口信息 |
-g | 設置LVS工作模式為DR直連路由模式 |
-i? | 設置LVS工作模式為TUN隧道模式 |
-m | 設置LVS工作模式為NAT地址轉換模式 |
-w | 設置指定服務器的權重 |
-c | 連接狀態,需要配合-L使用 |
-n | 數字格式輸出 |
2.1.2 試例
管理虛擬服務
添加地址為172.25.254.100:80的虛擬服務,指定調度算法為輪詢。
ipvsadm -A -t 172.25.254.100:80 -s rr
修改虛擬服務的算法為加權輪詢
ipvsadm -E -t 172.25.254.100:80 -s wrr
刪除一個虛擬服務
ipvsadm -D -t 172.25.254.100:80
管理真實服務
添加一個真實服務器,使用DR模式,設置權重為2
ipvsadm -a -t 172.25.254.100:80 -r 192.168.1.10:80 -g -w 2
修改真實服務器的權重為5
ipvsadm -e -t 172.25.254.100:80 -r 192.168.1.10:80 -g -w 5
刪除一個真實服務器
ipvsadm -d -t 172.25.254.100:80 -r 192.168.1.10:80
2.2 LVS部署NAT模式
2.2.1 實驗環境
主機名 | IP | vip | 角色 |
---|---|---|---|
client | NAT:172.25.254.10 | 測試機 | |
lvs | 僅主機-eth1:192.168.1.100 | NAT-eth0:172.25.254.100 | 調度器 |
rs1 | 僅主機:192.168.1.10,GW:192.168.1.100 | null | 真實服務器 |
rs2 | 僅主機:192.168.1.20,GW:192.168.1.100 | null | 真實服務器 |
2.2.2 實驗步驟
2.2.2.1 實驗基礎環境
client
lvs
lvs調度器有兩塊網卡,多一塊“僅主機”網卡去連接兩臺真實服務器
RS
rs1和rs2的網卡都是“僅主機”模式
2.2.2.2 追加配置
(1)在lvs中啟用內核路由功能,讓內外網能進行一定程度的通信
[root@lvs ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
# 啟用配置
[root@lvs ~]# sysctl -p
net.ipv4.ip_forward = 1
?(2)在lvs中安裝ipvsadm
[root@lvs ~]# dnf install ipvsadm -y
(3)在rs1和rs2中關閉防火墻,并安裝httpd模擬提供服務
rs1
[root@rs1 ~]# systemctl disable --now firewalld.service # 關閉防火墻
[root@rs1 ~]# dnf install httpd -y # 安裝httpd
[root@rs1 ~]# echo "welcome to 192.168.1.10" > /var/www/html/index.html # 生成默認測試頁文件
[root@rs1 ~]# systemctl enable --now httpd # 開啟http服務rs2
[root@rs2 ~]# systemctl disable --now firewalld.service
[root@rs2 ~]# dnf install httpd -y
[root@rs2 ~]# echo "welcome to 192.168.1.20" > /var/www/html/index.html
[root@rs2 ~]# systemctl enable --now httpd
在lvs中訪問兩臺RS檢測http服務是否生效
(4)在lvs中添加調度策略
# 添加調度策略
[root@lvs ~]# ipvsadm -A -t 172.25.254.100:80 -s rr
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.1.10:80 -m
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.1.20:80 -m# 查看調度策略
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.254.100:80 rr-> 192.168.1.10:80 Masq 1 0 0-> 192.168.1.20:80 Masq 1 0 0# 在火墻中放行web服務,不然客戶端會訪問失敗
[root@lvs ~]# firewall-cmd --permanent --add-service=http
success
[root@lvs ~]# firewall-cmd --reload
success
(5)可選操作
# 保存規則
# /etc/sysconfig/下原本是沒有ipvsadm這個文件的,執行第一條命令會自動創建
[root@lvs ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@lvs ~]# cat /etc/sysconfig/ipvsadm
-A -t 172.25.254.100:80 -s rr
-a -t 172.25.254.100:80 -r 192.168.1.10:80 -m -w 1
-a -t 172.25.254.100:80 -r 192.168.1.20:80 -m -w 1# 刪除所有規則
[root@lvs ~]# ipvsadm -C
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn# 重新導入規則
[root@lvs ~]# ipvsadm -R < /etc/sysconfig/ipvsadm
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.254.100:80 rr-> 192.168.1.10:80 Masq 1 0 0-> 192.168.1.20:80 Masq 1 0 0
(6)客戶端訪問測試
? ? ? ? 連續訪問10次
2.3 LVS部署DR模式
2.3.1 實驗環境
主機名 | IP | vip | 角色 |
---|---|---|---|
client | NAT:172.25.254.10 | 測試機 | |
router | 僅主機-eth1:192.168.1.100 | NAT-eth0:172.25.254.100 | 路由器 |
lvs | 僅主機:192.168.1.200,GW:192.168.1.100 | lo:192.168.1.220 | 調度器 |
rs1 | 僅主機:192.168.1.10,GW:192.168.1.100 | lo:192.168.1.220 | 真實服務器 |
rs2 | 僅主機:192.168.1.20,GW:192.168.1.100 | lo:192.168.1.220 | 真實服務器 |
2.3.2?實驗步驟
2.3.2.1 實驗基礎環境
client
router
router路由器有兩塊網卡,多一塊“僅主機”網卡去連接lvs調度器
lvs
lvs的網卡變為“僅主機”模式
RS
rs1和rs2的網卡還是“僅主機”模式
2.3.2.2 追加配置
(1)router啟用內核路由功能
# 開啟路由內核功能
[root@router ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
[root@router ~]# sysctl -p
net.ipv4.ip_forward = 1
(2)對router的防火墻進行配置,不然客戶端訪問會失敗
[root@router ~]# firewall-cmd --permanent --add-masquerade
success
# 讓配置在當前的會話中生效
[root@router ~]# firewall-cmd --reload
success
(3)在lvs、rs1、rs2上關閉防火墻,并配置環回ip用作vip
ip addr add dev lo 192.168.1.220/32
# 該命令用于配置環回IP,但為臨時配置,重啟系統后失效
# 且只能用ip a查看,ifconfig看不到該信息
lvs
[root@lvs ~]# systemctl disable --now firewalld.service
[root@lvs ~]# ip addr add dev lo 192.168.1.220/32rs1
[root@rs1 ~]# systemctl disable --now firewalld.service
[root@rs1 ~]# ip addr add dev lo 192.168.1.220/32rs2
[root@rs2 ~]# systemctl disable --now firewalld.service
[root@rs2 ~]# ip addr add dev lo 192.168.1.220/32
(4)在lvs中安裝ipvsadm,并添加調度策略
安裝ipvsadm
[root@lvs ~]# dnf install ipvsadm -y# 添加調度策略
[root@lvs ~]# ipvsadm -A -t 192.168.1.220:80 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.1.220:80 -r 192.168.1.10:80 -g
[root@lvs ~]# ipvsadm -a -t 192.168.1.220:80 -r 192.168.1.20:80 -g# 查看調度策略
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.220:80 rr-> 192.168.1.10:80 Route 1 0 0-> 192.168.1.20:80 Route 1 0 0
(5)在rs1和rs2中安裝httpd模擬提供服務
rs1
[root@rs1 ~]# dnf install httpd -y
[root@rs1 ~]# echo "welcome to 192.168.1.10" > /var/www/html/index.html
[root@rs1 ~]# systemctl enable --now httpdrs2
[root@rs2 ~]# dnf install httpd -y
[root@rs2 ~]# echo "welcome to 192.168.1.20" > /var/www/html/index.html
[root@rs2 ~]# systemctl enable --now httpd
在lvs中訪問兩臺RS檢測http服務是否生效
(6)在RS1和RS2中解決vip響應問題
DR 模式的核心設計是:
????????調度器和所有真實服務器(RS)都需要配置相同的 VIP調度器用 VIP 接收客戶端請求,RS 用 VIP 作為響應的源 IP 直接返回給客戶端。但這種 “同一 VIP 在多臺機器上存在” 的情況,會引發兩個關鍵問題:
ARP 廣播沖突:當客戶端或網絡中的其他設備發送 ARP 請求(詢問 “VIP 對應的 MAC 地址是什么”)時,若所有 RS 都響應,會導致客戶端收到多個 MAC 地址,可能直接將請求發送給某臺 RS 而非調度器,繞過負載均衡。
響應路徑錯誤:若 RS 對 VIP 的 ARP 響應配置不當,可能導致客戶端后續請求直接發給 RS,而非通過調度器分發,破壞負載均衡策略。
? ? ? ? 因此需要對RS做關于vip的arp限制
rs1
# 解決vip響應問題
[root@rs1 ~]# echo "net.ipv4.conf.all.arp_ignore=1" >> /etc/sysctl.conf
[root@rs1 ~]# echo "net.ipv4.conf.all.arp_announce=2" >> /etc/sysctl.conf
[root@rs1 ~]# echo "net.ipv4.conf.lo.arp_ignore=1" >> /etc/sysctl.conf
[root@rs1 ~]# echo "net.ipv4.conf.lo.arp_announce=2" >> /etc/sysctl.conf
# 啟用配置
[root@rs1 ~]# sysctl -p
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 = 2rs2
[root@rs2 ~]# echo "net.ipv4.conf.all.arp_ignore=1" >> /etc/sysctl.conf
[root@rs2 ~]# echo "net.ipv4.conf.all.arp_announce=2" >> /etc/sysctl.conf
[root@rs2 ~]# echo "net.ipv4.conf.lo.arp_ignore=1" >> /etc/sysctl.conf
[root@rs2 ~]# echo "net.ipv4.conf.lo.arp_announce=2" >> /etc/sysctl.conf
[root@rs2 ~]# sysctl -p
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
(7)客戶端訪問測試
2.4 防火墻標記解決調度問題
? ? ? ? 在實際環境中,服務器不可能只提供一種服務,以http 和 https 為例,當我們在 RS 中同時開放 80 和 443 端口,那么默認控制是分開輪詢的,這樣我們就出現了一個輪詢錯亂的問題:當我第一次訪問 80 被輪詢到 RS1 后,下次訪問 443 仍然可能會被輪詢到 RS1 上。
2.4.1 問題重現
環境使用上一個實驗“LVS部署DR模式”做完的環境
(1)在rs1和rs2中安裝mod_ssl并重啟httpd服務(rs安裝mod_ssl模塊 是為了讓rs支持https)
[root@rs1 ~]# dnf install mod_ssl -y
[root@rs1 ~]# systemctl restart httpd[root@rs2 ~]# dnf install mod_ssl -y
[root@rs2 ~]# systemctl restart httpd
(2)查看httpd端口
(3)添加關于https的調度策略
[root@lvs ~]# ipvsadm -A -t 192.168.1.220:443 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.1.220:443 -r 192.168.1.10:443 -g
[root@lvs ~]# ipvsadm -a -t 192.168.1.220:443 -r 192.168.1.20:443 -g# 查看調度策略
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.220:80 rr-> 192.168.1.10:80 Route 1 0 0-> 192.168.1.20:80 Route 1 0 0
TCP 192.168.1.220:443 rr-> 192.168.1.10:443 Route 1 0 0-> 192.168.1.20:443 Route 1 0 0
(4)測試錯誤結果
2.4.2 解決方法
(1)先把原來的策略刪除
[root@lvs ~]# ipvsadm -C# 查看策略,此時為空
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
(2)在lvs調度器中配置防火墻標記,人為設定80和443是一個整體
[root@lvs ~]# iptables -t mangle -A PREROUTING -d 192.168.1.220 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 66# 查看結果
[root@lvs ~]# iptables -t mangle -nL
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
MARK tcp -- 0.0.0.0/0 192.168.1.220 multiport dports 80,443 MARK set 0x42Chain INPUT (policy ACCEPT)
target prot opt source destinationChain FORWARD (policy ACCEPT)
target prot opt source destinationChain OUTPUT (policy ACCEPT)
target prot opt source destinationChain POSTROUTING (policy ACCEPT)
target prot opt source destination
(3)重新配置調度策略
[root@lvs ~]# ipvsadm -A -f 66 -s rr
[root@lvs ~]# ipvsadm -a -f 66 -r 192.168.1.10 -g
[root@lvs ~]# ipvsadm -a -f 66 -r 192.168.1.20 -g[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 66 rr-> 192.168.1.10:0 Route 1 0 0-> 192.168.1.20:0 Route 1 0 0
?(4)客戶端訪問測試
可以看到,問題解決