Linux中的LVS集群技術

一、實驗環境(RHEL 9)

1、NAT模式的實驗環境

主機名IP地址網關網絡適配器功能角色
client172.25.254.111/24(NAT模式的接口)172.25.254.2NAT模式客戶機
lvs

172.25.254.100/24(NAT模式的接口)

192.168.0.100/24(僅主機模式的接口)

172.25.254.2

192.168.0.2

NAT模式

僅主機模式

開啟內核路由功能:

echo net.ipv4.ip_forward = 1 > /etc/sysctl.conf

負載均衡器
RS1192.168.0.10/24(僅主機模式的接口)192.168.0.100僅主機模式后端服務器1
RS2192.168.0.20/24(僅主機模式的接口)192.168.0.100僅主機模式后端服務器2

在RS1和RS2中下載http,并且在默認發布目錄文件中寫入對應的內容,例如RS1寫入RS1 - 192.168.0.10,RS2寫入RS2 - 192.168.0.20。

[root@RS1 桌面]# dnf install httpd -y
[root@RS1 桌面]# systemctl disable --now firewalld.service 
Removed "/etc/systemd/system/multi-user.target.wants/firewalld.service".
Removed "/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service".
[root@RS1 桌面]# echo RS1 - 192.168.0.10 > /var/www/html/index.html
[root@RS1 桌面]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@RS2 桌面]# dnf install httpd -y
[root@RS2 桌面]# systemctl disable --now firewalld.service 
Removed "/etc/systemd/system/multi-user.target.wants/firewalld.service".
Removed "/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service".
[root@RS2 桌面]# echo RS2 - 192.168.0.20 > /var/www/html/index.html
[root@RS2 桌面]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.

確保lvs可以通過curl訪問RS1和RS2。

2、DR模式的實驗環境

主機名IP地址網關網絡適配器功能角色
client172.25.254.111/24(NAT模式的接口)172.25.254.100NAT模式客戶機
router

172.25.254.100/24(NAT模式的接口)

192.168.0.100/24(僅主機模式的接口)

不需要網關

NAT模式

僅主機模式

開啟內核路由功能:

echo net.ipv4.ip_forward = 1 > /etc/sysctl.conf

路由器
DR-lvs

192.168.0.200/24和192.168.0.220/24(僅主機模式的接口)

127.0.0.1/8和192.168.0.220/32(回環接口)

192.168.0.100

僅主機模式

回環接口

負載均衡器
RS1

192.168.0.10/24(僅主機模式的接口)

127.0.0.1/8和192.168.0.220/32(回環接口)

192.168.0.100

僅主機模式

回環接口

后端服務器1
RS2

192.168.0.20/24(僅主機模式的接口)

127.0.0.1/8和192.168.0.220/32(回環接口)

192.168.0.100

僅主機模式

回環接口

后服務器2

配置回環接口IP地址的示例:

此回環接口IP地址的配置在DR-lvs、RS1、RS2上都要進行配置。

在DR-lvs上的額外配置:

需要在僅主機模式的這個接口上新添加一個192.168.0.220/24的IP地址

二、LVS集群的4種類型

LVS(Linux Virtual Server)是基于 Linux 內核的開源負載均衡解決方案,通過將多個服務器組成一個集群,實現高可用、高性能的服務。LVS 支持四種核心的集群類型(工作模式),它們在數據包轉發方式、架構復雜度和適用場景上有顯著區別:

1. NAT 模式(Virtual Server via Network Address Translation)

核心原理

LVS 負載均衡器作為流量的「雙向網關」,通過修改數據包的 IP 地址實現轉發,具體流程如下:

  • 客戶端請求(入站)
    客戶端向 LVS 的 VIP(虛擬 IP)發送請求,數據包源 IP 為客戶端 IP,目標 IP 為 VIP。
    LVS 接收后,僅修改目標 IP(將 VIP 替換為后端 RS 的私有 IP),源 IP 保持不變(仍為客戶端 IP),然后轉發給選定的 RS。

  • RS 響應(出站)
    RS 處理請求后,生成響應包,目標 IP 為客戶端 IP(因源 IP 未被修改),源 IP 為自身私有 IP。
    由于 RS 的默認網關指向 LVS,響應包會先回傳給 LVS。
    LVS 接收后,修改源 IP(將 RS 的私有 IP 替換為 VIP),再將數據包轉發給客戶端。

架構特點

  • 流量路徑:所有入站和出站流量必須經過 LVS,形成「客戶端 → LVS → RS → LVS → 客戶端」的閉環。

  • 網絡要求:LVS 與 RS 必須在同一子網(因依賴 LVS 作為網關),RS 的網關必須手動指向 LVS 的 IP。

  • VIP 配置:僅 LVS 需配置 VIP,RS 無需綁定 VIP(隱藏在私有子網中)。

優缺點

  • 優點

    • 配置簡單,RS 無需特殊設置(僅需指向 LVS 為網關)。

    • 支持任意 TCP/UDP 服務(如數據庫、FTP 等),兼容性強。

    • 安全性高,RS 隱藏在私有網絡,不直接暴露給客戶端。

  • 缺點

    • LVS 是流量瓶頸(所有數據需經其轉發),性能受限于 LVS 的帶寬和處理能力。

    • 僅適用于小規模集群(通常 RS 數量 ≤ 20 臺)。

適用場景

  • 小規模集群(如內部業務系統、低并發服務)。

  • 對安全性要求高(需隱藏 RS 真實 IP)。

  • 服務類型復雜(如需要雙向交互的協議)。

2. DR 模式(Virtual Server via Direct Routing)

核心原理

LVS 僅處理入站請求,通過修改數據包的?MAC 地址?而非 IP 地址轉發,出站流量由 RS 直接返回客戶端,流程如下:

  • 客戶端請求(入站)
    客戶端向 VIP 發送請求,數據包源 IP 為客戶端 IP,目標 IP 為 VIP,目標 MAC 地址為 LVS 的 MAC。
    LVS 接收后,不修改 IP 地址(源 IP 和目標 IP 保持不變),僅將目標 MAC 地址替換為選定 RS 的 MAC 地址,然后通過二層網絡(交換機)轉發給 RS。

  • RS 響應(出站)
    RS 已預先綁定 VIP(需配置在回環接口或禁用 ARP 響應,避免沖突),因此會接收目標 IP 為 VIP 的數據包。
    RS 處理后,直接以客戶端 IP 為目標、VIP 為源 IP 發送響應包,通過自身網絡接口直接返回給客戶端,無需經過 LVS

架構特點

  • 流量分離:入站流量經 LVS,出站流量由 RS 直連客戶端,LVS 負載極大降低。

  • VIP 配置:LVS 和所有 RS 必須綁定相同的 VIP(LVS 用于接收請求,RS 用于響應客戶端)。

  • 網絡要求:LVS 與 RS 必須在同一物理子網(二層可達),因依賴 MAC 地址轉發。

  • ARP 抑制:RS 需配置內核參數(如?arp_ignore=1arp_announce=2),避免對 VIP 的 ARP 請求做出響應,防止客戶端直接連接 RS。

