Keepalived多实例竞争策略通过唯一virtual_router_id隔离VRRP组,结合priority和state实现可预测双主高可用;需镜像配置、动态track_script感知服务状态,避免脑裂与VIP冲突。

Keepalived 多实例竞争策略的核心,是让多个 VRRP 实例在不同服务或 VIP 上独立选举主备角色,避免资源闲置,实现真正的双主(Active-Active)高可用。它不是靠“谁先启动谁当主”这种随机逻辑,而是靠 virtual_router_id + priority + state 配合 形成可预测、可对称的抢占机制。
每个实例必须有唯一 virtual_router_id
这是竞争隔离的关键。不同实例即使在同一台机器上,也必须使用互不冲突的 virtual_router_id(取值范围 1–255)。例如:
- VI_1 使用 virtual_router_id 51,负责 VIP 192.168.1.100 和 Nginx 服务
- VI_2 使用 virtual_router_id 52,负责 VIP 192.168.1.101 和 Tomcat 服务
同一 virtual_router_id 的所有节点构成一个独立 VRRP 组,彼此之间才进行主备协商。ID 冲突会导致脑裂或 VIP 漂移异常。
优先级(priority)决定实例级主备归属
每个 vrrp_instance 的 priority 值直接参与该实例的选举——数值越大越优先成为 MASTER。注意:
- priority 是实例维度的,不是整机维度的;一台机器上 VI_1 可设为 150(主),VI_2 可设为 50(备)
- state 字段建议统一设为 BACKUP,由 priority 自动触发角色切换,更健壮(避免手动设 MASTER 后无法降级)
- 若两个节点对同一实例都设 priority=100,且 state=MASTER,则可能同时抢 VIP,引发冲突——务必错开优先级
通过 track_script 动态调整 priority 实现服务感知
静态 priority 不足以应对服务宕机场景。需绑定健康检查脚本,让 Keepalived 根据真实服务状态动态调权:
- 定义检查脚本:
vrrp_script chk_nginx { script "/usr/bin/killall -0 nginx 2>/dev/null" interval 2 weight -30 } - 在对应实例中引用:
track_script { chk_nginx } - 效果:Nginx 进程消失 → 脚本返回非 0 → priority 自动减 30 → 若低于对端,立即让出 MASTER 角色
双主模型下两节点的配置要镜像互补
要真正实现负载分担(如节点 A 主管 VIP1、节点 B 主管 VIP2),两台机器的配置需对称设计:
- 节点 A:VI_1 priority=150(主),VI_2 priority=80(备)
- 节点 B:VI_1 priority=80(备),VI_2 priority=150(主)
- 两个实例的 virtual_router_id、auth_pass、advert_int 必须分别一致,但不能跨实例混用
这样,正常时 VIP1 在 A、VIP2 在 B;任一节点故障,另一节点自动接管两个 VIP(取决于剩余实例的 priority 是否足够高)。

















