LVS (IPVS) + Keepalived 實現四層負載均衡時,TCP 長連接(如即時通訊、推送、遊戲網關)面臨「連接斷開、分發不均、會話不保持」三大挑戰。本文從 Client、LVS 內核、Keepalived 三個維度給出生產級配置方案。
RST / Connection reset by peer。| 維度 | 關鍵參數 | 推薦值 | 作用 |
|---|---|---|---|
| Client 端 | Socket SO_KEEPALIVE | 開啟,tcp_keepalive_time=60 tcp_keepalive_intvl=10 tcp_keepalive_probes=3 | 應用層心跳防止中間設備斷開空閒連接 |
Java Socket.setSoTimeout(0) | 0 (無限大) | 讀取不超時,避免業務邏輯誤判斷開 | |
| LVS 內核 (ipvsadm) | TCP 會話超時 | ipvsadm --set 7200 5 60 | TCP ESTABLISHED 7200s(2h),TCP FIN 5s,UDP 60s,覆蓋長連接壽命 |
| 持久化模板 | 無(靠 Keepalived persistence) | IPVS 本身不做應用層持久化,交給上層 | |
| Keepalived | persistence_timeout | 7200 (與 LVS TCP timeout 一致) | 同一 Client IP 在 2h 內固定分發到同一 RS |
lb_kind DR | DR (Direct Routing) | 高性能、RS 直回包、VIP 僅掛在 Director | |
| 健康檢查 | TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 } | 10s 連接超時、3 次重試、3s 間隔,平衡敏感度與穩定性 |
global_defs {
router_id LVS_MASTER_01
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication { auth_type PASS auth_pass 123456 }
virtual_ipaddress { 172.19.1.19 }
}
virtual_server 172.19.1.19 5222 {
delay_loop 2
lb_algo wrr
lb_kind DR
persistence_timeout 7200
protocol TCP
real_server 172.19.1.8 5222 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.19.1.9 5222 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
}
}
}
# 查看 LVS 當前超時值 ipvsadm --list --timeout # 輸出: Timeout (tcp tcpfin udp): 7200 5 60 # 查看持久化連接表 ipvsadm -L -n --persistent # 查看 Keepalived 狀態 systemctl status keepalived journalctl -u keepalived -f
FIN 而非 RST,配合 TCP_REPAIR 或應用層重連邏輯。sh 模塊或用 Nginx Stream 模塊做 4 層一致性哈希。ipvs_* 指標(連接數、入/出流量、錯誤數),設置閾值告警。arp_ignore/arp_announce 內核參數防止 ARP 衝突。persistence_timeout 或一致性哈希。delay_loop 2 + connect_timeout 10 + retry 3 已足夠,過頻會誤判 RS 下線導致連接風暴。ifconfig lo:0 172.19.1.19 netmask 255.255.255.255),並抑制 ARP 回應。按此三維配置,LVS+Keepalived 可穩定承載百萬級 TCP 長連接,實現「不斷連、不遷移、不抖動」的生產級體驗。