優缺點

  • 優點

    • 性能極高(LVS 僅處理入站流量,無 IP 修改開銷),支持大規模集群(RS 可達數百臺)。

    • 出站流量不經過 LVS,避免瓶頸。

  • 缺點

    • 網絡拓撲受限(必須同一子網),跨網段部署困難。

    • RS 配置較復雜(需綁定 VIP 并抑制 ARP)。

適用場景

  • 高并發 Web 服務(如 HTTP/HTTPS)。

  • 大規模集群(如電商平臺、內容分發節點)。

  • 對響應速度要求極高的場景(如實時交互服務)。

3. TUN 模式(Virtual Server via IP Tunneling)

核心原理

通過?IP 隧道技術(如 IPIP、GRE)將客戶端請求封裝后轉發給 RS,突破子網限制,流程如下:

  • 客戶端請求(入站)
    客戶端向 VIP 發送請求,LVS 接收后,將原始數據包(源 IP:客戶端 IP,目標 IP:VIP)封裝在新的 IP 隧道中:

    • 外層隧道的源 IP 為 LVS 的 IP,目標 IP 為 RS 的隧道 IP(RS 預先配置的公網或跨網段 IP)。
      LVS 將封裝后的數據包發送給 RS。

  • RS 響應(出站)
    RS 解封裝隧道包,獲取原始請求(目標 IP 為 VIP),因自身已綁定 VIP,可直接處理請求。
    響應包以客戶端 IP 為目標、VIP 為源 IP,通過自身網絡直接返回客戶端,無需經過 LVS

架構特點

  • 跨網絡部署:LVS 與 RS 可位于不同子網、不同機房甚至跨公網(依賴隧道協議)。

  • 流量分離:入站流量經隧道轉發,出站流量由 RS 直連客戶端。

  • VIP 配置:LVS 和所有 RS 需綁定相同的 VIP(RS 綁定在隧道接口或回環接口)。

優缺點

  • 優點

    • 擴展性極強,支持跨地域集群(如多機房部署)。

    • 性能優于 NAT 模式(出站流量不經過 LVS)。

  • 缺點

    • 隧道封裝增加網絡開銷(約 20-40 字節 / 包),對高頻小數據包影響較明顯。

    • 需配置隧道協議(如 IPIP、GRE),RS 配置較復雜。

適用場景

  • 跨地域分布式集群(如 CDN 節點、多區域云服務)。

  • 突破子網限制的大規模集群(如跨數據中心負載均衡)。

4. Full-NAT 模式(Virtual Server via Full Network Address Translation)

核心原理

LVS 同時修改數據包的?源 IP 和目標 IP,實現「雙向地址轉換」,流程如下:

  • 客戶端請求(入站)
    客戶端向 VIP 發送請求,源 IP 為客戶端 IP,目標 IP 為 VIP。
    LVS 接收后,同時修改源 IP 和目標 IP

    • 源 IP:客戶端 IP → LVS 的私有 IP(避免 RS 直接與客戶端通信)。

    • 目標 IP:VIP → RS 的私有 IP。
      然后將修改后的數據包轉發給 RS。

  • RS 響應(出站)
    RS 處理后,生成響應包,源 IP 為自身私有 IP,目標 IP 為 LVS 的私有 IP(因入站時源 IP 已被修改)。
    響應包回傳給 LVS 后,LVS 將源 IP 替換為 VIP,目標 IP 替換為客戶端 IP,再返回給客戶端。

架構特點

  • 網絡靈活性:LVS 與 RS 無需同一子網,RS 的網關無需指向 LVS(只需能與 LVS 通信即可)。

  • 雙向流量經過 LVS:因源 IP 被修改,RS 無法直接響應客戶端,必須經 LVS 轉發。

  • 狀態跟蹤:LVS 需維護連接狀態表(記錄客戶端 IP 與 RS 的映射),確保響應包正確轉發。

優缺點

  • 優點

    • 網絡部署靈活,支持復雜拓撲(如 LVS 在公網、RS 在內網不同子網)。

    • 可隱藏客戶端真實 IP(RS 僅能看到 LVS 的私有 IP),安全性高于 DR/TUN 模式。

  • 缺點

    • LVS 處理所有雙向流量,性能低于 DR/TUN 模式,易成為瓶頸。

    • 需內核支持?ip_vs_fullnat?模塊(部分 Linux 發行版默認不啟用)。

適用場景

  • 網絡架構復雜(LVS 與 RS 跨子網、跨 VLAN)。

  • 需隱藏客戶端 IP(如防止 RS 被直接攻擊)。

  • 無法使用 DR/TUN 模式的場景(如 RS 無法綁定 VIP)。

四種模式核心差異對比表

維度NAT 模式DR 模式TUN 模式Full-NAT 模式
IP 修改入站改目標 IP,出站改源 IP不修改 IP,改 MAC 地址不修改 IP,隧道封裝入站同時改源 IP 和目標 IP
流量路徑雙向經 LVS入站經 LVS,出站 RS 直連入站經隧道,出站 RS 直連雙向經 LVS
網絡范圍同一子網同一物理子網(二層可達)跨子網 / 跨地域(依賴隧道)任意網絡(可跨子網)
性能低(瓶頸在 LVS)極高(僅入站經 LVS)中高(隧道有開銷)中(雙向經 LVS)
RS 網關配置必須指向 LVS 的內網 IP無需指向 LVS(可獨立設置網關)無需指向 LVS(可獨立設置網關)無需指向 LVS(獨立網關)
RS 配置復雜度低(僅需設網關)中(需抑制 ARP + 綁定 VIP)高(需配置隧道 + 綁定 VIP)低(無需綁定 VIP)
典型場景小規模集群、數據庫Web 服務、大規模集群跨地域集群、CDN復雜網絡架構、安全需求

三、LVS中的13種調度算法

LVS(Linux Virtual Server)提供了多種調度算法,用于決定如何將客戶端請求分配給后端服務器(RS)。這些算法可分為靜態調度(不考慮服務器負載)和動態調度(基于服務器實時負載)兩類,共 13 種核心算法。以下是詳細解析:

1、靜態調度算法(不考慮服務器負載)

1.?輪詢(Round Robin, rr)

  • 原理:按順序依次將請求分配給 RS,循環往復。

  • 優點:實現簡單,適用于各 RS 性能相近的場景。

  • 缺點:忽略服務器實際負載和處理能力差異,可能導致性能不均衡。

  • 示例:有三臺RS:訪問順序為RS1 → RS2 → RS3 → RS1 → RS2 → RS3 → ...

2.?加權輪詢(Weighted Round Robin, wrr)

  • 原理:根據 RS 的性能(如 CPU、內存、帶寬)分配權重,權重高的服務器接收更多請求。

  • 公式:請求數分配比例 = 服務器權重 / 總權重。

  • 優點:優化資源利用率,適合硬件配置差異較大的集群。

  • 示例:根據權重,訪問RS1三次后,訪問RS2兩次,最后再訪問RS31次,然后就是重復以上訪問順序。RS1(3) → RS2(2) → RS3(1) → RS1(3) → RS2(2) → ...

