keepalived切换期间丢包本质是vip漂移导致的多环节协同延迟,集中于vip摘除到绑定空窗、arp缓存未更新、tcp会话未重连三个阶段,调优目标为将可感知中断压至毫秒级。

Keepalived 切换期间的丢包率,本质反映的是 VIP 漂移过程中的服务中断时长和网络连通性稳定性。它不是单纯看“ping 通不通”,而是要结合 TCP 连接重建、ARP 刷新、客户端缓存、内核路由表更新等多环节综合判断。调优目标不是追求零丢包(物理上难实现),而是将可感知中断控制在毫秒级,确保 HTTP 请求不出现 502/504、数据库连接不重置、长连接应用不异常断开。
抓准丢包发生的真实阶段
切换丢包往往集中在三个时间窗口:
- VIP 移除到 VIP 绑定完成之间:主节点停止 Keepalived 后,VIP 从网卡摘除;备节点启动 VIP 绑定前存在空窗(通常
- ARP 表未及时刷新:上游交换机或客户端仍缓存旧 MAC 地址(指向原主节点),导致新请求发往已下线设备,持续丢包直到 ARP 超时(Linux 默认 30s,实际常靠 gratuitous ARP 快速刷新)
- 健康检查误判或滞后:Nginx 崩溃但 keepalived 未及时检测(如检查间隔设为 5s、超时 3s),VIP 滞留故障节点,用户持续收到 502 —— 此类“逻辑丢包”比网络层丢包更隐蔽、危害更大
关键参数与网络层联动调优
丢包率高,不能只调 Keepalived 配置,必须同步校准底层网络行为:
- 强制发送 gratuitous ARP:在 vrrp_instance 块中添加 notify_master "/usr/bin/arping -c 3 -A -I ens33 192.168.100.107",确保 VIP 切换后立即广播新 MAC,避免交换机/客户端 ARP 缓存延迟
- 缩短 VRRP 报文超时判定:默认 advert_int 1s,可设为 0.5s;同时将 backup 节点的 nopreempt 关闭(若需严格主备),并确保 priority 差值 ≥20,防止抖动引发反复切换
- 禁用 IPv6 DAD 和路由器通告:在 /etc/sysctl.conf 中添加 net.ipv6.conf.all.disable_ipv6 = 1 和 net.ipv4.conf.all.arp_ignore = 1,避免 IPv6 地址冲突或 ARP 响应干扰 VIP 行为
用真实流量验证而非仅 ping
ping -c 10 192.168.100.107 只能发现连通性,无法暴露应用层中断。建议:
- 用 curl -o /dev/null -s -w "%{http_code}\n" http://192.168.100.107/health 循环测试,统计 502/000 出现比例
- 在客户端侧抓包(tcpdump -i any host 192.168.100.107 and port 80),观察 SYN 包是否被丢弃、RST 是否突增、三次握手是否失败
- 在两台 Keepalived 节点上运行 watch -n 0.1 'ip -br a | grep 192.168.100.107',确认 VIP 绑定时间差 ≤80ms
防火墙与协议放行必须到位
丢包常因底层协议被拦截而起,非 Keepalived 自身问题:
- VRRP 使用组播地址 224.0.0.18 + UDP 端口 112,firewalld 必须放行:firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent && firewall-cmd --reload
- 禁用或配置 SELinux 允许 Keepalived 执行自定义脚本:setsebool -P keepalived_read_etc 1,否则 nginx_check.sh 不执行,健康检查失效
- 物理交换机若启用 IGMP snooping,需确保其支持 VRRP 组播泛洪,否则备节点收不到主节点心跳,触发误切换










