Keepalived多节点抢占模式基于VRRP优先级选举:priority最高且存活者持有VIP,恢复后立即抢回;需统一virtual_router_id、设BACKUP态、严格递减priority、同步advert_int与auth_pass。

Keepalived 多节点抢占模式,本质是基于 VRRP 协议的优先级选举机制:多个节点组成一个 VRRP 实例组,谁 priority 最高且存活,谁就持有 VIP;一旦高优节点恢复,立即抢回 VIP。它天然支持 3 节点及以上(如 1 主 + N 备),无需额外插件或复杂逻辑。
以下是关键配置要点和实操步骤:
多节点抢占模式的核心前提
- 所有节点使用**相同的 virtual_router_id** - 所有节点配置 **state MASTER 或 BACKUP**(抢占模式下可混用,但推荐统一设为 BACKUP + 显式 priority 区分角色,更清晰) - 优先级必须严格递减(如 100 → 90 → 80),不能相同 - 心跳间隔(advert_int)建议统一为 1 秒,确保快速感知故障 - 认证密码(auth_pass)必须完全一致三节点抢占式配置示例(IP:192.168.10.117/118/123,VIP:192.168.10.200)
- 节点 A(主):priority 100 - 节点 B(备1):priority 90 - 节点 C(备2):priority 80每个节点的 /etc/keepalived/keepalived.conf 中 vrrp_instance 段保持结构一致,仅修改 priority 和 router_id:
vrrp_instance VI_1 {
state BACKUP # 全设 BACKUP 更稳妥,避免 MASTER 强制绑定导致异常
interface eth0 # 替换为实际网卡名(用 ip a 查)
virtual_router_id 51 # 必须全集群相同
priority 100 # 各节点分别设为 100 / 90 / 80
advert_int 1
authentication {
auth_type PASS
auth_pass mypass123
}
virtual_ipaddress {
192.168.10.200/24
}
}健康检查联动(让业务故障也触发抢占)
单纯靠 keepalived 进程存活不够——需结合 `vrrp_script` 动态调整优先级。例如检测 Nginx 是否响应:vrrp_script chk_nginx {
script "/usr/bin/killall -0 nginx 2>/dev/null"
interval 2
weight -20 # 检查失败时,本节点 priority 减 20
fall 2
rise 1
}
vrrp_instance VI_1 {
...
track_script {
chk_nginx
}
}这样:
- 节点 A(priority 100)Nginx 挂了 → priority 变为 80
- 节点 B(priority 90)立刻高于 A → 抢占 VIP
- 节点 A 修复 Nginx 后 → priority 恢复 100 → 再次抢回 VIP
启动与验证要点
- 所有节点先关闭防火墙或放行 VRRP 协议(协议号 112)及多播地址 `224.0.0.18` - 逐台启动 keepalived(`systemctl start keepalived`),观察日志 `/var/log/messages` 或 `journalctl -u keepalived` - 用 `ip addr show` 确认 VIP 始终在 priority 最高的存活节点上 - 手动停掉当前 master 的 keepalived,观察 VIP 是否按 priority 顺序漂移到下一个节点 - 恢复原 master,确认 VIP 是否自动抢回(即“抢占”生效)不复杂但容易忽略

