3.?源地址哈希(Source Hashing, sh)

  • 原理:根據客戶端 IP 地址計算哈希值,將同一 IP 的請求始終路由到固定 RS。

  • 公式:RS = Hash (Client_IP) % 服務器數量。

  • 優點:實現會話粘滯(Sticky Session),適合需保持會話狀態的服務(如購物車)。

  • 缺點:可能導致負載分布不均(如大量請求來自同一 IP 段)。

4.?目標地址哈希(Destination Hashing, dh)

  • 原理:根據請求的目標 IP(如 VIP)或端口計算哈希值,固定路由到同一 RS。

  • 適用場景:內容分發網絡(CDN)、反向代理緩存(如緩存服務器集群)。

  • 區別:與源地址哈希的方向相反,常用于服務器間負載均衡。

5.?IP 鏈(IP Link, ipip)

  • 原理:基于 IP 地址的前綴匹配,將特定 IP 段的請求路由到指定 RS。

  • 配置:需手動指定 IP 段與 RS 的映射關系。

  • 示例

    plaintext

    192.168.1.0/24 → RS1  
    192.168.2.0/24 → RS2  
    

6.?通用哈希(Generic Hashing, gh)

  • 原理:允許用戶自定義哈希函數,基于任意請求參數(如 URL、HTTP 頭)進行調度。

  • 優點:靈活性高,適合特殊業務需求(如按 URL 路徑分流)。

  • 實現:需通過內核模塊或自定義代碼擴展。

2、動態調度算法(基于服務器負載)

7.?最小連接(Least Connections, lc)

  • 原理:優先將請求分配給當前活躍連接數最少的 RS。

  • 公式:選擇?Active_Connections / Weight?值最小的服務器。

  • 優點:自動平衡負載,適合長連接服務(如數據庫、SSH)。

  • 缺點:對短連接服務(如 HTTP)效果有限。

8.?加權最小連接(Weighted Least Connections, wlc)

  • 原理:在最小連接基礎上,考慮服務器權重(權重高的服務器可承受更多連接)。

  • 公式:選擇?Active_Connections / Weight?值最小的服務器。

  • 示例:RS1 (權重 5) 當前 50 連接,RS2 (權重 1) 當前 10 連接,則優先分配給 RS2(50/5 > 10/1)。

9.?基于局部性的最小連接(Locality-Based Least Connections, lblc)

  • 原理:結合源地址哈希和最小連接算法:

    • 優先將同一 IP 的請求路由到上次處理的 RS(會話粘滯)。

    • 若該 RS 過載(連接數超過閾值),則分配給連接數最少的 RS。

  • 適用場景:緩存集群(如 Redis),減少緩存失效。

10.?帶復制的基于局部性的最小連接(Locality-Based Least Connections with Replication, lblcr)

  • 原理:在 lblc 基礎上,增加 “復制” 機制:

    • 當請求頻繁訪問某 RS 時,將該 RS 的內容復制到其他服務器(降低單點負載)。

  • 適用場景:內容分發網絡(CDN),通過復制熱點內容提升響應速度。

11.?目標地址哈希的最小連接(Destination Hashing with Least Connections, dh-lc)

  • 原理:結合目標地址哈希和最小連接算法:

    • 先按目標 IP 哈希選擇候選 RS 列表。

    • 再從候選列表中選擇連接數最少的 RS。

  • 適用場景:負載均衡器后端連接多個上游服務器(如反向代理)。

12.?最短預期延遲(Shortest Expected Delay, sed)

  • 原理:計算每個 RS 的預期處理延遲,選擇延遲最小的服務器。

  • 公式:預期延遲 = (Active_Connections + 1) / Weight。

  • 特點:相比 wlc,更傾向于分配請求給輕載服務器(避免重載服務器持續過載)。

13.?最少隊列調度(Never Queue, nq)

  • 原理:若有服務器處于空閑狀態(連接數為 0),直接分配;否則使用 sed 算法。

  • 優點:避免請求排隊,適合對響應時間敏感的服務。

3、內核 4.15 版本后的新增調度算法

1. 加權故障轉移(Weighted Fail Over, FO)

原理:遍歷虛擬服務關聯的真實服務器(RS)鏈表,優先選擇未過載權重最高的 RS 進行調度。當 RS 被標記為 “過載”(通過設置IP_VS_DEST_F_OVERLOAD標志)時,調度器會自動跳過該 RS,將請求轉發至其他符合條件的 RS。

優點:

  • 支持通過 “過載標記” 主動剔除故障或負載過高的節點,提高集群穩定性。

  • 權重機制可優先調度性能更強的 RS(權重高的節點優先處理請求),資源利用率更合理。

  • 適合灰度發布場景:可通過調整權重或標記過載,逐步將流量切換到新節點。

缺點:

  • 依賴人工或外部監控系統標記 “過載” 狀態,若標記不及時可能導致請求分配不合理。

  • 未考慮 RS 實時連接數等動態負載,僅通過權重和過載狀態調度,可能在高負載時不夠靈活。

適用場景:

  • 灰度發布、A/B 測試(通過權重控制流量比例)。

  • 需要手動干預節點狀態的場景(如臨時下線維護)。

  • 對節點故障敏感的服務(快速剔除異常節點)。

2. 溢出連接(Overflow-connection, OVF)

原理:基于 RS 的權重值當前活動連接數調度,優先選擇權重最高的 RS,直到其活動連接數超過權重值(即 “溢出”),再依次調度下一個權重最高的 RS。判斷條件為:

  • RS 未過載(未設置IP_VS_DEST_F_OVERLOAD標志)。

  • 活動連接數 < 權重值(權重值不為 0)。

優點:

  • 自動根據 RS 的承載能力(權重)分配連接,避免單一節點負載過高(活動連接數不超過權重上限)。

  • 權重機制確保性能強的 RS(高權重)能處理更多連接,資源分配更均衡。

  • 無需復雜的負載計算,調度邏輯簡單,性能開銷低。

缺點:

  • 僅依賴活動連接數和權重,未考慮非活動連接等其他負載指標,對長連接場景的適應性有限。

  • 若所有高權重 RS 均 “溢出”,低權重 RS 可能因突然承接大量請求而壓力驟增。

適用場景:

  • 短連接服務(如 Web 服務),活動連接數能較好反映負載狀態。

  • 對調度效率要求高、節點性能差異明顯的集群。

  • 需要限制單節點最大連接數的場景(通過權重控制上限)。

四、ipvsadm命令

ipvsadm的操作類型參數

用于指定要執行的操作(必選):

