12.2.4 状态机与通告报文

VRRP通过有限状态机驱动主备切换,典型状态包括 Initialize、Backup、Master。Initialize用于启动与参数装载,进入后根据本地优先级、是否抢占以及接口状态决定转入Master或Backup。Master负责对外发布虚拟IP与虚拟MAC并持续发送通告报文;Backup监听通告并维护定时器,当超时或检测到更高优先级节点接管时才触发切换。

文章图片

通告报文是VRRP维持主备一致性的核心心跳。报文携带VRID、优先级、通告间隔、认证信息(若启用)以及虚拟IP列表。Master以固定周期发送通告,Backup根据“主机失效时间”判断是否失联。常见计算方式为:
Master_Down_Interval = (3 × 广播间隔) + Skew_Time,其中 Skew_Time 与优先级相关,优先级越高偏移越小,从而更快接管。

状态迁移关键路径如下:Backup在超时后进入Master并立即发送“抢占通告”,同时发送无偿ARP(GARP)刷新交换机与客户端ARP缓存,确保流量迅速切换到新的主节点。若配置了抢占模式,Backup在检测到更高优先级的Master恢复后会主动降为Backup;若关闭抢占,则保持现有主节点以避免频繁抖动。

在Keepalived场景中,健康检查结果会影响优先级:脚本检测失败时降低优先级或进入Fault状态,进而触发状态迁移。实际运维需关注通告间隔与网络抖动的权衡,过小可能放大误切,过大导致故障切换慢;同时需确保二层广播可达、VRID唯一、优先级规划清晰,以维持稳定的状态机行为与通告一致性。

示例:两节点VRRP状态机与通告报文验证

1) 安装与启动

# 两台节点执行
sudo yum -y install keepalived
sudo systemctl enable keepalived
sudo systemctl start keepalived

2) 配置(主节点 /etc/keepalived/keepalived.conf)

vrrp_script chk_nginx {
  script "/usr/bin/curl -sf http://127.0.0.1/ >/dev/null"
  interval 2
  weight -20
}

vrrp_instance VI_1 {
  state MASTER
  interface eth0
  virtual_router_id 51
  priority 120
  advert_int 1
  preempt_delay 5
  authentication {
    auth_type PASS
    auth_pass 123456
  }
  virtual_ipaddress {
    192.168.10.100/24 dev eth0 label eth0:1
  }
  track_script {
    chk_nginx
  }
}

3) 配置(备节点 /etc/keepalived/keepalived.conf)

vrrp_script chk_nginx {
  script "/usr/bin/curl -sf http://127.0.0.1/ >/dev/null"
  interval 2
  weight -20
}

vrrp_instance VI_1 {
  state BACKUP
  interface eth0
  virtual_router_id 51
  priority 100
  advert_int 1
  preempt_delay 5
  authentication {
    auth_type PASS
    auth_pass 123456
  }
  virtual_ipaddress {
    192.168.10.100/24 dev eth0 label eth0:1
  }
  track_script {
    chk_nginx
  }
}

4) 重载并验证VIP与通告

sudo systemctl reload keepalived

# 验证VIP
ip addr show dev eth0 | grep 192.168.10.100

# 抓取VRRP通告
sudo tcpdump -nn -i eth0 vrrp
# 预期:Master持续发送VRRP通告,Backup能看到但不回应

命令解释与要点
- advert_int 1:通告间隔1秒,越小切换越快但越敏感
- priority:优先级,数值大者优先
- preempt_delay:抢占延迟,避免抖动
- track_script:健康检查影响优先级

排错清单(常见症状→排查命令)
- VIP未漂移
- ip addr show dev eth0 检查VIP是否存在
- journalctl -u keepalived -f 看状态机切换日志
- 看不到VRRP通告
- tcpdump -nn -i eth0 vrrp
- 检查交换机是否允许224.0.0.18多播
- 频繁切换
- 检查脚本稳定性:/usr/bin/curl -sf http://127.0.0.1/
- 调整 advert_intpreempt_delay

练习
1. 将备节点优先级提高到130,观察抢占行为与切换时间。
2. 将 advert_int 从1改为2,测量故障切换时间变化。
3. 关闭抢占(nopreempt),模拟主节点恢复,观察是否保持现主不切换。