13.7.2 VRRP原理与主备切换流程

VRRP原理与主备切换流程#

原理草图与数据流#

文章图片

VRRP核心概念#

VRRP(Virtual Router Redundancy Protocol)通过多台路由/负载设备组成虚拟路由器,对外提供统一的虚拟IP(VIP)。组内节点分为Master与Backup,Master负责VIP对外服务,Backup处于监听状态,确保故障时快速接管。

角色与选举机制#

  • Master:拥有最高优先级(priority),周期性发送VRRP通告(Advertisement),维持VIP与ARP响应。
  • Backup:监听通告并维持计时器,若超时未收到通告则触发选举。
  • 选举规则:优先级高者当选;优先级相同则比较IP地址,数值较大者优先。

通告与定时器#

  • Advertisement Interval:Master发送通告的周期,默认1秒。
  • Master Down Interval:Backup判定Master失效的阈值,一般为(3 * advert_interval) + skew_time
  • Skew Time:与优先级相关的偏移时间,避免同时切换。

主备切换流程#

  1. 正常运行:Master绑定VIP并响应ARP,Backup仅监听通告。
  2. 故障发生:Master宕机或VRRP服务异常,Backup在超时后判定失效。
  3. 选举切换:Backup提升为Master,绑定VIP并发送GARP刷新网络邻居缓存。
  4. 业务恢复:客户端通过VIP重新建立连接,后端服务继续提供流量。
  5. 故障恢复:原Master恢复后根据优先级与配置决定是否抢占(Preempt)。

抢占与非抢占策略#

  • 抢占模式(preempt):恢复后的高优先级节点可重新夺回Master,切换频率可能增加。
  • 非抢占模式:恢复节点保持Backup,避免频繁切换,适合连接敏感业务。

切换对连接的影响#

  • 短连接:切换后快速恢复,影响较小。
  • 长连接:VIP漂移会导致连接中断,需结合会话保持与重试机制优化体验。

GARP与ARP缓存刷新#

切换后新Master会发送GARP(Gratuitous ARP),通知交换机与客户端更新ARP缓存,保证流量尽快转发到新Master。

安装与环境准备示例#

# 两台节点均执行(示例:Ubuntu)
sudo apt update
sudo apt install -y keepalived iproute2 arping tcpdump

# 验证内核支持VRRP与多播
lsmod | grep vrrp || true
ip maddr show dev eth0

Keepalived最小化VRRP示例(含说明)#

Master节点:/etc/keepalived/keepalived.conf

global_defs {
  router_id HAPROXY_M
}

vrrp_instance VI_1 {
  state MASTER          # 初始角色
  interface eth0        # 绑定网卡
  virtual_router_id 51  # VRID,主备必须一致
  priority 120          # 优先级,数值越大越优先
  advert_int 1          # 通告间隔(秒)
  authentication {
    auth_type PASS
    auth_pass 1111
  }
  virtual_ipaddress {
    192.168.10.100/24 dev eth0 label eth0:vip
  }
}

Backup节点:/etc/keepalived/keepalived.conf

global_defs {
  router_id HAPROXY_B
}

vrrp_instance VI_1 {
  state BACKUP
  interface eth0
  virtual_router_id 51
  priority 100
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 1111
  }
  virtual_ipaddress {
    192.168.10.100/24 dev eth0 label eth0:vip
  }
}

启动与状态检查

# 启动与开机自启
sudo systemctl enable --now keepalived

# 查看VIP是否已绑定(Master上应能看到)
ip addr show dev eth0 | grep 192.168.10.100

# 查看VRRP通告(任一节点抓包)
sudo tcpdump -ni eth0 vrrp

命令解释
- ip addr show dev eth0:查看网卡地址,验证VIP是否存在。
- tcpdump -ni eth0 vrrp:抓取VRRP报文,确认通告正常发送/接收。
- systemctl enable --now:立即启动并设置自启。

主备切换演练示例#

# 1) 在Master上停止keepalived,触发切换
sudo systemctl stop keepalived

# 2) 在Backup上观察VIP漂移
ip addr show dev eth0 | grep 192.168.10.100

# 3) 从客户端刷新ARP并验证连通性
arp -d 192.168.10.100 || true
ping -c 3 192.168.10.100

预期效果:VIP从Master漂移到Backup,客户端ping恢复。

常见问题排错(含命令)#

  • VIP未漂移
  • 检查VRID、auth_pass是否一致:
    bash grep -n "virtual_router_id\|auth_pass" /etc/keepalived/keepalived.conf
  • 防火墙阻断VRRP(IP协议号112):
    bash sudo iptables -S | grep 112 || true sudo ufw status verbose || true
  • 收不到通告
  • 网卡与多播检查:
    bash ip maddr show dev eth0 tcpdump -ni eth0 vrrp
  • 切换后客户端仍访问旧MAC
  • 手动发送GARP:
    bash sudo arping -c 3 -A -I eth0 192.168.10.100

练习题#

  1. advert_int改为2秒,观察tcpdump中通告频率变化,并计算Master Down Interval。
  2. 把Backup优先级改为130并开启抢占,恢复Master后验证是否抢回VIP。
  3. 断开Master网卡(ip link set eth0 down),观察VIP漂移与GARP效果。
  4. 在客户端固定ARP(静态绑定)后测试切换失败现象,解释原因与解决方案。