參數全稱作用
-A--add-service添加虛擬服務(VIP + 端口)。
-E--edit-service修改已存在的虛擬服務配置。
-D--delete-service刪除虛擬服務。
-a--add-server為虛擬服務添加后端服務器(Real Server)。
-e--edit-server修改后端服務器配置。
-d--delete-server刪除后端服務器。
-L--list顯示當前 IPVS 配置(需配合?-t-u?或?-f?指定服務類型)。
-Z--zero清空所有服務和服務器的統計信息(連接數、流量等)。
-S--save導出當前 IPVS 配置為腳本(用于備份)。
-R--restore從腳本恢復 IPVS 配置。

ipvsadm的服務類型參數

用于指定虛擬服務的協議類型(配合?-A-D-L?等使用):

參數作用
-tTCP 服務,格式:-t IP:port(如?-t 192.168.1.1:80)。
-uUDP 服務,格式:-u IP:port(如?-u 192.168.1.1:53)。
-f防火墻標記服務,用于基于 iptables 標記的負載均衡。

ipvsadm的負載均衡算法參數

通過?-s?指定調度算法(添加虛擬服務時使用):

參數值全稱算法說明
rrRound Robin輪詢,按順序依次分發請求。
wrrWeighted RR加權輪詢,根據服務器性能分配權重。
lcLeast Connections最少連接,優先將請求分發到連接數最少的服務器。
wlcWeighted LC加權最少連接,默認算法,在最少連接基礎上考慮權重。
shSource Hashing源 IP 哈希,相同 IP 的客戶端總是被分發到同一服務器(適用于會話保持)。
dhDestination Hashing目標 IP 哈希,根據目標 IP 進行哈希(適用于緩存集群)。
lblcLocality-Based LC基于位置的最少連接,用于緩存集群。

ipvsadm的工作模式參數

通過?-m-g-i?指定后端服務器的工作模式(添加 Real Server 時使用):

參數全稱模式說明
-m--masqueradingNAT 模式,負載均衡器處理請求和響應,需與 RS 在同一網絡。
-g--gatewayingDR 模式(直接路由),負載均衡器僅處理請求,響應直接由 RS 返回。
-i--ipipTUN 模式(IP 隧道),通過隧道連接負載均衡器和 RS,適合跨地域部署。

ipvsadm的其他常用參數

參數作用
-n以數字形式顯示 IP 和端口(如?192.168.1.1:80?而非域名)。
-c顯示當前 IPVS 連接信息(配合?-L?使用)。
-p [秒數]設置會話保持時間(如?-p 3600?表示 1 小時內同一客戶端請求到同一 RS)。
-w [權重]設置后端服務器的權重(如?-w 3?表示權重為 3,默認 1)。
--persistent-conn-timeout [秒數]持久連接超時時間(如?-p 360)。
--scheduler [算法]替代?-s?指定調度算法(如?--scheduler wrr)。

核心功能:

? ? ? ? 1、集群服務管理:增、刪、改。????????對應下面的定義虛擬服務(Virtual Service)--- 即管理集群服務。

? ? ? ? 2、集群服務的RS管理:增、刪、改。? ? ? ? 對應下面的添加 / 刪除后端服務器(Real Server)--- 即管理集群服務中的Real Server服務器。

? ? ? ? 3、查看配置

1、負載均衡配置

1. 定義虛擬服務(Virtual Service)

創建對外提供服務的虛擬 IP(VIP)和端口,并指定負載均衡算法:

# 添加 TCP 虛擬服務(VIP:192.168.1.100,端口:80,輪詢算法)
ipvsadm -A -t 192.168.1.100:80 -s rr# 添加 UDP 虛擬服務(如 DNS 負載均衡)
ipvsadm -A -u 192.168.1.100:53 -s wrr  # 加權輪詢
2. 添加 / 刪除后端服務器(Real Server)

將實際提供服務的服務器加入或移出負載均衡池:

# 添加后端服務器(-m: NAT 模式;-g: DR 模式;-i: TUN 模式)
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.101:80 -m -w 1  # 權重為 1# 刪除后端服務器
ipvsadm -d -t 192.168.1.100:80 -r 192.168.1.101:80

2、負載均衡算法及其適用場景

通過?-s?參數指定調度算法,支持多種策略:

算法縮寫說明
輪詢rr按順序依次分發請求,適用于服務器性能相近的場景。
加權輪詢wrr根據服務器性能分配權重(-w 參數),性能強者處理更多請求。
最少連接lc將請求分發到當前連接數最少的服務器,動態平衡負載。
加權最少連接wlc在最少連接基礎上考慮服務器權重,默認算法。
源 IP 哈希sh相同 IP 的客戶端總是被分發到同一服務器,適用于會話保持。
目標 IP 哈希dh根據目標 IP 進行哈希,適用于緩存服務器集群。

3、工作模式配置

通過?-m-g-i?參數指定工作模式:

模式參數說明
NAT-m網絡地址轉換,負載均衡器處理請求和響應,需與 RS 在同一網絡。
DR(直接路由)-g負載均衡器僅處理請求,響應直接由 RS 返回給客戶端,性能最優。
TUN(IP 隧道)-i通過 IP 隧道連接負載均衡器和 RS,適合跨地域部署。

4、查看與管理

1. 顯示當前配置
ipvsadm -L -n  # 查看所有虛擬服務和后端服務器(數字形式顯示 IP:Port)
ipvsadm -L -n -c  # 查看當前連接和統計信息
ipvsadm -L -t 192.168.1.100:80  # 查看特定虛擬服務的配置
2. 清空統計信息
ipvsadm -Z  # 重置所有服務和服務器的連接計數器和流量統計
3. 持久化配置
ipvsadm-save > /etc/sysconfig/ipvsadm  # 保存當前配置到文件
ipvsadm-restore < /etc/sysconfig/ipvsadm  # 從文件恢復配置

5、高級功能

1. 會話保持(Persistence)

讓同一客戶端的請求始終被轉發到同一服務器:

# 設置 3600 秒的會話保持時間
ipvsadm -A -t 192.168.1.100:80 -s rr -p 3600
2. 健康檢查

結合外部監控工具(如 keepalived)自動檢測服務器狀態,失效時自動移除:

# 配置 keepalived 監控 RS 狀態(示例片段)
real_server 192.168.1.101 80 {weight 1SSL_GET {url { path /healthcheck }url { path / }connect_timeout 3retry 3delay_before_retry 3}
}

五、部署NAT模式的LVS集群示例?

LVS NAT 模式

  • 工作層級第 3 層(網絡層)

  • 原因
    NAT 模式中,負載均衡器需要對數據包的?源 IP 和目標 IP 進行修改(網絡層操作)。

    • 客戶端請求到達負載均衡器時,目標 IP 被修改為后端服務器的私有 IP;

    • 后端服務器響應時,源 IP 被修改為負載均衡器的公網 IP,再返回給客戶端。
      整個過程僅涉及 IP 地址的轉換,不處理端口(傳輸層)或應用層數據,因此工作在網絡層。

注意:如果有類似下圖的錯誤,可能是防火墻沒有關閉,可以使用 systemctl disable --now firewalld.service 這條命令關閉防火墻后再試。

