首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

LVS+Keepalived TCP 長連接分發完整解決方案:超時、持久化、健康檢查三維配置

     編輯:Java 綜合教學

LVS (IPVS) + Keepalived 實現四層負載均衡時,TCP 長連接(如即時通訊、推送、遊戲網關)面臨「連接斷開、分發不均、會話不保持」三大挑戰。本文從 Client、LVS 內核、Keepalived 三個維度給出生產級配置方案。

問題根因

  • 長連接無數據傳輸時,LVS 連接表條目超時被刪除,後續包走新調度 → 到達錯誤 Real Server → RST / Connection reset by peer。
  • Keepalived 調度器輪詢將同一 Client 分發到不同 RS,破壞會話黏性。
  • 健康檢查過於激進導致 RS 頻繁摘掛,連接遷移抖動。

三維配置矩陣

維度關鍵參數推薦值作用
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 60TCP ESTABLISHED 7200s(2h),TCP FIN 5s,UDP 60s,覆蓋長連接壽命
持久化模板無(靠 Keepalived persistence)IPVS 本身不做應用層持久化,交給上層
Keepalivedpersistence_timeout7200 (與 LVS TCP timeout 一致)同一 Client IP 在 2h 內固定分發到同一 RS
lb_kind DRDR (Direct Routing)高性能、RS 直回包、VIP 僅掛在 Director
健康檢查TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 }10s 連接超時、3 次重試、3s 間隔,平衡敏感度與穩定性

完整 keepalived.conf 示例

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

進階優化建議

  1. 應用層心跳:Client/Server 定時發送 Ping/Pong(如 30s),雙重保障超時不被刪除。
  2. 連接遷移平滑:RS 摘除前發送 FIN 而非 RST,配合 TCP_REPAIR 或應用層重連邏輯。
  3. 一致性哈希調度:若不想用 IP 持久化,可編譯 IPVS sh 模塊或用 Nginx Stream 模塊做 4 層一致性哈希。
  4. 監控告警:Prometheus 采集 ipvs_* 指標(連接數、入/出流量、錯誤數),設置閾值告警。
  5. 多網卡 DR 模式:Director/RS 同一 VLAN,關閉 RS arp_ignore/arp_announce 內核參數防止 ARP 衝突。

避坑總結

  • 三處超時必須一致:Client Keepalive < LVS TCP Timeout ≈ Keepalived Persistence Timeout。
  • 不要用 RR 輪詢做長連接,必須開啟 persistence_timeout 或一致性哈希。
  • 健康檢查別太頻繁,delay_loop 2 + connect_timeout 10 + retry 3 已足夠,過頻會誤判 RS 下線導致連接風暴。
  • DR 模式 RS 需配置 VIP Lo 接口(ifconfig lo:0 172.19.1.19 netmask 255.255.255.255),並抑制 ARP 回應。

按此三維配置,LVS+Keepalived 可穩定承載百萬級 TCP 長連接,實現「不斷連、不遷移、不抖動」的生產級體驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved