实现vip无缝漂移需协议层、配置层、系统层协同,满足同子网、vrrp可达、防火墙放行112号协议、禁用vrrp_strict;核心配置state、priority、virtual_router_id、authentication四要素须严格一致;配合健康检查、权重调整、notify脚本优化及客户端重试机制,可将中断控制在秒级。

要实现主备切换时的 IP 无缝漂移,关键不是让 VIP“绑得上”,而是让它“通得稳、切得准、回得顺”。Keepalived 本身不保证“无缝”,但通过协议层、配置层、系统层三者协同,可以把中断控制在秒级,客户端重连无感知。
网络与环境前提必须满足
不满足以下任一条件,VIP 漂了也白漂:
- 主备节点物理 IP 必须在同一二层子网(如都是 192.168.10.0/24),且能互相 ping 通
- VRRP 报文必须可达:私有环境允许组播(224.0.0.18),公有云必须用 HaVip 或 Secondary IP,并在控制台完成绑定
- 防火墙放行协议号 112:
firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent - 禁用
vrrp_strict(默认配置常含此项),否则 VIP 绑定后无法响应 ping,看似生效实则不通
核心配置四要素严丝合缝
90% 的漂移失败源于这四个字段不一致或不合理:
-
state:主节点写
MASTER,备节点写BACKUP;不能留空、不能写FAULT -
priority:主备差值 ≥
advert_int(默认 1 秒),例如设为100和98;差 1 容易因抖动反复切换 - virtual_router_id:同一 VRRP 实例中主备必须完全相同(1–255),且全网唯一
-
authentication:
auth_pass主备严格一致,≤8 字符,大小写敏感
健康检查 + 权重动态调整更可靠
仅靠主机存活不够,要盯住服务本身是否真可用:
- 写一个简单脚本检测 Nginx 进程或端口(如
curl -s http://127.0.0.1/health | grep ok) - 在
vrrp_script中定义:weight -20表示检测失败时优先级减 20 - 搭配
track_script引入该脚本,让 VIP 在服务假死时也能及时漂移 - 设置
preempt_delay 0,主节点服务恢复后立即抢回 VIP(如需延缓可调大)
切换瞬间减少连接中断的技巧
VIP 切换本质是 MAC 地址刷新,TCP 连接会断开,但可大幅降低影响:
- 在
notify_master脚本中加入sleep 1,等内核路由就绪再 reload Nginx - Nginx 配置启用长连接:
keepalive_timeout 75s、keepalive_requests 100 - 后端应用接入 Redis 存 session,避免切换后用户掉登录态
- 客户端配合短超时 + 自动重试(如前端 fetch 设置
retry: 2)