1、在lvs調度機中開啟內核路由功能

2、在lvs調度機中安裝ipvsadm

ipvsadm?是 Linux 系統中用于管理?IP 虛擬服務器(IP Virtual Server,IPVS)?的工具,它是 LVS(Linux Virtual Server)項目的核心組件。IPVS 是 Linux 內核的一部分,提供高性能的負載均衡功能,常用于構建大規模、高可用的服務器集群。

3、在lvs調度機中添加調度策略

4、查看添加的調度策略

[root@lvs 桌面]# watch -n1 ipvsadm -Ln  #可以使用這條命令監視調度策略的改動

字段含義說明
RemoteAddress:Port后端真實服務器(Real Server)的 IP 地址和端口號。
ForwardLVS 采用的轉發模式(調度算法的轉發方式),常見值包括:
-?Route:DR 模式(直接路由)
-?Tunnel:TUN 模式(隧道)
-?Masq:NAT 模式(網絡地址轉換)
Weight后端服務器的權重值(正數)。權重越高,分配到的請求越多;權重為 0 時,該服務器暫時不接收新請求。
ActiveConn當前活躍連接數(正在處理的請求數)。
InActConn當前非活躍連接數(已關閉或超時的連接數,用于統計歷史連接)。

字段含義
Pro協議類型(如?TCPUDP)。
FromIP客戶端源 IP 地址。
FPrt客戶端源端口。
ToIP目標 IP 地址(即虛擬服務 VIP)。
TPrt目標端口(即虛擬服務端口)。
DestIP實際轉發到的后端服務器(Real Server)IP 地址。
DPrt后端服務器端口。
State連接狀態,常見值包括:
-?ESTABLISHED:已建立的連接
-?SYN_SENT:已發送 SYN 包
-?SYN_RECV:已接收 SYN 包
-?FIN_WAIT:等待 FIN 包
-?CLOSE_WAIT:等待關閉
-?TIME_WAIT:等待超時關閉
Expires連接超時剩余秒數(連接保持時間)。
PEName持久化引擎名稱(如?sh?表示源 IP 哈希),用于會話保持。
PEData持久化引擎數據(如哈希值或會話 ID)。

5、測試:使用client主機循環訪問lvs調度機六次之后,再查看調度策略中連接數的改變

6、保存調度策略

7、刪除所有調度策略

8、重新加載調度策略

9、以上操作均為臨時的重新加載調度策略的操作,如果想要讓ipvsadm開機啟動時自動加載策略

需要設置此服務開機自啟動,而且需要/etc/sysconfig/ipvsadm?文件存在。

因為在大多數 Linux 發行版中,ipvsadm?服務的默認配置通常會加載?/etc/sysconfig/ipvsadm(或類似路徑)中的規則。例如:

CentOS/RHEL 系統
ipvsadm?服務腳本默認讀取?/etc/sysconfig/ipvsadm?文件:

# 服務腳本片段(通常位于 /usr/lib/systemd/system/ipvsadm.service)
ExecStart=/sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm

Ubuntu/Debian 系統
可能使用不同的路徑(如?/etc/ipvsadm.rules),需檢查服務配置。

測試:

重啟后發現調度策略仍然存在,說明設置成功

10、再次測試:修改為權重調用算法后,修改real server的權重,然后再次測試

因為我們上面的示例用的就是權重調用算法,所以可以不需要修改策略的算法,只需要修改real server的權重來進行測試。

修改權重后進行測試:

此結果說明權重調用算法和real server的權重修改成功。

六、部署DR模式的LVS集群示例

?LVS DR 模式

  • 工作層級第 2 層(數據鏈路層)

  • 原因
    DR 模式中,負載均衡器僅修改數據包的?目標 MAC 地址(數據鏈路層操作),不改變 IP 地址。

    • 客戶端請求的目標 IP 始終是 VIP(負載均衡器和后端服務器共享的虛擬 IP);

    • 負載均衡器通過修改 MAC 地址,將數據包轉發到選定的后端服務器;

    • 后端服務器直接使用 VIP 作為源 IP 響應客戶端,無需經過負載均衡器。
      由于核心操作是 MAC 地址的替換,因此工作在數據鏈路層。

1、配置好網絡環境,確保主機能互通(具體配置看第一大點的實驗環境)

2、在router主機中的防火墻中啟用 IP 偽裝(Masquerading)功能,實現網絡地址轉換(NAT)。

3、DR模式中需要在LVS集群的各主機上均需要配置VIP,所以我們需要解決地址沖突。

在 LVS 的 DR 模式(Direct Routing)中,VIP(虛擬 IP)需要同時配置在?負載均衡器(Director)?和?所有后端服務器(Real Server)?上,但為了避免 ARP 地址沖突(多個設備響應同一個 VIP 的 ARP 請求),需要通過特殊配置確保:

  1. 只有負載均衡器響應 VIP 的 ARP 請求

  2. 后端服務器靜默處理 VIP,不響應 ARP 請求

解決方案:ARP 抑制配置

參數作用詳解
參數作用
arp_ignore0只要本地 IP 存在,無論哪個接口收到 ARP 請求,都響應。
1僅當請求的 IP 嚴格配置在接收 ARP 請求的接口上時,才響應
arp_announce0允許使用任意接口的 MAC 地址響應 ARP(可能導致混亂)。
2僅使用嚴格配置了該 IP 的接口的 MAC 地址響應 ARP(最嚴格模式)。

通過調整內核參數?arp_ignore?和?arp_announce?來控制 ARP 響應行為:

1. 后端服務器配置(關鍵!)

在每個?后端服務器(Real Server)?上添加以下配置:

# 永久生效,直接寫入文件
echo net.ipv4.conf.all.arp_ignore = 1 >> /etc/sysctl.conf
echo net.ipv4.conf.all.arp_announce = 2 >> /etc/sysctl.conf
echo net.ipv4.conf.lo.arp_ignore = 1 >> /etc/sysctl.conf
echo net.ipv4.conf.lo.arp_announce = 2 >> /etc/sysctl.conf# 應用配置
sysctl -p 

為什么需要同時配置?all?和?lo

all 的作用范圍是所有網絡接口。

lo 的作用范圍是僅針對回環接口?lo

在 LVS DR 模式中:

  1. VIP 配置在后端服務器的?lo?接口,但流量實際通過?eth0?收發。

  2. all?配置:防止所有接口(包括?eth0)響應 VIP 的 ARP 請求。

  3. lo?配置:進一步強化對回環接口的控制,確保 VIP 的 ARP 響應只由負載均衡器發出。

這里在兩個后端服務器RS1和RS2上都要進行配置?

2. 負載均衡器配置

在?負載均衡器(Director)?上,通常只需將 VIP 配置在物理網卡(如?eth0)上,無需特殊 ARP 參數。但若 VIP 也配置在回環接口(lo),則需確保:

net.ipv4.conf.lo.arp_ignore = 0  # 允許回環接口響應 VIP 的 ARP
net.ipv4.conf.lo.arp_announce = 0  # 允許使用物理網卡的 MAC 響應

