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:与优先级相关的偏移时间,避免同时切换。
主备切换流程#
- 正常运行:Master绑定VIP并响应ARP,Backup仅监听通告。
- 故障发生:Master宕机或VRRP服务异常,Backup在超时后判定失效。
- 选举切换:Backup提升为Master,绑定VIP并发送GARP刷新网络邻居缓存。
- 业务恢复:客户端通过VIP重新建立连接,后端服务继续提供流量。
- 故障恢复:原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
练习题#
- 将
advert_int改为2秒,观察tcpdump中通告频率变化,并计算Master Down Interval。 - 把Backup优先级改为130并开启抢占,恢复Master后验证是否抢回VIP。
- 断开Master网卡(
ip link set eth0 down),观察VIP漂移与GARP效果。 - 在客户端固定ARP(静态绑定)后测试切换失败现象,解释原因与解决方案。