12.1.2 VRRP在Keepalived中的实现机制

VRRP在Keepalived中的实现机制#

Keepalived基于VRRP实现VIP漂移与主备选举。本节聚焦其实现机制,并通过示例、安装、排错与练习巩固理解。

1. 原理草图与角色#

文章图片
  • VRRP实例(vrrp_instance):定义一组参与选举的节点。
  • Master/Backup:由vrrp进程维护状态机和VIP绑定。
  • VIP:由Master绑定到指定网卡。

2. 实现机制要点(含命令解释)#

  • 通告报文:Master周期性发送VRRP Advertisement(默认1s)到组播 224.0.0.18
  • 选举比较:优先级数值越大越优;同优先级比较IP地址。
  • 抢占控制nopreempt可禁止恢复后抢占。
  • 超时切换:Backup在Master_Down_Interval内未收到通告即切换。
  • GARP更新:切换后广播GARP更新ARP缓存,避免流量仍指向旧Master。
  • 动态优先级track_script/track_interface触发优先级变化。

3. 安装与最小可运行示例#

环境假设:
- Master:10.0.0.11/24
- Backup:10.0.0.12/24
- VIP:10.0.0.100/24
- 接口:eth0

# 两台机器安装
sudo yum -y install keepalived
# 或
sudo apt -y install keepalived

# 启动并设置开机自启
sudo systemctl enable --now keepalived

Master 配置 /etc/keepalived/keepalived.conf

global_defs {
  router_id KA_MASTER
}

vrrp_instance VI_1 {
  state MASTER
  interface eth0
  virtual_router_id 51
  priority 120
  advert_int 1

  virtual_ipaddress {
    10.0.0.100/24
  }
}

Backup 配置 /etc/keepalived/keepalived.conf

global_defs {
  router_id KA_BACKUP
}

vrrp_instance VI_1 {
  state BACKUP
  interface eth0
  virtual_router_id 51
  priority 100
  advert_int 1
  # 可选:禁止抢占
  # nopreempt

  virtual_ipaddress {
    10.0.0.100/24
  }
}

重载与验证:

# 两台机器分别执行
sudo systemctl restart keepalived

# 查看VIP是否在Master上
ip addr show dev eth0 | grep 10.0.0.100

# 观察VRRP通告
sudo tcpdump -ni eth0 vrrp

预期效果:
- Master上可见 10.0.0.100/24
- Backup上无VIP,tcpdump能看到VRRP通告;
- 停掉Master的keepalived后,Backup绑定VIP。

4. 动态优先级示例(应用健康检查)#

检查脚本 /etc/keepalived/check_nginx.sh

#!/bin/bash
# 200 为成功;非 200 降低优先级
curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1/ | grep -q 200
sudo chmod +x /etc/keepalived/check_nginx.sh

在 Master/Backup 配置中添加:

vrrp_script chk_nginx {
  script "/etc/keepalived/check_nginx.sh"
  interval 2
  weight -30
}

vrrp_instance VI_1 {
  ...
  track_script {
    chk_nginx
  }
}

说明:
- weight -30 表示检查失败时优先级降低30;
- 当Master服务异常时可触发切换。

5. 报文与时间参数计算示例#

  • Master_Down_Interval 约为 (3 * advert_int) + skew_time
  • skew_time = (256 - priority) / 256
    例如 advert_int=1priority=120
    skew_time ≈ (256-120)/256 ≈ 0.53
    Master_Down_Interval ≈ 3 + 0.53 = 3.53s

6. 常见排错与定位命令#

# 1) 查看Keepalived运行状态
systemctl status keepalived

# 2) 查看VIP绑定情况
ip addr show dev eth0

# 3) 查看VRRP报文是否收到
tcpdump -ni eth0 vrrp

# 4) 观察日志
journalctl -u keepalived -f

排错要点:
- 未收到VRRP:检查防火墙/安全组是否放通组播224.0.0.18或改用单播。
- VIP未绑定:确认virtual_router_id一致、interface正确。
- 频繁切换:检查advert_int设置、网络抖动或健康检查过于严格。

7. 练习#

  1. advert_int从1改为2,测算并验证切换时延变化。
  2. 配置nopreempt,模拟Master恢复后观察是否抢占。
  3. 停止Nginx服务,验证track_script触发切换并记录日志。
  4. 使用tcpdump抓包,对比Master与Backup上VRRP通告的方向差异。