4、在負載均衡器上進行lvs調度策略的編寫

5、測試:

七、TUN模式的LVS集群(只做了解)

LVS(Linux Virtual Server)的?TUN 模式(IP Tunneling)?是一種高性能的負載均衡實現方式,通過 IP 隧道技術將負載均衡器和后端服務器連接起來。

1、核心原理:

  1. 工作機制

    • 負載均衡器(Director)接收客戶端請求后,不修改原數據包,而是將其封裝在一個新的 IP 包中(外層 IP 為 Director 和 Real Server 的 IP),通過隧道發送給后端服務器。

    • 后端服務器(Real Server)解封裝后處理請求,并直接將響應返回給客戶端(無需經過 Director)。

  2. 關鍵特點

    • 網絡層封裝:使用 IPIP 協議(IP 協議號 4)或 GRE(Generic Routing Encapsulation)進行數據包封裝。

    • 跨地域部署:Director 和 Real Server 可以位于不同網絡,只需路由可達。

    • 高性能:請求和響應路徑分離,Director 僅處理入站流量,避免成為瓶頸。

2、優缺點與適用場景

優點

  • 高性能:Director 僅處理請求,響應直接返回客戶端,吞吐量高。

  • 跨地域部署:支持將后端服務器分布在不同地理位置。

  • 擴展性強:可輕松添加或移除后端服務器,不影響服務。

缺點

  • 配置復雜:需在所有服務器上配置隧道,維護成本高。

  • 依賴 IPIP 協議:部分網絡環境可能封禁 IPIP 協議(IP 協議號 4)。

  • 故障排查困難:隧道封裝可能導致數據包追蹤復雜。

適用場景

  • 大規模負載均衡集群(如電商平臺、CDN)。

  • 跨數據中心部署的高可用服務。

  • 需卸載 Director 壓力的高并發場景。

八、FullNAT模式的LVS集群(只做了解)

FullNAT 是 LVS 的一種特殊負載均衡模式,由華為對 Linux 內核進行擴展實現(最早在 2.6.32 內核中引入)。它通過同時修改請求的源 IP 和目標 IP,突破了傳統 DR 模式的網絡限制,允許后端服務器(Real Server)部署在任意網絡中。

1、核心原理:

1. 工作機制

  • 請求路徑
    客戶端 → Director(修改源 IP 為 Director 的內網 IP,目標 IP 為 RS 的內網 IP)→ RS

  • 響應路徑
    RS → Director(修改源 IP 為 VIP,目標 IP 為客戶端 IP)→ 客戶端

2. 關鍵特性

  • 雙向 NAT:同時修改請求和響應的源 / 目標 IP,實現跨網段負載均衡。

  • 對稱路徑:請求和響應必須經過 Director,保證連接跟蹤一致性。

  • 解除網絡限制:RS 可以部署在任意網絡(如私有云、公有云),只需與 Director 路由可達。

2、優缺點與適用場景

優點

  • 網絡靈活性:突破 DR 模式的同網段限制,支持混合云部署。

  • 部署簡單:RS 無需配置 VIP 和復雜的 ARP 參數。

  • 故障隔離:Director 可作為網絡邊界,增強安全性。

缺點

  • Director 負載較高:需處理雙向流量,吞吐量低于 DR/TUN 模式。

  • 內核依賴:非標準內核模塊,需特殊編譯或使用華為內核。

  • 連接跟蹤限制:依賴內核連接跟蹤表,大規模集群需優化內存。

適用場景

  • 混合云架構:后端服務器分布在公有云與私有云。

  • 數據中心互聯:跨地域數據中心的負載均衡。

  • 網絡架構復雜:無法滿足 DR 模式同網段要求的場景。

九、添加防火墻標簽解決輪詢錯誤的問題

注:此實驗的實驗環境為上面DR模式的實驗環境。

1、輪詢規則中可能會遇到的錯誤

場景RR 算法行為
未做標記(獨立 VS)80 和 443 獨立輪詢,可能因計數器同步 “巧合” 到同一 RS
做了標記(合并 VS)80 和 443 嚴格按請求順序輪詢,導致同一客戶端請求分散

以?HTTP?和?HTTPS?為例,當我們在RS中同時開放80443端口,那么默認控制是分開輪詢的,這樣我們就出現了一個輪詢錯亂的問題。

當我第一次訪問80被輪詢到RS1后下次訪問443仍然可能會被輪詢到RS1上。

RS1RS2中安裝mod_ssl并重啟apache。

添加如下的LVS策略:

測試發現兩次訪問都輪詢到了同一個real server。

未做標記時:兩個獨立虛擬服務的 RR 可能 “同步”

關鍵點在于

  • 每個虛擬服務(80 和 443)獨立維護自己的 RR 計數器

  • 若客戶端的 80 和 443 請求幾乎同時到達,兩個虛擬服務的 RR 計數器可能恰好處于相同狀態(例如都指向 RS1)。

例如:

  1. 客戶端首次訪問 80 端口時,VS1 的 RR 計數器指向 RS1,請求被轉發到 RS1。

  2. 緊接著客戶端訪問 443 端口,此時 VS2 的 RR 計數器也指向 RS1(因初始狀態相同),請求也被轉發到 RS1。

這種 “巧合” 會讓您誤以為 “同一客戶端的請求總被分到同一 RS”,但實際上只是 RR 計數器同步的結果。若兩個請求的時間間隔較長,或中間有其他客戶端的請求插入,RR 計數器可能錯開,導致同一客戶端的請求被分到不同 RS。

2、使用防火墻標記來解決輪詢調度問題

FWM:FireWall Mark。

MARK target 可用于給特定的報文打標記, --set-mark value。

其中:value 可為0xffff格式,表示十六進制數字借助于防火墻標記來分類報文,而后基于標記定義集群服 務:可將多個不同的應用使用同一個集群服務進行調度。

如何實現防火墻標記:

Director主機打標記(即負載均衡器上打標記):
命令:iptables -t mangle -A PREROUTING -d $vip -p $proto -m multiport --dports
$portl,$port2,..-j MARK --set-mark NUMBER#它的作用是:對發往特定 VIP(虛擬 IP)和端口的流量打標記(MARK),以便后續基于標記進行路由或調度。關鍵參數說明
-t mangle:使用 mangle 表,該表專門用于修改數據包元數據(如 TOS、MARK)。
-A PREROUTING:將規則添加到 PREROUTING 鏈,該鏈在路由決策前處理數據包。
-d $vip:目標地址為變量 $vip(通常是 LVS 的虛擬 IP)。
-p $proto:協議類型(如 tcp 或 udp)。
-m multiport --dports $port1,$port2,...:匹配多個目標端口(如 80,443)。
-j MARK --set-mark NUMBER:給匹配的數據包打標記(NUMBER 是 0-4294967295 之間的整數)。

Director主機基于標記定義集群服務:

