LVS (Linux Virtual Server) 內核實現核心原理詳解
概述
LVS 是 Linux 內核級負載均衡器,由章文嶽博士主導開發,目標:高性能、高可用、低成本構建服務器集群。核心組件:
- IPVS (IP Virtual Server):內核模塊,實現四層負載均衡,基於 Netfilter 框架
- ipvsadm:用戶態管理工具,配置虛擬服務、真實服務器、調度算法
官網:linuxvirtualserver.org | 分析內核版本:Linux 2.6.32(經典參考版本)
核心架構:Netfilter 掛載點
IPVS 在 Netfilter 三個 Hook 點註冊處理函數,攔截數據包:
| Hook 點 | 位置 | IPVS 處理邏輯 |
NF_INET_PRE_ROUTING | 路由前(PREROUTING) | DNAT:修改目標 IP 為 RS IP(NAT/TUN 模式) |
NF_INET_LOCAL_IN | 本地輸入 | 處理發往 Director 本機的數據包 |
NF_INET_FORWARD | 轉發 | DR 模式:修改 MAC 地址直接轉發 |
NF_INET_POST_ROUTING | 路由後(POSTROUTING) | SNAT:修改源 IP 為 DIP(NAT 模式回包) |
NF_INET_LOCAL_OUT | 本地輸出 | Director 主動發起的連接處理 |
三大工作模式深度對比
1. LVS-NAT (Network Address Translation)
Client → [VIP] Director [DIP] ←→ [RIP] Real Servers
↓ DNAT: VIP→RIP
↑ SNAT: RIP→DIP
| 特性 | 說明 |
| 網絡要求 | Director、RS 同一子網,RS 網關指向 DIP |
| IP 類型 | RIP 通常用私網 IP |
| 流量路徑 | 請求、響應均經過 Director |
| OS 要求 | RS 任意 OS(僅需 TCP/IP 協議棧) |
| 性能瓶頸 | Director 雙向處理流量,易成瓶頸 |
| 端口映射 | 支持端口映射(VIP:80 → RIP:8080) |
2. LVS-DR (Direct Routing)
Client → [VIP] Director → [RIP] Real Servers → Client
↓ 修改 MAC: D_MAC → R_MAC
↑ RS 直接回包,不經 Director
| 特性 | 說明 |
| 網絡要求 | Director、RS 同一物理網段(二層互通) |
| IP 類型 | RIP 可用公網 IP |
| 關鍵配置 | RS 網關不能指向 DIP,需配置 VIP 於 lo 接口(隱藏/arp_ignore) |
| 流量路徑 | 請求經 Director,響應直連 Client |
| 性能優勢 | Director 僅處理入向請求,吞吐量極高 |
3. LVS-TUN (IP Tunneling / IPIP)
Client → [VIP] Director → [新IP頭: DIP→RIP] 封裝 → Tunnel → RS 解封 → Client
↓ IPIP 封裝
↑ RS 直連回包
| 特性 | 說明 |
| 網絡要求 | Director、RS 可跨網段、跨機房、跨地域 |
| IP 類型 | RIP 必須為公網 IP(需路由可達) |
| 封裝開銷 | 每包增加 20 字節 IP 頭 |
| OS 要求 | RS 需支持 IPIP 隧道(Linux/BSD/部分 Unix) |
| 適用場景 | 跨地域災備、混合雲、異構網絡 |
模式選型決策樹
是否需要跨網段/跨機房?
├─ 是 → LVS-TUN (RIP需公網IP) 或 公網負載均衡器
└─ 否 → 是否同一物理網段(二層互通)?
├─ 是 → LVS-DR (性能最佳,RS直連回包)
└─ 否 → LVS-NAT (最通用,RS網關指向DIP,雙向經Director)
調度算法(ipvsadm -A -s 算法)
| 算法 | 全稱 | 特點 |
| rr | Round Robin | 輪詢,均等分發 |
| wrr | Weighted Round Robin | 加權輪詢,按權重分發 |
| lc | Least Connections | 最少連接,動態負載感知 |
| wlc | Weighted Least Connections | 加權最少連接(默認推薦) |
| lblc | Locality-Based Least Connections | 基於局部性最少連接,適合緩存集群 |
| sh | Source Hashing | 源 IP 哈希,會話保持 |
內核數據結構關鍵點
struct ip_vs_service:虛擬服務(VIP:Port + 協議 + 調度器)
struct ip_vs_dest:真實服務器(RIP:Port + 權重 + 連接數 + 狀態)
struct ip_vs_conn:連接表項(雙向映射、狀態機、超時定時器)
- 連接哈希表:
ip_vs_conn_tab,雙向鏈表,支持一致性哈希
- 同步守護進程:
ipvs_sync_daemon,主備同步連接表(多播/單播)
總結
LVS 作為內核級四層負載均衡器,通過 Netfilter Hook 實現高性能包轉發。三大模式各有優勢:NAT 通用、DR 高性能、TUN 跨網段。生產環境多採用 LVS-DR + Keepalived 雙機熱備 作為七層負載均衡器(Nginx/HAProxy)的前置四層分發層,構建「LVS + Keepalived + Nginx」經典高可用架構。