必须用包管理器安装,95%生产环境应优先使用apt/yum/dnf;debian/ubuntu执行sudo apt-get update && sudo apt-get install -y keepalived,rhel/centos 7/8用sudo yum install -y keepalived,8+或fedora用sudo dnf install -y keepalived。

安装 Keepalived 必须用包管理器,别编译
95% 的生产环境应该直接走 apt、yum 或 dnf 安装,不是“不够新”或“想显专业”就去源码编译——除非你明确需要 --enable-ipvs、要适配老内核(如 CentOS 6),或者系统压根没提供二进制包。
Debian/Ubuntu 执行:sudo apt-get update && sudo apt-get install -y keepalived
RHEL/CentOS 7/8 执行:sudo yum install -y keepalived
RHEL/CentOS 8+ 或 Fedora 执行:sudo dnf install -y keepalived
装完立刻验证:
• 运行 ls /usr/sbin/keepalived 应返回路径
• 运行 systemctl list-unit-files | grep keepalived 应看到服务状态
• 防火墙必须加协议规则:sudo firewall-cmd --permanent --add-protocol=vrrp,然后 firewall-cmd --reload —— VRRP 不是端口,是 IP 协议号 112,用 --add-port 无效
vrrp_instance 配置错一个参数,VIP 就不漂
常见故障不是“没生效”,而是日志里安静地卡在 BACKUP 或两台都抢 MASTER。核心就四点:
-
interface必须填真实网卡名,比如ens33或enp0s3,不是eth0(CentOS 7+ 默认不用这个)、不是lo、也不是虚拟网桥virbr0;用ip -br a确认 -
virtual_router_id在同一局域网所有节点中必须完全一致(范围 1–255),哪怕只配两台也不能随意改;多个vrrp_instance时,每个实例的 ID 必须不同 -
state是静态声明:主节点写state MASTER,备节点写state BACKUP—— 写反了不会报错,但 VIP 永远不动 -
priority主节点建议设 100,备节点设 90 或更低;差值 ≥50 更稳,避免网络抖动触发误切换;track_script触发降级后,priority 变更低,但 state 不变
健康检查脚本不执行?大概率用了已废弃的 check_script
Keepalived 2.0+ 已彻底弃用 check_script,配置里写了也静默忽略——现象就是 Nginx 挂了,VIP 还赖在原机器上,用户持续 502。
正确做法是:
- 全局定义脚本块:
vrrp_script chk_nginx { script "/etc/keepalived/check_nginx.sh" interval 2 timeout 2 fall 2 rise 2 } - 在
vrrp_instance块里引用:track_script { chk_nginx } - 脚本必须有执行权限:
chmod 755 /etc/keepalived/check_nginx.sh,且属主为root - 脚本内容推荐用
pgrep -x nginx或curl -sf http://127.0.0.1/health | grep ok,末尾明确exit 0(健康)或exit 1(异常);返回其他非零值(如exit 2)会被忽略
IP addr show 看不到 VIP?先看 interface 和 ARP
ip addr show 没出现 VIP,不代表配置失败,但大概率是 interface 名写错,或者 VIP 绑定后没发免费 ARP 刷新下游缓存。
排查重点:
- 确认网卡 UP 且有同子网 IP:
ip -br a输出里目标网卡状态是UP,且 IP(如192.168.100.11/24)和 VIP(如192.168.100.107)在同一网段,不冲突、不越界 - 多播模式下,确保交换机未禁 IGMP,防火墙放行组播地址
224.0.0.18 - 单播模式必须双向配
unicast_src_ip和unicast_peer,不能只配一边 - 加
garp_master_delay 1到vrrp_instance块里,让 VIP 绑定后立刻发免费 ARP;否则客户端可能缓存旧 MAC,访问超时
真正关键的不是“配置写对了”,而是 journalctl -u keepalived -n 50 -f 里有没有 “Starting VRRP instance” 和 “Registering Kernel netlink reflector” —— 没这两句,后面全白搭。











