keepalived vip漂移依赖vrrp协议协商,故障切换1–3秒内完成;关键配置virtual_router_id、authentication、advert_int、interface必须主备完全一致;state仅初始标识,vip归属由priority决定;健康检查须端到端curl探测;需关闭防火墙、selinux并同步时间。

Keepalived 实现虚拟 IP(VIP)漂移,核心是让主备节点通过 VRRP 协议协商 VIP 归属,故障检测与切换通常在 1–3 秒内完成。它不依赖服务进程是否“存在”,而取决于优先级、心跳通信和健康状态的真实反馈。配得对,VIP 就能秒级响应;配错一个参数,就可能“日志显示切换了,但 IP 始终不出现”。
关键配置项必须完全一致
主备节点若有一处不匹配,VRRP 报文会被静默丢弃,VIP 根本无法协商:
- virtual_router_id:取值 0–255,同一局域网内必须唯一且两端相同;重复会导致报文被拒
- authentication:auth_type(通常 PASS)和 auth_pass(明文密码)必须逐字一致,大小写敏感
- advert_int:建议设为 1(即每秒发一次心跳),这是实现秒级响应的基础间隔
- interface:绑定的物理网卡名(如 ens160、eth0)需真实存在,且两节点尽量统一命名;填错网卡名会导致 Keepalived 启动成功但不发包
state 和 priority 的真实逻辑
state(MASTER/BACKUP)只是初始状态标识,不是角色锁定开关。VIP 归属由 priority 比较结果决定:
- 主节点 priority 设为 101,备节点设为 99(差值 ≥2 更稳妥,避免网络抖动误切)
- 两台都配 state BACKUP 是更安全的做法,可降低脑裂风险
- 若主恢复后需自动抢回 VIP,必须在 vrrp_instance 块外层显式写入 nopreempt(不是注释掉它);默认行为就是抢占
健康检查不能只看进程是否存活
单纯用 pgrep 检查 httpd 或 nginx 进程,会漏判“进程活着但服务不可用”的典型场景(如卡在 graceful shutdown、端口监听异常、返回 503):
- 改用 curl 端到端探测:
curl -f --max-time 2 http://127.0.0.1/health,-f 确保非 2xx 状态直接失败,--max-time 防止脚本 hang 住 - /health 路径需真实存在并返回 200 OK(例如 echo "ok" > /var/www/html/health)
- Apache/Nginx 必须监听 *:80 或 127.0.0.1:80,不能仅绑定内网 IP
- vrrp_script 中 weight 建议设为 -5 或 -10,避免一次误判就触发切换
环境准备常被忽略但至关重要
很多 VIP 不漂移的问题,根源不在 Keepalived 配置本身:
- 关闭防火墙:
systemctl stop firewalld && systemctl disable firewalld(或放行 UDP 112 端口) - 禁用 SELinux:
setenforce 0并修改/etc/sysconfig/selinux中SELINUX=disabled - 开启 IP 转发(尤其用于代理或 LVS 场景):
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf && sysctl -p - 确保时间同步:chronyd 或 ntpd 必须运行,两节点时间差建议控制在 1 秒内
验证要分层看,不能只信 service status
启动后务必结合多层信息交叉确认:
- 查 VIP 是否绑定:
ip addr show dev ens160 | grep 192.168.1.200 - 盯实时日志:
tail -f /var/log/messages | grep Keepalived_vrrp,观察是否出现Entering MASTER STATE或Transition to MASTER STATE - 手动模拟故障:
systemctl stop keepalived,观察 Backup 是否在 1–2 秒内获得 VIP 并响应 ping/HTTP 请求 - 注意 vrrp_strict:若部署在单播或复杂网络中,建议注释掉该行,否则可能拒绝合法 VRRP 报文











