LVS+ NAT高并发易丢包因调度器单点瓶颈致nf_conntrack耗尽;应优先用DR模式,正确配置lo绑定VIP、arp_ignore/arp_announce及rp_filter关闭,并合理设置timeout与persistence参数。

为什么直接用 LVS + NAT 模式在高并发下容易丢包
因为所有流量都经过 LVS 调度器转发,它既是入口也是出口,网卡和连接跟踪表(nf_conntrack)极易成为瓶颈。特别是短连接高频场景,nf_conntrack_max 耗尽后新连接直接被丢弃,错误现象常表现为客户端超时或 Connection refused,但后端服务实际正常。
实操建议:
- 优先选
DR(Direct Routing)模式:LVS 仅改目标 MAC,响应流量绕过调度器,吞吐量可接近物理网卡极限 - 确保所有 Real Server 和 LVS 在同一二层网络(同 VLAN / 同交换机),且 Real Server 的 lo 接口绑定 VIP(如
ip addr add 192.168.10.100/32 dev lo),同时禁用 ARP 响应:echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore和echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce - 不要在 Real Server 上配置 VIP 到 eth0 —— 这会导致 ARP 冲突,LVS 转发失败
ipvsadm 添加真实服务器时 timeout 和 persistence 参数怎么设
timeout 控制连接空闲超时(单位秒),默认 900(15 分钟)。高并发短连接场景下必须调小,否则连接跟踪表堆积;而 persistence(-p)用于会话保持,但它是基于源 IP 的粗粒度绑定,不是“用户登录态”,别误当 session stickiness 用。
实操建议:
- HTTP 短连接集群:设
timeout 60,避免nf_conntrack占满 - 需要会话保持的 HTTPS 或长连接服务(如 WebSocket),才加
-p 300(5 分钟),但注意这会降低负载均衡效果 - 别混用
-p和-M(fwmark 持久化):后者需配合 iptables mark,调试成本高,普通业务不推荐
Real Server 上为什么收不到 LVS 转发的包
最常见原因是 Real Server 的内核参数未关闭反向路径过滤(rp_filter)。DR 模式下,包目的 IP 是 VIP,但入口网卡是 eth0,而 VIP 绑在 lo,内核默认按路由表反查源接口,发现不匹配就丢弃。
实操建议:
- 临时关闭:
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter和echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter - 永久生效:在
/etc/sysctl.conf加net.ipv4.conf.all.rp_filter = 0和net.ipv4.conf.eth0.rp_filter = 0,然后sysctl -p - 验证是否生效:抓包看
tcpdump -i eth0 host 192.168.10.100是否能捕获到请求包;若无,先查rp_filter,再查 lo 上 VIP 是否已添加、ARP 参数是否正确
LVS 调度器本身挂了怎么办
LVS 调度器单点故障是 DR/NAT 模式天然缺陷。不能靠 keepalived 就以为万事大吉 —— 它只解决 VIP 飘移,没解决健康检查盲区:比如 LVS 进程僵死但 keepalived 仍认为 OK,或网卡软中断 CPU 占满导致无法转发。
实操建议:
- keepalived 的
vrrp_script必须检测ipvsadm -Ln输出是否含预期规则,而非只 ping 自己 - 加轻量级外部探针:用 cron 每 5 秒跑一次
curl -s --connect-timeout 1 http://192.168.10.100/health | grep ok,失败则强制systemctl restart keepalived - 生产环境建议至少部署两台 LVS 调度器,并用 BGP Anycast 或 DNS 轮询兜底,别把全部鸡蛋放一个 VIP 里
DR 模式下,Real Server 的网络配置细节比 LVS 命令本身更容易出问题,尤其是 arp_ignore 和 rp_filter 这两个开关,漏掉任意一个,集群就静默失效。











