Keepalived 負載均衡
Keepalived 可以與 LVS(Linux Virtual Server)結合,提供強大的四層負載均衡功能。它通過 IPVS(IP Virtual Server)內核模塊實現高性能的負載分發。
核心組件
- Virtual Server:虛擬服務器,對外提供服務的 VIP
- Real Server:真實服務器,實際處理請求的后端服務器
- IPVS:Linux 內核中的負載均衡模塊
- 健康檢查:監控后端服務器狀態
工作模式
模式 | 說明 | 特點 | 適用場景 |
---|---|---|---|
DR(Direct Routing) | 直接路由 | 性能最高,要求在同一網段 | 大流量場景 |
NAT(Network Address Translation) | 網絡地址轉換 | 配置簡單,性能較低 | 小規模應用 |
TUN(IP Tunneling) | IP 隧道 | 可跨網段,性能中等 | 跨機房部署 |
完整的環境配置
這兩個服務在 Keepalived 中通過分別定義不同的 virtual_server
來區分。
由于 IPVS 是基于 <虛擬IP,端口,協議> 三元組建立映射的,因此 80 和 443 互不影響,各自的健康檢查、調度算法和會話保持配置都可以獨立設置。
global_defs {router_id LB_MASTERenable_script_security
}# HTTP 負載均衡
virtual_server 10.20.230.32 80 {delay_loop 6lb_algo wlclb_kind DRpersistence_timeout 300 # HTTP 會話保持,時間相對較短protocol TCPreal_server 192.168.1.10 80 {weight 2HTTP_GET {url {path /healthstatus_code 200}connect_timeout 3retry 3delay_before_retry 2}}real_server 192.168.1.11 80 {weight 1HTTP_GET {url {path /healthstatus_code 200}connect_timeout 3retry 3delay_before_retry 2}}
}# HTTPS 負載均衡
virtual_server 10.20.230.32 443 {delay_loop 6lb_algo wlc # 加權最少連接算法lb_kind DRpersistence_timeout 600 # HTTPS 會話保持時間更長protocol TCP# 后端服務器1 - 高性能服務器real_server 192.168.1.10 443 {weight 3 # 更高的權重inhibit_on_failure # 失敗時禁用SSL_GET { # HTTPS 健康檢查url {path /healthstatus_code 200}connect_timeout 3retry 3delay_before_retry 2}}# 后端服務器2 - 普通服務器real_server 192.168.1.11 443 {weight 1inhibit_on_failureSSL_GET {url {path /healthstatus_code 200}connect_timeout 3retry 3delay_before_retry 2}}
}
高級配置技巧
會話保持配置
會話保持(Session Persistence)適用于需要 長時間維持客戶端和同一后端服務器交互 的業務場景:
- 流媒體(視頻點播/直播):避免反復切換服務器導致播放卡頓
- WebSocket 長連接:必須確保連接持續性
- 在線文檔/協作系統:會話中斷會影響用戶體驗
virtual_server 192.168.1.100 80 {delay_loop 6lb_algo wlclb_kind DRprotocol TCPpersistence_timeout 1800 # 30分鐘會話保持# 基于客戶端 IP 的會話保持persistence_granularity 255.255.255.0 # 按 C 類網段real_server 192.168.1.10 80 {weight 1TCP_CHECK {connect_timeout 3}}
}
基于防火墻標記的負載均衡
這種方式提供了更靈活的流量控制能力:
# 步驟1:設置防火墻標記
# 標記 HTTP 和 HTTPS 流量
iptables -t mangle -A PREROUTING -d 10.20.230.32 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 100# 標記來自內網的流量
iptables -t mangle -A PREROUTING -s 192.168.0.0/16 -d 10.20.230.32 -p tcp --dport 443 -j MARK --set-mark 200# 標記來自外網的流量
iptables -t mangle -A PREROUTING ! -s 192.168.0.0/16 -d 10.20.230.32 -p tcp --dport 443 -j MARK --set-mark 300# 步驟2:Keepalived 配置
# 多端口服務
virtual_server fwmark 100 {delay_loop 6lb_algo wlclb_kind DRprotocol TCPreal_server 192.168.1.10 0 { # 端口0表示所有端口weight 2MISC_CHECK {misc_path "/usr/local/bin/check_multi_port.sh 192.168.1.10 80 443"}}real_server 192.168.1.11 0 {weight 1MISC_CHECK {misc_path "/usr/local/bin/check_multi_port.sh 192.168.1.11 80 443"}}
}# 內網服務器組
virtual_server fwmark 200 {delay_loop 6lb_algo rrlb_kind DRprotocol TCPreal_server 192.168.1.20 443 {weight 1TCP_CHECK {connect_timeout 3}}
}# 外網服務器組
virtual_server fwmark 300 {delay_loop 6lb_algo wlclb_kind DRprotocol TCPreal_server 192.168.2.10 443 {weight 2TCP_CHECK {connect_timeout 3}}
}
什么是四層負載均衡
四層負載均衡是指在 OSI 模型第四層(傳輸層) 工作的負載均衡方式。第四層包含 TCP/UDP 協議,所以四層負載均衡的調度依據主要是:
- IP 地址(源 IP/目的 IP)
- 端口號(源端口/目的端口)
- TCP/UDP 會話信息
在這種模式下,負載均衡器并不關心 HTTP、HTTPS、MQTT 等應用層協議的具體內容,而是根據 五元組 (源 IP, 源端口, 目的 IP, 目的端口, 傳輸協議) 來分發流量。
四層負載均衡的工作原理
假設有一臺四層負載均衡器(LB),前面接收用戶請求,后面掛著多臺真實服務器(Real Server):
- 客戶端發起連接:客戶端向負載均衡器的 VIP(虛擬 IP)發起 TCP/UDP 請求。
- 負載均衡器選擇后端:LB 根據四層信息(IP+端口+協議),使用一定的調度算法(如輪詢 Round Robin、最少連接 Least Connection、一致性哈希等)選中一個真實服務器。
- 轉發數據:LB 會把客戶端的請求報文轉發給選中的后端服務器。
- 可能是 NAT 模式:對請求包頭的目的 IP 和端口進行修改,再轉發。
- 可能是 DSR(直接路由模式):只修改二層 MAC,不修改 IP。
- 可能是 TProxy(透明模式):保持源 IP 不變,直發后端。
- 返回給客戶端:
- 如果是 NAT,返回流量需要經由 LB,由 LB 改寫后返回客戶端。
- 如果是 DSR,后端服務器直接把結果返回給客戶端(高性能,但需要配置 VIP)。