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=1、priority=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. 练习#
- 将
advert_int从1改为2,测算并验证切换时延变化。 - 配置
nopreempt,模拟Master恢复后观察是否抢占。 - 停止Nginx服务,验证
track_script触发切换并记录日志。 - 使用
tcpdump抓包,对比Master与Backup上VRRP通告的方向差异。