命令:ipvsadm -A -f NUMBER [options] 這是 LVS (Linux Virtual Server) 中用于創建基于防火墻標記 (firewall mark) 的虛擬服務器的命令。
這種方式允許您根據 iptables 標記的流量來調度請求,而不是傳統的 IP 地址和端口。關鍵參數說明
除了 -f NUMBER,常用的選項包括:
-s scheduler      # 指定調度算法 (rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq)
-p [timeout]      # 持久連接的超時時間 (秒)
-M netmask        # 持久連接的子網掩碼

實驗示例如下:

在LVS調度器中設定端口標簽,認為80和443端口是一個整體

設定調度規則

測試結果如下:

發現可以成功輪詢了,則實驗成功。

做了標記后:合并虛擬服務導致 RR 按請求順序分配

此時的行為差異

  • 80 和 443 端口的請求被視為同一個虛擬服務的流量,共享同一個 RR 計數器。

  • RR 算法會嚴格按請求到達順序輪詢所有后端服務器,而不區分客戶端。

例如:

  1. 客戶端 A 發送 80 端口請求,RR 計數器指向 RS1,請求被轉發到 RS1。

  2. 客戶端 A 緊接著發送 443 端口請求,此時 RR 計數器已更新為 RS2,請求被轉發到 RS2。

這就導致了 “做標記后同一客戶端的請求被分到不同 RS” 的現象。

十、LVS持久鏈接

在我們客戶上網過程中有很多情況下需要和服務器進行交互,客戶需要提交響應信息給服務器,如果單 純的進行調度會導致客戶填寫的表單丟失,為了解決這個問題我們可以用sh算法,但是sh算法比較簡單 粗暴,可能會導致調度失衡。

解決方案

在進行調度時,不管用什么算法,只要相同源過來的數據包我們就把他的訪問記錄在內存中,也就是把 這個源的主機調度到了那個RS上。

如果在短期(默認360S)內同源再來訪問我仍然按照內存中記錄的調度信息,把這個源的訪問還調度到同一臺RS上。

如果過了比較長的時間(默認最長時間360s)同源訪問再次來訪,那么就會被調度到其他的RS上。

命令:ipvsadm-A|E -t|u|f service-address[-s scheduler] [-p [timeout]]默認360秒參數分組:操作類型:-A:添加新的虛擬服務(Add)-E:編輯已存在的虛擬服務(Edit)服務類型:-t:TCP 服務(如 HTTP、HTTPS)-u:UDP 服務(如 DNS、NTP)-f:基于防火墻標記(Firewall Mark)的服務(您之前配置的就是這種)服務地址:對于 -t 和 -u:格式為 IP:Port(如 192.168.0.220:80)對于 -f:格式為標記值(如 6666)調度算法:-s scheduler:指定負載均衡算法(默認是 wlc,即加權最小連接數)常用值:rr(輪詢)、wrr(加權輪詢)、lc(最小連接數)、sh(源地址哈希)等持久連接:-p [timeout]:啟用會話保持(默認超時時間 360 秒,即 6 分鐘)若省略 timeout,則默認使用 360 秒

現象(HTTP 和 HTTPS 請求都被調度到同一臺 RS)是由于?LVS 的會話保持(persistent)機制生效。當您使用?-p 3000?參數時,LVS 會在 3000 秒內將同一客戶端的所有請求強制路由到同一臺 RS,從而覆蓋了 RR(輪詢)算法的默認行為。

詳細解釋:

1.?會話保持(-p?參數)的工作原理

  • 當執行?ipvsadm -E -f 6666 -s rr -p 3000?時,LVS 會:

    • 忽略 RR 算法的輪詢邏輯,轉而使用客戶端 IP 作為哈希鍵。

    • 在 3000 秒內,將同一客戶端 IP 的所有請求(無論端口)強制發送到首次選擇的 RS

  • 因此,客戶端先訪問 HTTP(80 端口)時被分配到 RS2,后續 HTTPS(443 端口)請求也會被強制路由到 RS2,導致輸出:

    RS2 - 192.168.0.20
    RS2 - 192.168.0.20
    

2.?與之前配置的差異

  • 未使用?-p?參數時:LVS 按 RR 算法獨立調度 80 和 443 端口的請求,可能導致同一客戶端的請求被分到不同 RS。

  • 使用?-p?參數后:LVS 會確保同一客戶端的所有請求在超時時間內被發送到同一 RS,避免會話丟失。

LVS工作模式的總結對比

維度NAT 模式DR 模式TUN 模式Full-NAT 模式
IP 修改入站改目標 IP,出站改源 IP不修改 IP,改 MAC 地址不修改 IP,隧道封裝入站同時改源 IP 和目標 IP
流量路徑雙向經 LVS入站經 LVS,出站 RS 直連入站經隧道,出站 RS 直連雙向經 LVS
網絡范圍同一子網同一物理子網(二層可達)跨子網 / 跨地域(依賴隧道)任意網絡(可跨子網)
RS 網關配置必須指向 LVS 的內網 IP無需指向 LVS(可獨立設置網關)無需指向 LVS(可獨立設置網關)無需指向 LVS(獨立網關)
性能低(瓶頸在 LVS)極高(僅入站經 LVS)中高(隧道有開銷)中(雙向經 LVS)
Director 負載高(處理雙向流量)低(僅處理請求)低(僅處理請求)中(處理雙向流量)
RS 配置復雜度低(僅需設網關)中(需抑制 ARP + 綁定 VIP)高(需配置隧道 + 綁定 VIP)低(無需綁定 VIP)
典型場景小規模集群、數據庫Web 服務、大規模集群跨地域集群、CDN復雜網絡架構、安全需求

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/89641.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/89641.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/89641.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【數據結構】「隊列」(順序隊列、鏈式隊列、雙端隊列)

- 第 112篇 - Date: 2025 - 07 - 20 Author: 鄭龍浩&#xff08;仟墨&#xff09; 文章目錄隊列&#xff08;Queue&#xff09;1 基本介紹1.1 定義1.2 棧 與 隊列的區別1.3 重要術語2 基本操作3 順序隊列(循環版本)兩種版本兩種版本區別版本1.1 - rear指向隊尾后邊 且 無 size …

Java行為型模式---解釋器模式

解釋器模式基礎概念解釋器模式&#xff08;Interpreter Pattern&#xff09;是一種行為型設計模式&#xff0c;其核心思想是定義一個語言的文法表示&#xff0c;并定義一個解釋器&#xff0c;使用該解釋器來解釋語言中的句子。這種模式將語法解釋的責任分開&#xff0c;使得語法…

[spring6: PointcutAdvisor MethodInterceptor]-簡單介紹

Advice Advice 是 AOP 聯盟中所有增強&#xff08;通知&#xff09;類型的標記接口&#xff0c;表示可以被織入目標對象的橫切邏輯&#xff0c;例如前置通知、后置通知、異常通知、攔截器等。 package org.aopalliance.aop;public interface Advice {}BeforeAdvice 前置通知的標…

地圖定位與導航

