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漂移结果。