LVS实现长连接保持需协同配置内核模块、ipvsadm规则与Keepalived:设置ipvsadm连接超时(如7200秒)、启用-p持久化并匹配persistence_timeout、配合客户端和服务端超时调优。

LVS 实现长连接保持,核心在于让同一客户端在一段时间内始终被调度到同一台真实服务器(RS),避免连接中断或会话丢失。这需要从 LVS 内核模块、ipvsadm 规则、Keepalived 配置三方面协同设置,不能只调一个参数。
1. 设置 LVS 连接超时时间
ipvsadm 控制 TCP 连接空闲、FIN 状态、UDP 的生命周期,直接影响长连接能否持续存在:
- 查看当前超时值:
ipvsadm -Ln --timeout,默认通常是 900 120 300(tcp/tcpfin/udp 秒) - 将 TCP 空闲超时设为较大值(如 7200 秒 = 2 小时):
ipvsadm --set 7200 5 60 - 该设置需在 Director 启动后立即执行,重启 ipvsadm 不会保留,建议写入启动脚本或 Keepalived notify 脚本中
2. 启用持久连接(persistence)
这是实现“同 IP 同 RS”的关键机制,LVS 通过哈希表记录客户端 IP 与 RS 的绑定关系:
- 使用
-p参数创建虚拟服务时启用持久化:ipvsadm -A -t VIP:PORT -s rr -p 7200 - Keepalived 配置中对应字段是 persistence_timeout,必须与
ipvsadm --set中的 TCP 超时一致(如都设为 7200) - 可选粒度控制:persistence_granularity 设为
255.255.255.0表示同一网段客户端归入同一 RS,适合 NAT 环境或代理后场景
3. Keepalived 配置示例(DR 模式)
以端口 5222(如 IM 长连接服务)为例:
virtual_server 172.19.1.19 5222 {
delay_loop 2
lb_algo wrr
lb_kind DR
persistence_timeout 7200 # 必须与 ipvsadm --set 第一个值一致
protocol TCP
<pre class="brush:php;toolbar:false;">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
}
}}
4. 客户端与后端配合要点
服务端和客户端行为也影响长连接实际效果:
- 客户端 Socket 设置
SO_TIMEOUT=0(Java 中socket.setSoTimeout(0)),禁用读超时,避免主动断连 - 后端应用(如 Nginx、Tomcat)需关闭自身连接复用限制,例如 Nginx 的
keepalive_timeout建议 ≥ LVS 的 persistence_timeout - 避免中间设备(如防火墙、云厂商 SLB)对空闲连接做超时踢除,其 timeout 应 > LVS 设置值










