LVS连接丢失需区分建立失败与已连中断:前者多因ip_vs模块未加载或ARP抑制不全,后者常由conn_tab_size不足或健康检查缺失导致。

连接丢失在 LVS 环境中不是单一故障,而是多种底层机制失效的表象。核心要区分“连接建立失败”和“已建连接意外中断”两类问题,前者多属配置或网络层阻断,后者往往指向连接跟踪表溢出或内核参数失配。
检查 ip_vs 模块是否就位
LVS 运行依赖内核模块,ip_vs 未加载时,ipvsadm 会直接报 “Connection refused”,这不是网络不通,而是控制通道根本不存在。
- 运行
lsmod | grep ip_vs,无输出即未加载 - 执行
modprobe ip_vs(注意:不是 ip_vs_rr 或其他调度模块) - 若提示 Module not found,说明内核编译时未启用 CONFIG_IP_VS=m,需更换支持 LVS 的内核
- 调度模块如 ip_vs_wrr、ip_vs_sh 可后续加载,但主模块必须最先到位
确认连接跟踪表容量是否足够
高并发场景下,ip_vs_conn 表默认大小(通常 65536)极易耗尽,导致新连接被静默丢弃,现象就是客户端反复重试却无法建立连接。
- 查看当前设置:
sysctl net.ipv4.ip_vs.conn_tab_size - 按峰值连接数预估扩容,例如:
echo 'net.ipv4.ip_vs.conn_tab_size = 262144' >> /etc/sysctl.conf - 执行
sysctl -p生效,并重启 ipvsadm 规则(或 reload keepalived) - 注意:该值不能超过内核允许上限,且需配合内存预留,避免 OOM
验证 DR 模式下的 ARP 抑制是否完整
DR 模式下,Real Server 若响应 VIP 的 ARP 请求,客户端可能绕过 LVS 直连后端,造成连接不稳定或部分请求失败。
- 必须同时设置:
net.ipv4.conf.all.arp_ignore = 1和net.ipv4.conf.lo.arp_ignore = 1 - 仅设 lo 接口不够,all 是兜底策略,防止其他接口意外应答
- 不要碰 arp_announce——它影响的是 RS 主动发 ARP 的源接口,与抑制无关,误配反而导致网关解析失败
- VIP 必须用
ip addr add绑定到 lo:0,而非 ifconfig(后者不兼容现代 namespace)
区分健康检查缺失与真实连接失败
LVS 本身不提供主动健康检查,ipvsadm -a 添加的节点不会自动探测存活状态。所谓“连接失败”,只是 TCP SYN 阶段超时,不是周期性探活结果。
- 若后端挂掉,新连接会卡在 SYN_SENT,已有连接仍维持,节点不会自动剔除
- 真正可用的健康检查需外挂工具:keepalived 的 virtual_server、ldirectord 或自定义脚本调用 ipvsadm -d/-a
- 别依赖
ipvsadm -L --stats中的 ActiveConn 判断存活——RS 死机但连接未断时仍显示非零 - 建议在 keepalived 中配置多级探针:先 TCP 端口通,再 HTTP 返回 200,最后校验业务关键路径

















