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