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的会话保持,提升切换后的会话连续性。

常见排错与处理#

  1. 漂移后仍访问旧主机
    排查:
# 检查交换机/网关ARP是否更新
arp -n | grep 10.0.0.100
# 手动发送GARP测试
arping -I eth0 -c 3 -U 10.0.0.100

处理:调整交换机ARP老化、开启garp_master_refresh

  1. 切换后间歇性失败
    排查:
ip -s link show eth0
journalctl -u keepalived | tail -n 50

处理:提高priority差值,减少preempt频繁抢占。

  1. 高并发切换抖动
    排查:
# 观察VRRP状态频繁变更
grep -i "VRRP_Instance" /var/log/messages | tail -n 20

处理:增加preempt_delayadvert_int,稳定VRRP广播。

练习#

  1. 在两台HAProxy服务器配置Keepalived,设置VIP为10.0.0.100,验证主备切换。
  2. 通过tcpdump观察GARP包,记录切换前后MAC地址变化。
  3. 修改prioritypreempt_delay,观察VIP抖动是否改善并记录结果。