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 只解决「应用连谁」,不解决「数据是否追得上」:提升脚本里必须包含复制追平判断,否则可能在从库没追平时就把流量切过去,造成数据丢失或双写。
切换演练要在测试环境完整跑一遍:包括探测触发、地址漂移、提升脚本执行、应用重连四个环节,任何一个环节没验证过,真实故障时都可能卡住。