12.6.2 Keepalived + HAProxy 负载均衡高可用
Keepalived + HAProxy 负载均衡高可用用于承载入口流量并消除单点:HAProxy负责四/七层转发与后端健康检查,Keepalived基于VRRP漂移VIP实现主备切换。典型拓扑为两台HAProxy节点组成主备,前端VIP对外提供服务,后端为多台业务实例。
安装与基础配置示例#
环境假设:
- HAProxy-1:10.0.0.21(MASTER)
- HAProxy-2:10.0.0.22(BACKUP)
- VIP:10.0.0.100/24
- 网卡:eth0
1) 安装软件#
# 两台HAProxy节点均执行
sudo yum install -y keepalived haproxy
# 或 Ubuntu/Debian
# sudo apt-get update && sudo apt-get install -y keepalived haproxy
2) HAProxy 配置(/etc/haproxy/haproxy.cfg)#
global
log /dev/log local0
maxconn 4096
defaults
log global
mode http
timeout connect 5s
timeout client 30s
timeout server 30s
frontend fe_http
bind 0.0.0.0:80
default_backend be_web
backend be_web
option httpchk GET /health
http-check expect status 200
balance roundrobin
server web1 10.0.0.11:80 check inter 2000 rise 2 fall 3
server web2 10.0.0.12:80 check inter 2000 rise 2 fall 3
启动并验证:
sudo systemctl enable --now haproxy
sudo ss -lntp | grep 80
# 预期:haproxy监听0.0.0.0:80
3) Keepalived 配置(/etc/keepalived/keepalived.conf)#
MASTER 节点(10.0.0.21)#
global_defs {
router_id LVS_MASTER
}
vrrp_script chk_haproxy {
script "/etc/keepalived/check_haproxy.sh"
interval 2
weight -30
fall 2
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 120
advert_int 1
preempt_delay 5
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
10.0.0.100/24
}
track_script {
chk_haproxy
}
}
BACKUP 节点(10.0.0.22)#
global_defs {
router_id LVS_BACKUP
}
vrrp_script chk_haproxy {
script "/etc/keepalived/check_haproxy.sh"
interval 2
weight -30
fall 2
rise 2
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
preempt_delay 5
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
10.0.0.100/24
}
track_script {
chk_haproxy
}
}
4) Keepalived 健康检查脚本#
# /etc/keepalived/check_haproxy.sh
#!/bin/bash
# 作用:检查HAProxy进程和本地端口,失败则让Keepalived降权
if ! pgrep haproxy >/dev/null; then
exit 1
fi
if ! ss -lnt | grep -q ":80"; then
exit 1
fi
exit 0
sudo chmod +x /etc/keepalived/check_haproxy.sh
sudo systemctl enable --now keepalived
验证VIP漂移:
# 在MASTER上查看
ip a | grep 10.0.0.100
# 预期:MASTER持有VIP
# 停止MASTER keepalived后测试切换
sudo systemctl stop keepalived
# 在BACKUP上查看
ip a | grep 10.0.0.100
# 预期:BACKUP持有VIP
关键命令解释#
virtual_router_id:同一组VRRP实例标识,主备必须一致。priority:优先级,数值越大越优先成为MASTER。preempt_delay:MASTER恢复后延迟抢占,避免频繁切换。track_script:脚本返回非0则降低权重,触发切换。option httpchk:HAProxy对后端执行HTTP健康检查。
故障排查与常见问题#
1) VIP不漂移
# 检查VRRP组播/单播是否被拦截
tcpdump -ni eth0 vrrp
# 预期:看到VRRP报文(proto 112)
2) Keepalived状态异常
journalctl -u keepalived -f
# 关注"Entering MASTER/BACKUP"及脚本返回码
3) HAProxy健康检查误判
# 验证后端健康URL
curl -I http://10.0.0.11/health
# 若非200,调整httpchk路径或应用健康接口
4) 脑裂风险
- 确保主备网络互通,VRRP报文可达。
- 若交换机禁用了组播,可改用单播模式(keepalived支持unicast配置)。
演练与练习#
1) 切换演练
- 停止MASTER的haproxy进程:sudo systemctl stop haproxy
- 观察BACKUP是否接管VIP,并访问 http://10.0.0.100。
2) 健康检查调整
- 将 httpchk 修改为 /status,并在后端提供该接口。
- 观察 HAProxy stats 或日志确认状态变化。
3) 负载均衡策略对比
- 将 balance roundrobin 改为 leastconn,比较并发高时分发效果。
4) 故障恢复
- 恢复MASTER服务后观察是否回切,调整 preempt_delay 验证效果。