12.2.2 选举机制与优先级/抢占

选举机制与优先级/抢占#

本节聚焦 VRRP 的选举与抢占行为,给出原理草图、完整配置示例、验证命令、排错与练习,帮助你在 Keepalived 场景中稳定控制主备切换。

1. 原理草图:优先级与抢占如何决定 Master#

文章图片

2. 选举规则与优先级计算(带命令解释)#

  • 优先级范围:1–254;255 为 Address Owner(节点自身配置 VIP)。
  • 同优先级:比较IP 地址,数值更高者获胜。
  • Master Down Interval(3 × advert_int) + skew_time,优先级越高 skew_time 越小。

查看本机 VRRP 实例与优先级(通过配置确认):

# Keepalived 配置路径
sudo grep -n "vrrp_instance\|priority\|advert_int" /etc/keepalived/keepalived.conf

# 解释:
# vrrp_instance  -> 实例名称
# priority       -> 优先级
# advert_int     -> 通告间隔(秒)

3. 完整示例:双节点选举与抢占#

场景:A 为主(priority 150),B 为备(priority 100),开启抢占。
VIP192.168.10.100/24,绑定在 eth0

节点A /etc/keepalived/keepalived.conf

global_defs {
  router_id LVS_A
}

vrrp_instance VI_1 {
  state MASTER
  interface eth0
  virtual_router_id 51
  priority 150
  advert_int 1
  preempt
  virtual_ipaddress {
    192.168.10.100/24 dev eth0
  }
}

节点B /etc/keepalived/keepalived.conf

global_defs {
  router_id LVS_B
}

vrrp_instance VI_1 {
  state BACKUP
  interface eth0
  virtual_router_id 51
  priority 100
  advert_int 1
  preempt
  virtual_ipaddress {
    192.168.10.100/24 dev eth0
  }
}

启动并验证:

# 启动服务
sudo systemctl enable --now keepalived

# 验证 VIP 是否在 Master 上
ip -4 a show dev eth0 | grep 192.168.10.100

# 解释:
# ip -4 a show dev eth0  -> 查看接口IPv4地址
# grep VIP              -> 判断 VIP 是否漂移到该节点

预期效果
- 节点A持有 VIP;
- A 关闭后,VIP 漂移到 B;
- A 恢复后(抢占开启),VIP 回到 A。

4. 抢占开关对比(含配置与效果)#

关闭抢占,避免主机恢复即切回:

vrrp_instance VI_1 {
  ...
  nopreempt
}

效果:高优先级节点恢复后不会抢占,直到当前 Master 故障。

5. 通告与选举验证(抓包/日志)#

使用 tcpdump 观察 VRRP 通告:

sudo tcpdump -nn -i eth0 vrrp

# 解释:
# -nn   -> 不解析主机名/端口
# -i    -> 指定接口
# vrrp  -> 过滤 VRRP 协议(IPv4 协议号 112)

查看 Keepalived 日志(不同系统路径可能不同):

# Debian/Ubuntu
sudo journalctl -u keepalived -f

# CentOS/RHEL
sudo tail -f /var/log/messages | grep keepalived

6. 常见故障与排错#

  • VIP 不漂移
    1) 检查两端 virtual_router_id 是否一致
    2) 检查接口名是否一致 eth0/ens33
    3) 确认防火墙放行 VRRP(协议 112)

放行 VRRP(示例:firewalld):

sudo firewall-cmd --permanent --add-protocol=vrrp
sudo firewall-cmd --reload
  • 频繁切换
    1) 检查网络抖动
    2) 提高 advert_int(如 1 -> 2)
    3) 禁用抢占 nopreempt

7. 练习#

1) 将节点B优先级改为 160,观察 Master 变化并记录日志关键行。
2) 开启 nopreempt,模拟 A 恢复后 VIP 是否回切。
3) 将 advert_int 改为 2,测算 Master Down Interval 并验证切换时间。