Keepalived仅负责VIP漂移和健康检查,不直接管理服务启停;vrrp_script必须配weight(常为±2)以动态调整优先级,配合fall/rise防抖动;notify脚本需加锁、判角色、写日志;须配置arp_ignore/arp_announce及放行VRRP协议。

Keepalived 本身不提供服务高可用,它只管 VIP(虚拟 IP)漂移和健康检查;真正做服务高可用,得靠你自己的服务进程配合 notify 脚本或外部监控逻辑来启停。别指望 Keepalived 自动拉起 Nginx 或 MySQL —— 它连进程都看不见。
为什么 vrrp_script 必须配 weight 且常为 ±2?
Keepalived 的主备切换依赖 VRRP 优先级动态调整,而 vrrp_script 的作用就是“根据脚本返回值修改优先级”。不设 weight,脚本成功/失败根本不会影响选举结果。
-
weight -2:脚本失败时,当前节点优先级减 2,大概率触发降级(尤其当 MASTER 初始优先级仅比 BACKUP 高 1) -
weight +2:脚本成功时加权(少见,多用于主动抢占场景) - 必须搭配
fall 2和rise 2,避免因瞬时网络抖动误判 - 脚本里别用
exit 0表示“服务挂了”——Keepalived 把非 0 当失败,exit 1才是服务异常的正确返回
notify 脚本里不能直接重启服务,必须加锁和状态判断
Keepalived 在状态切换(MASTER/BACKUP/FAULT)时会反复调用 notify 脚本,高频触发下,没防护的 systemctl restart nginx 可能导致服务反复启停甚至端口冲突。
- 用
/tmp/keepalived_notify.lock文件锁 +flock控制并发执行 - 在脚本开头读取当前角色:
if [ "$1" = "MASTER" ]; then ...,只在切 MASTER 时启动服务 - 切 BACKUP 时,建议用
systemctl try-stop nginx(不报错)而非stop,避免因服务已停而报错中断流程 - 所有日志写入
/var/log/keepalived-notify.log,方便排查“为什么没启服务”
防火墙和内核参数不调,VIP 根本 ping 不通
Linux 默认禁止非本地绑定的 IP 响应 ARP 请求,且可能丢弃目的地址不是本机的 IP 包 —— 这会导致 VIP 漂过去后,客户端 ping 不通、TCP 连接超时。
- 运行:
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore和echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce - 永久生效需写入
/etc/sysctl.conf,并执行sysctl -p - 确保防火墙放行 VRRP 协议(协议号 112):
iptables -A INPUT -p vrrp -j ACCEPT - 若用 firewalld,要加
--permanent --add-protocol=vrrp,否则 reload 后规则丢失
最常被忽略的是 arp_ignore 和 arp_announce —— 两台机器 VIP 看似漂过去了,但客户端发来的 ARP 请求得不到响应,连接永远卡在 SYN_SENT。这个点不验证,整套配置就是个假高可用。


















