VIP 漂移是什么
在节点间迁移一个虚拟 IP,让客户端始终连接同一个地址,而背后真正提供服务的主机换了。Linux 上最常用的实现是 keepalived,它按 VRRP 协议在组内推举主节点并持有 VIP,主节点失联后备节点接管地址。相比改 DNS,漂移在秒级完成且不依赖客户端缓存,但要求节点处于同一个二层网络。
基本信息
| 适用平台 | Linux(keepalived / VRRP),也常见于防火墙与负载设备的双机热备 |
|---|---|
| 前提条件 | 节点在同一二层网络,virtual_router_id 组内唯一 |
| 关键参数 | priority 决定主备,advert_int 决定探测间隔,state 只是初始角色 |
| 健康检查 | vrrp_script 检测服务状态,失败时降低优先级触发漂移 |
典型使用场景
- 自建数据库或应用的接入层切换:主备切换后客户端仍用同一地址连接
- 反向代理双机热备:Nginx/Haproxy 前挂 VIP,避免单点
- 内网服务高可用:跳板机、认证服务、监控入口的地址保持不变
- 与脚本联动:检测到端口或进程异常时自动降优先级,触发漂移
- 迁移窗口:先把 VIP 移走再维护原节点,业务影响降到最低
keepalived 配置骨架
keepalived 配置骨架
vrrp_script chk_app { # 定义健康检查脚本
script "/usr/local/bin/check_app.sh"
interval 2 # 每 2 秒检查一次
weight -30 # 失败则优先级降 30
}
vrrp_instance VI_1 {
state BACKUP # 两端都写 BACKUP,由优先级推举主节点
interface eth0
virtual_router_id 51 # 同组必须一致,不同组不可重复
priority 100 # 主 150 / 备 100
advert_int 1
authentication { auth_type PASS; auth_pass **** }
virtual_ipaddress { 192.168.1.100/24 }
track_script { chk_app }
}切换排查读法
| 现象 | 常见原因 | 排查方式 |
|---|---|---|
| 两端都持有 VIP | 心跳不通导致分区,各认为对方已死 | 检查 VRRP 组播是否被防火墙或网络策略拦截 |
| VIP 不漂移 | 健康检查脚本未生效或 weight 不足 | 看 keepalived 日志中的 VRRP transition 记录 |
| 频繁来回切换 | 检查过于敏感或丢包 | 放宽 interval 与失败次数,观察抖动是否消失 |
| 漂移后业务仍不可用 | 后端服务未就绪就接管 | 健康检查要覆盖服务真实可用性,而非仅端口存活 |
VIP 只在同一二层网络内漂移,跨机房或跨子网需要改用 DNS 切换、路由宣告(如 BGP 发布 VIP)或负载均衡层方案。切换速度与误判是一对矛盾:检查越敏感越容易抖动误切,生产环境应先长时间观察再收紧参数。
单心跳链路是典型隐患:心跳走同一条物理链路时,网络抖动会造成脑裂,两个节点同时对外服务,写类业务可能出现数据分叉。