首页/数据/数据库速查/keepalived + VIP 漂移思路
主从复制与高可用53 条

keepalived + VIP 漂移思路

传统高可用组合:VIP 跟随主库漂移,应用连 VIP 无需感知切换;keepalived 负责探测与让权,脚本负责库层切换动作。

数据库速查数据更新于 2026-10-13

keepalived 与 VIP 是什么

VIP 方案的本质是让应用永远连同一个虚拟地址,由 keepalived 决定这个地址当前落在哪台机器上:主节点正常时地址在它身上,主节点失效时地址漂移到备用节点,应用不需要改配置。keepalived 只负责「地址跟谁走」,数据库层面的角色提升、数据追平、旧主隔离都要靠自定义通知脚本与配套机制完成,两者缺一不可。

基本信息

配置模型vrrp_instance 定义虚拟路由器,virtual_ipaddress 声明 VIP
优先级priority 决定谁是主,notify 系列脚本在状态切换时触发
健康探测vrrp_script 定期执行检查,失败后降低优先级触发切换
配套动作notify_master 调用提升脚本,完成数据库层角色切换
关键前提需要 fencing 机制避免脑裂

典型使用场景

  • 传统主从高可用:应用连 VIP,主库故障后地址漂到备用节点
  • 机房内切换:不依赖中间件时用 VIP 实现最小改动的高可用
  • 读流量入口:给多个只读副本提供一个统一地址,便于运维调整
  • 渐进式迁移:切换期间用 VIP 把流量指向新实例,验证通过后收敛
  • 演练环境:在测试环境复现切换流程,验证脚本与超时参数

keepalived 配置示意

keepalived 配置示意
vrrp_script chk_mysql {
  script "/usr/local/bin/check_mysql_write.sh"   # 探测 3306 是否可写
  interval 2        # 每 2 秒探测一次
  weight -30        # 探测失败则降低优先级,触发让权
  fall 2            # 连续 2 次失败才判定异常
  rise 2            # 连续 2 次成功才恢复
}
vrrp_instance mysql_vip {
  state BACKUP
  interface eth0
  virtual_router_id 51
  priority 100
  virtual_ipaddress { 10.0.0.100/24 }
  track_script { chk_mysql }
  notify_master "/usr/local/bin/mysql_promote.sh"   # 成为主时执行提升脚本
}

参数读法

参数含义设置建议
state初始角色双机都写 BACKUP 更稳,由 priority 决定
priority优先级,数值大者为主主备差值要够大,避免抖动反复切换
interval / fall / rise探测间隔与判定阈值过激会误切换,过缓则故障转移慢
track_script绑定的健康检查必须探测「可写」而非仅端口可达
notify_master成为主时执行的脚本脚本里必须包含追平判断与旧主隔离
VIP 只解决「应用连谁」,不解决「数据是否追得上」:提升脚本里必须包含复制追平判断,否则可能在从库没追平时就把流量切过去,造成数据丢失或双写。
切换演练要在测试环境完整跑一遍:包括探测触发、地址漂移、提升脚本执行、应用重连四个环节,任何一个环节没验证过,真实故障时都可能卡住。

易错点

  • 健康检查只探测端口存活:主库进程在但已不可写时地址不会漂移,故障依然存在,检查脚本要真正执行写测试
  • 没有 fencing 机制:旧主恢复后 VRRP 抢回地址形成双主,两边同时接受写入导致数据分叉
  • priority 差值过小或探测过于敏感:网络抖动触发反复切换,业务频繁中断
  • 提升脚本里没有追平判断:从库延迟很大时仍被提升为主,直接丢失这段延迟内的数据
  • 切换后不检查应用连接:VIP 漂移后旧连接仍然指向原主,应用缺少重连逻辑会持续报错

数据来源与参考

  • keepalived 官方文档
  • MySQL 8.0 Reference Manual: High Availability

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