13.7.5 虚拟IP漂移与客户端访问一致性
虚拟IP(VIP)漂移是HAProxy与Keepalived高可用的核心机制,通过VRRP在主备节点间切换VIP归属,确保客户端始终访问同一入口地址而无需感知后端变化。客户端一致性主要体现在入口地址稳定、会话连续性与切换可控。运维关键在于ARP更新、连接重建与DNS缓存的协同。
原理草图(VRRP与VIP漂移):
VIP漂移关键流程:
1. MASTER故障或健康检查失败,VRRP状态从MASTER降为BACKUP。
2. BACKUP提升为MASTER并绑定VIP到本地网卡。
3. 发送免费ARP(GARP)更新交换机/邻居MAC表。
4. 客户端继续访问VIP,新的MASTER接管连接。
配置示例:Keepalived与VIP漂移参数#
文件路径:/etc/keepalived/keepalived.conf
global_defs {
router_id haproxy_vrrp
}
vrrp_script chk_haproxy {
script "/etc/keepalived/check_haproxy.sh"
interval 2
weight -20
fall 2
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
preempt_delay 5
virtual_ipaddress {
10.0.0.100/24 dev eth0 label eth0:vip
}
garp_master_delay 1
garp_master_refresh 5
garp_master_repeat 2
arp_interval 1
arp_ignore 1
arp_announce 2
track_script {
chk_haproxy
}
}
关键参数解释:
- priority:优先级,数值越大越易成为MASTER。
- garp_master_delay:切换后延迟发送GARP时间,避免设备未就绪。
- garp_master_refresh:周期性GARP刷新,更新二层ARP表。
- arp_ignore/arp_announce:优化ARP响应策略,避免ARP冲突。
- preempt_delay:避免频繁抢占造成VIP抖动。
脚本示例:HAProxy健康检查联动#
文件路径:/etc/keepalived/check_haproxy.sh
#!/usr/bin/env bash
# 返回0表示健康,返回1表示不健康
if pgrep -x "haproxy" > /dev/null; then
exit 0
else
exit 1
fi
使脚本可执行:
chmod +x /etc/keepalived/check_haproxy.sh
命令验证:确认VIP漂移与ARP刷新#
查看VIP是否绑定:
ip addr show dev eth0 | grep 10.0.0.100
查看VRRP状态日志:
journalctl -u keepalived -f
抓包确认GARP:
tcpdump -ni eth0 arp and host 10.0.0.100
预期效果:
- 切换后新MASTER网卡出现10.0.0.100/24。
- tcpdump可见GARP广播。
- 客户端访问不需要变更目标地址。
会话一致性示例:HAProxy配置与说明#
文件路径:/etc/haproxy/haproxy.cfg
frontend fe_http
bind 10.0.0.100:80
mode http
default_backend be_web
backend be_web
mode http
balance source
option httpchk GET /health
cookie SRV insert indirect nocache
server web1 10.0.0.21:80 check cookie s1
server web2 10.0.0.22:80 check cookie s2
说明:
- balance source:源地址一致性,减少切换后落点变化。
- cookie:基于Cookie的会话保持,提升切换后的会话连续性。
常见排错与处理#
- 漂移后仍访问旧主机
排查:
# 检查交换机/网关ARP是否更新
arp -n | grep 10.0.0.100
# 手动发送GARP测试
arping -I eth0 -c 3 -U 10.0.0.100
处理:调整交换机ARP老化、开启garp_master_refresh。
- 切换后间歇性失败
排查:
ip -s link show eth0
journalctl -u keepalived | tail -n 50
处理:提高priority差值,减少preempt频繁抢占。
- 高并发切换抖动
排查:
# 观察VRRP状态频繁变更
grep -i "VRRP_Instance" /var/log/messages | tail -n 20
处理:增加preempt_delay与advert_int,稳定VRRP广播。
练习#
- 在两台HAProxy服务器配置Keepalived,设置VIP为
10.0.0.100,验证主备切换。 - 通过
tcpdump观察GARP包,记录切换前后MAC地址变化。 - 修改
priority与preempt_delay,观察VIP抖动是否改善并记录结果。