首页/数据/备份与容灾速查/VIP 漂移与 keepalived 切换

VIP 漂移与 keepalived 切换

用虚拟 IP(VIP)在节点间漂移实现接入层切换:VIP 平时绑定主机,故障时由 VRRP 协议把地址迁移到备机,客户端无需改配置。

备份与容灾速查数据更新于 2026-10-13

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)或负载均衡层方案。切换速度与误判是一对矛盾:检查越敏感越容易抖动误切,生产环境应先长时间观察再收紧参数。
单心跳链路是典型隐患:心跳走同一条物理链路时,网络抖动会造成脑裂,两个节点同时对外服务,写类业务可能出现数据分叉。

易错点

  • 心跳与业务流量走同一链路:链路抖动时脑裂,两侧同时提供服务
  • 健康检查只看端口是否 listen:进程活着但业务已不可用时不会触发切换,等于没有高可用
  • state 一端写 MASTER 一端写 BACKUP 并据此判断:启动顺序不同时会短暂双主,应以优先级与检查脚本决定
  • 切换后没有验证脚本:应用连接池未重连、会话丢失等问题在切换后才暴露

数据来源与参考

  • keepalived 官方文档(VRRP 配置)
  • RFC 5798(VRRPv3)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