12.2.1 VRRP协议概述与设计目标

VRRP(Virtual Router Redundancy Protocol)在局域网内通过多台路由器/服务器组成“虚拟路由器”,对外提供稳定的VIP,从而避免单点故障。Keepalived基于VRRP完成主备切换,使业务侧始终指向同一网关地址,达到透明切换。

设计目标
1)高可用:主节点故障时,备节点在超时后接管VIP。
2)透明:客户端无需改配置,VIP与虚拟MAC稳定。
3)可控:通过优先级、抢占、健康检查决定主备。

原理草图(VRRP主备与VIP)

文章图片

安装示例(以Keepalived演示VRRP)

说明:VRRP本身是协议,本节用Keepalived作为实现载体进行演示。

# Debian/Ubuntu
sudo apt update
sudo apt -y install keepalived

# RHEL/CentOS
sudo yum -y install keepalived

# 检查版本与服务状态
keepalived -v
systemctl enable --now keepalived

命令解释:
- keepalived -v 查看版本,确认已安装。
- systemctl enable --now 设置开机自启并立即启动。

最小可运行示例(主/备两台)

主节点 /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
  state MASTER
  interface eth0
  virtual_router_id 51
  priority 150
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 123456
  }
  virtual_ipaddress {
    10.0.0.100/24 dev eth0
  }
}

备节点 /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
  state BACKUP
  interface eth0
  virtual_router_id 51
  priority 100
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 123456
  }
  virtual_ipaddress {
    10.0.0.100/24 dev eth0
  }
}

应用配置并验证:

# 重载配置
sudo systemctl restart keepalived

# 在主节点查看VIP是否生效
ip addr show dev eth0 | grep 10.0.0.100

命令解释:
- virtual_router_id 必须一致,否则无法组成同一VRRP组。
- priority 越大越优先成为Master。
- advert_int 通告间隔,备节点超时未收到通告将切换。

观察VRRP通告报文(示例)

# 使用tcpdump抓取VRRP(协议号112)
sudo tcpdump -i eth0 vrrp

预期效果:看到周期性VRRP Advertisement报文;若主节点停机,备节点开始发通告并接管VIP。

手动模拟VIP(理解协议透明性)

# 临时添加VIP到网卡(模拟接管)
sudo ip addr add 10.0.0.100/24 dev eth0

# 删除VIP
sudo ip addr del 10.0.0.100/24 dev eth0

命令解释:
- ip addr add/del 用于理解VIP如何绑定到网卡上。

常见排错要点
1)VIP不漂移:
- 检查virtual_router_id是否一致。
- 检查auth_pass一致性。
- 确认interface是否为实际业务网卡。
2)抓不到VRRP报文:
- 交换机是否隔离组播/VRRP报文。
- 使用tcpdump -i eth0 vrrp确认。
3)抢占不符合预期:
- 检查priority,确认是否启用抢占策略(后续章节详述)。

练习
1)将主节点priority从150改为90,观察VIP是否漂移到备节点。
2)调整advert_int为2,测量切换时间变化。
3)使用tcpdump记录切换前后报文变化,并写出时间线。