13.7.1 HAProxy+Keepalived高可用架构模式与拓扑

HAProxy+Keepalived高可用架构通常采用双机主备或双主热备模式,通过VRRP提供虚拟IP(VIP)漂移,确保入口地址稳定。业务流量始终通过VIP进入当前主节点,主节点故障后由备节点接管VIP继续提供负载均衡服务。

原理草图(典型主备拓扑):

文章图片

常见架构模式:
- 主备模式:一主一备,主节点负责转发,备节点仅接管故障场景,资源利用率较低但稳定。
- 双主模式(主主+多VIP):两台HAProxy分别承载不同VIP,互为备份,提高资源利用率,复杂度更高。
- 多实例扩展:在HAProxy节点上运行多实例分别服务不同业务,Keepalived管理多个VIP。

关键要素与设计建议:
- VRRP心跳网络:建议使用独立心跳网卡或VLAN,降低误判与抖动。
- VIP与ARP广播:主节点绑定VIP并定期发送ARP通告,确保交换机与客户端ARP表刷新。
- 后端服务池:HAProxy健康检查避免将流量分发至故障节点。
- 监控与告警:对HAProxy、Keepalived、VIP漂移事件进行监控与告警。
- 同机部署:HAProxy与Keepalived同机部署,减少跨主机依赖与链路故障点。
- 主备一致:硬件与系统配置一致,避免切换后性能不一致。
- 域名入口:业务入口域名解析指向VIP,客户端无感切换。
- 防火墙放行:放行VRRP协议与必要端口,确保切换可靠。

安装与基础配置示例(主/备各执行):

# CentOS/RHEL
yum -y install haproxy keepalived

# Ubuntu/Debian
apt -y install haproxy keepalived

# 启动并设为开机自启
systemctl enable --now haproxy
systemctl enable --now keepalived

HAProxy最小可运行配置(/etc/haproxy/haproxy.cfg):

global
  log 127.0.0.1 local0
  maxconn 20000
  user haproxy
  group haproxy
  daemon

defaults
  mode http
  timeout connect 5s
  timeout client  30s
  timeout server  30s
  option httplog

frontend fe_http
  bind *:80
  default_backend be_app

backend be_app
  balance roundrobin
  option httpchk GET /health
  server app1 10.0.1.11:8080 check
  server app2 10.0.1.12:8080 check

Keepalived主备配置示例(主节点 /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
  }
  track_script {
    chk_haproxy
  }
}

vrrp_script chk_haproxy {
  script "/etc/keepalived/chk_haproxy.sh"
  interval 2
  weight -20
}

Keepalived备节点配置差异(仅关键项):

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
  }
  track_script {
    chk_haproxy
  }
}

联动检测脚本示例(/etc/keepalived/chk_haproxy.sh):

#!/bin/bash
# 检查HAProxy进程是否存活,不存活则返回非0触发降权
pidof haproxy >/dev/null 2>&1
exit $?

命令说明与验证步骤:

# 检查VIP是否在主节点
ip a | grep -n "10.0.0.100"

# 说明:如果主节点拥有VIP,应能看到"10.0.0.100/24"绑定在eth0

# 观察VRRP状态
journalctl -u keepalived -f

# 说明:日志中应看到"Transition to MASTER""Transition to BACKUP"

# 验证VIP连通
curl -I http://10.0.0.100

# 说明:应返回HTTP/1.1 200或后端正常响应

# 模拟主节点故障
systemctl stop haproxy

# 说明:Keepalived将因脚本返回非0而降低优先级并触发VIP漂移

排错清单(常见问题与定位命令):

# 1) VIP未漂移:确认VRRP心跳是否被防火墙阻断
# VRRP使用IP协议号112
firewall-cmd --list-all
iptables -S | grep 112

# 2) 主备均无VIP:检查Keepalived配置语法
keepalived -t -f /etc/keepalived/keepalived.conf

# 3) VIP漂移但业务不可达:确认ARP缓存与后端健康
arp -n | grep 10.0.0.100
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

# 4) HAProxy启动失败:检查配置与端口占用
haproxy -c -f /etc/haproxy/haproxy.cfg
ss -lntp | grep :80

练习:
1. 在两台服务器搭建主备架构,完成VIP漂移,并记录故障切换耗时。
2. 将主备模式改为双主模式(两个VIP),验证两端均有业务流量时的切换行为。
3. 将chk_haproxy.sh改为检测后端健康(如curl /health),观察权重变化与VIP漂移结果。