主从节点状态由priority值和健康检查结果共同决定,priority高者成为MASTER并持有VIP,VRRP心跳超时或健康检查失败触发切换,需统一virtual_router_id、正确配置interface并启用strict_mode防脑裂。

主从节点状态管理是 Nginx 双机热备(基于 Keepalived)稳定运行的核心。它不依赖人工干预,而是由 VRRP 协议驱动的自动状态协商机制决定谁对外提供服务,关键在于“谁持有虚拟 IP(VIP)”以及“何时切换”。
主从角色由 priority 和 state 共同决定
Keepalived 配置中,state(MASTER/BACKUP)仅表示初始期望状态,真正起决定作用的是 priority 值和健康检查结果。
- 两台节点启动后,各自广播自己的 priority;数值更高者成为 MASTER,绑定 VIP 并响应客户端请求
- 即使配置为 state BACKUP,只要 priority 高于对方,仍会抢夺 MASTER 角色(除非启用非抢占模式)
- 默认为抢占式:MASTER 恢复后会重新夺回 VIP,可能造成短暂连接中断;如需避免,需在配置中添加
nopreempt(仅 BACKUP 节点有效)
状态切换依赖健康检查与心跳超时
Keepalived 不只看进程是否存活,而是通过多层检测保障服务真实可用:
- VRRP 心跳包(组播地址 224.0.0.18)每
advert_int秒发送一次;若 BACKUP 在advert_int × 3秒内未收到,触发切换 - 可配置自定义健康检查脚本(如检测 nginx 进程、端口连通性或 HTTP 返回码),失败则主动降低本节点 priority,促使角色转移
- 注意:健康检查失败 ≠ 立即切换;它先改变 priority,再由 VRRP 协议重新选举,确保切换逻辑清晰可控
防止脑裂的关键约束
当网络分区发生时,主从可能同时认为自己是 MASTER,导致 VIP 冲突——这就是脑裂。规避要点包括:
- virtual_router_id 必须一致:同一组主从必须使用相同 ID(1–255),否则不视为同一 VRRP 组
- interface 名称需准确:比如 eth0 或 ens33,写错会导致心跳发不出或收不到
- 建议启用
strict_mode(Keepalived 2.0+),强制校验配置一致性,减少误配风险 - 生产环境应配置独立的心跳链路(如专用网卡或 VLAN),避免业务网络故障引发误判
状态可观测性与日常维护
运行中可通过以下方式确认当前节点角色和 VIP 绑定情况:
- 执行
ip addr show:查看 VIP 是否出现在本机网卡上(如inet 192.168.0.189/32) - 运行
systemctl status keepalived或tail -f /var/log/messages | grep Keepalived,观察日志中 “Entering MASTER STATE” 或 “Transition to MASTER/BACKUP STATE” 记录 - 用
kill -USR1 $(pgrep keepalived)发送信号,生成运行时状态报告(含优先级、接口、VRRP 实例等)











