Linux Keepalived 高可用部署技巧

7次阅读

keepalived 启动失败主因是 vrrp_script 权限不足或退出码非0;主备切换异常源于 priority 相同或 preempt 配置不当;vip 不漂移多因 Interface 错误或 arp_ignore 限制;调试需启用 -d 参数并重定向日志。

Linux Keepalived 高可用部署技巧

Keepalived 启动失败:检查 vrrp_script 脚本权限和退出码

Keepalived 一启动就退出,日志里只显示 VRRP_Instance(VI_1) Entering FAULT STATE,大概率是健康检查脚本没跑通。它不关心你脚本写得多漂亮,只认两件事:能不能执行、退出码是不是 0。

  • vrrp_script 对应的 shell 脚本必须有可执行权限(chmod +x /path/to/check.sh
  • 脚本末尾必须显式 exit 0(成功)或 exit 1(失败),不能靠命令自然退出——比如 curl -f http://localhost:8080/health 失败时返回非 0,但如果你加了 || true,Keepalived 就永远认为健康
  • 脚本里避免用绝对路径缺失的命令(如直接写 systemctl 而不是 /usr/bin/systemctl),Keepalived 子进程的 $PATH 很窄

主备切换不生效:确认 prioritypreempt 配置逻辑

两台机器都显示 MASTER,或者备机死活不抢主,问题常出在优先级设计和抢占开关上。Keepalived 不是“谁先启谁当主”,而是靠数值比较+状态协商。

  • priority 值必须不同(比如主 100,备 90),相同值会导致选举失败,双双进入 FAULT
  • preempt 默认为 yes,但只在 MASTER 状态丢失后才触发抢占;如果备机一直卡在 BACKUP,先用 ip addr show 确认 VIP 是否真没绑定,再查 journalctl -u keepalived -n 50 看有没有 received lower priority advert 类提示
  • 不要依赖 advert_int 缩短切换时间(比如设成 1s),网络抖动容易引发频繁切换;生产环境建议保持默认 1s 或调到 2s,配合 authentication 防误切

VIP 不漂移:排查 interface 和内核参数

配置写对了,keepalived -D 日志也显示 transition to MASTER STATE,但 ip addr 就是看不到 VIP——十有八九是网卡名或内核限制挡住了。

  • interface 必须填实际物理网卡名(如 ens192),不能填别名(ens192:0)或 bond 接口别名(bond0.100),否则 ARP 广播发不出去
  • 检查 /proc/sys/net/ipv4/conf/all/arp_ignorearp_announce:若为 1 或 2,可能抑制 VIP 的 ARP 响应,临时修复用 echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore,持久化需写进 /etc/sysctl.conf
  • 云环境(如 AWS、阿里云)通常禁用 VRRP 组播,必须改用 unicast_peer 模式,并确保安全组放行 udp 32768–65535 端口

日志太安静?打开 debug 并重定向输出

默认日志级别太低,systemctl status keepalived 只显示启动成功,出问题时像盲人摸象。别靠猜,让 Keepalived 把话讲明白。

  • 启动时加 -d 参数(ExecStart=/usr/sbin/keepalived -f /etc/keepalived/keepalived.conf -d),它会打印 VRRP 状态机每一步动作
  • 日志默认走 syslog,但 systemd 下容易被合并或截断;改成直接输出到文件更可靠:ExecStart=/usr/sbin/keepalived -f /etc/keepalived/keepalived.conf -l -S 0 -D 2>&1 | tee /var/log/keepalived-debug.log
  • 注意 -D(daemon 模式)和 -d(debug)是两个参数,漏掉 -d 就等于没开调试

Keepalived 的脆弱点不在语法,而在它和系统底层的咬合处:脚本执行环境、内核网络、云平台限制。配完别急着测故障,先用 tcpdump -i any vrrp 看一眼组播报文有没有真正发出去——这才是最真实的健康信号。

text=ZqhQzanResources