定位 1.先申請地址權限(大致位置精準位置) module.json5文件 "requestPermissions": [{"name": "ohos.permission.INTERNET" },{"name": "ohos.permission.LOCATION","reason": "$string:app_name",&qu…

【數據結構】揭秘二叉樹與堆--用C語言實現堆

文章目錄1.樹1.1.樹的概念1.2.樹的結構1.3.樹的相關術語2.二叉樹2.1.二叉樹的概念2.2.特殊的二叉樹2.2.1.滿二叉樹2.2.2.完全二叉樹2.3.二叉樹的特性2.4.二叉樹的存儲結構2.4.1.順序結構2.4.2.鏈式結構3.堆3.1.堆的概念3.2.堆的實現3.2.1.堆結構的定義3.2.2.堆的初始化3.2.3.堆…

區間樹:多維數據的高效查詢

區間樹&#xff1a;多維數據的高效查詢 大家好&#xff0c;今天我們來探討一個在計算機科學中非常有趣且實用的數據結構——區間樹。想象一下&#xff0c;你是一位城市規劃師&#xff0c;需要快速找出某個區域內所有的醫院、學校或商場。或者你是一位游戲開發者&#xff0c;需要…

SQL 魔法:LEFT JOIN 與 MAX 的奇妙組合

一、引言 在數據庫操作的領域中&#xff0c;數據的關聯與聚合處理是核心任務之一。LEFT JOIN作為一種常用的連接方式&#xff0c;能夠將左表中的所有記錄與右表中滿足連接條件的記錄進行關聯&#xff0c;即便右表中沒有匹配的記錄&#xff0c;左表的記錄也會被保留&#xff0c;…

手寫tomcat

package com.qcby.annotation;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;Target(ElementType.TYPE)// 表示該注解只能用于類上 Retention(Retentio…

Android平臺下openssl動態庫編譯

1. 下載Linux平臺下的NDK軟件包 NDK 下載 | Android NDK | Android Developers 下載完成后執行解壓命令 # unzip android-ndk-r27d-linux.zip 2. 下載openssl-1.1.1w源碼包&#xff0c;并解壓 # tar -xzvf openssl-1.1.1w.tar.gz 3. 進入解壓后的openssl-1.1.1w目錄 …

【C++基礎】面試高頻考點解析:extern “C“ 的鏈接陷阱與真題實戰

名稱修飾&#xff08;Name Mangling&#xff09;是C為支持重載付出的代價&#xff0c;而extern "C"則是跨越語言邊界的橋梁——但橋上的陷阱比橋本身更值得警惕 一、extern "C" 的核心概念與高頻考點1.1 鏈接規范與名字改編機制C 為支持函數重載&#xff0…

OpenCV 官翻 4 - 相機標定與三維重建

文章目錄相機標定目標基礎原理代碼配置校準去畸變1、使用 cv.undistort()2、使用**重映射**方法重投影誤差練習姿態估計目標基礎渲染立方體極線幾何目標基礎概念代碼練習從立體圖像生成深度圖目標基礎概念代碼附加資源練習相機標定 https://docs.opencv.org/4.x/dc/dbb/tutori…

Python類中方法種類與修飾符詳解:從基礎到實戰

文章目錄Python類中方法種類與修飾符詳解&#xff1a;從基礎到實戰一、方法類型總覽二、各類方法詳解1. 實例方法 (Instance Method)2. 類方法 (Class Method)3. 靜態方法 (Static Method)4. 抽象方法 (Abstract Method)5. 魔術方法 (Magic Method)三、方法修飾符對比表四、綜合…

VSCode使用Jupyter完整指南配置機器學習環境

接下來開始機器學習部分 第一步配置環境&#xff1a; VSCode使用Jupyter完整指南 1. 安裝必要的擴展 打開VSCode&#xff0c;按 CtrlShiftX 打開擴展市場&#xff0c;搜索并安裝以下擴展&#xff1a; 必裝擴展&#xff1a; Python (Microsoft官方) - Python語言支持Jupyter (Mi…

數據結構與算法之美:拓撲排序

Hello大家好&#xff01;很高興我們又見面啦&#xff01;給生活添點passion&#xff0c;開始今天的編程之路&#xff01; 我的博客&#xff1a;<但凡. 我的專欄&#xff1a;《編程之路》、《數據結構與算法之美》、《C修煉之路》、《Linux修煉&#xff1a;終端之內 洞悉真理…

Ubuntu18.04 系統重裝記錄

Ubuntu18.04 系統重裝記錄 1 安裝google拼音 https://blog.csdn.net/weixin_44647619/article/details/144720947 你好&#xff01; 這是你第一次使用 Markdown編輯器 所展示的歡迎頁。如果你想學習如何使用Markdown編輯器, 可以仔細閱讀這篇文章&#xff0c;了解一下Markdo…

Maven常用知識總結

Maven常用知識總結Maven 安裝與配置windows mvn安裝與配置IntelliJ IDEA 配置IntelliJ IDEA 配置系統mavenIntellij IDEA Maven使用IntelliJ IDEA 不能運行項目常見問題pom.xml 常用標簽講解parentgroupId artifactId versiondependencypropertiespluginpackagingdependencyMan…

PHP框架在大規模分布式系統的適用性如何?

曾幾何時&#xff0c;PHP被貼上“只適合小網站”的標簽。但在技術飛速發展的今天&#xff0c;PHP框架&#xff08;如Laravel、Symfony、Hyperf、Swoft等&#xff09; 早已脫胎換骨&#xff0c;勇敢地闖入了大規模分布式系統的疆域。今天&#xff0c;我們就來聊聊它的真實戰斗力…

DC-DC降壓轉換5.5V/3A高效率低靜態同步降壓轉換具有自適應關斷功能

概述&#xff1a;PC1032是一款高效且體積小巧的同步降壓轉換器&#xff0c;適用于低輸入電壓應用。它是緊湊設計的理想解決方案。其2.5V至5.5V的輸入電壓范圍適用于幾乎所有電池供電的應用。在中等至重負載范圍內&#xff0c;它以1.5MHz&#xff08;典型值&#xff09;的PWM模式…

min_25篩學習筆記+牛客多校02E

本來沒有學習這種較難的算法的想法的&#xff0c;因為比賽也做不到這種難度的題&#xff0c; 但是最近打牛客多校02&#xff0c;有一題要求 [1,n][1,n][1,n] 中素數的個數&#xff0c;我以為是像莫反一樣容斥&#xff0c;但是后面感覺不行。賽后知道是用 min_25 篩來求&#xf…

FunASR Paraformer-zh:高效中文端到端語音識別方案全解

項目簡介 FunASR 是阿里巴巴達摩院開源的端到端語音識別工具箱,集成了多種語音識別、語音活動檢測(VAD)、說話人識別等模塊。其中 paraformer-zh 和 paraformer-zh-streaming 是針對中文語音識別任務優化的端到端模型,分別適用于離線和流式場景。Paraformer 采用并行 Tran…