为什么需要Keepalived+HAProxy双活架构
单台负载均衡器是整个架构中最危险的单一故障点。一旦HAProxy进程崩溃或所在服务器宕机,后端所有业务将无法访问。Keepalived通过VRRP协议在多台节点间实现虚拟IP漂移,配合HAProxy的健康检查与负载分发能力,构建出自动故障切换的双活架构。这套方案部署成本低、切换速度快(通常1-3秒),是中小规模生产环境的首选高可用方案。
环境规划与网络拓扑
以两台HAProxy节点 + 三台后端Web服务器的架构为例:
# 节点规划
# HAProxy-Master: 192.168.1.10
# HAProxy-Backup: 192.168.1.11
# VIP: 192.168.1.100
# Web-01: 192.168.1.20
# Web-02: 192.168.1.21
# Web-03: 192.168.1.22
两台HAProxy服务器均配置Keepalived,Master节点持有VIP对外提供服务,Backup节点持续监听VRRP通告。Master故障时Backup在秒级接管VIP,客户端连接几乎无感知。
HAProxy配置详解
两台HAProxy节点的配置完全一致,关键配置项如下:
# /etc/haproxy/haproxy.cfg
global
log /dev/log local0
maxconn 4096
daemon
stats socket /var/run/haproxy.sock mode 660
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5s
timeout client 30s
timeout server 30s
retries 3
frontend http_in
bind *:80
bind *:443 ssl crt /etc/haproxy/certs/server.pem
http-request redirect scheme https unless { ssl_fc }
default_backend web_servers
backend web_servers
balance roundrobin
option httpchk GET /health HTTP/1.1
Host:\ localhost
http-check expect status 200
server web01 192.168.1.20:80 check inter 3s fall 3 rise 2 maxconn 256
server web02 192.168.1.21:80 check inter 3s fall 3 rise 2 maxconn 256
server web03 192.168.1.22:80 check inter 3s fall 3 rise 2 maxconn 256
几个需要注意的参数:
- inter 3s:健康检查间隔3秒,生产环境建议2-5秒,太短增加后端压力,太长故障发现延迟
- fall 3:连续3次检查失败才标记后端节点down,避免偶发网络抖动误判
- rise 2:连续2次检查成功才恢复节点,防止节点不稳定时反复上下线
- maxconn 256:单后端最大并发连接数,需根据后端服务器承载能力设置
Keepalived Master节点配置
# /etc/keepalived/keepalived.conf (Master)
global_defs {
router_id HAProxy_MASTER
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_haproxy {
script "/usr/bin/killall -0 haproxy"
interval 2
weight -20
fall 2
rise 1
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass MySecurePass2026
}
virtual_ipaddress {
192.168.1.100/24 dev eth0
}
track_script {
chk_haproxy
}
notify_master "/etc/keepalived/notify.sh MASTER"
notify_backup "/etc/keepalived/notify.sh BACKUP"
notify_fault "/etc/keepalived/notify.sh FAULT"
}
Keepalived Backup节点配置
# /etc/keepalived/keepalived.conf (Backup)
global_defs {
router_id HAProxy_BACKUP
}
vrrp_script chk_haproxy {
script "/usr/bin/killall -0 haproxy"
interval 2
weight -20
fall 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass MySecurePass2026
}
virtual_ipaddress {
192.168.1.100/24 dev eth0
}
track_script {
chk_haproxy
}
notify_master "/etc/keepalived/notify.sh MASTER"
notify_backup "/etc/keepalived/notify.sh BACKUP"
notify_fault "/etc/keepalived/notify.sh FAULT"
}
核心差异只有priority值:Master设100,Backup设90。当HAProxy进程挂掉时,chk_haproxy脚本的weight=-20会让Master优先级降到80,低于Backup的90,触发VIP漂移。
故障切换通知脚本
状态切换时发送告警是生产环境的基本要求:
#!/bin/bash
# /etc/keepalived/notify.sh
STATE=$1
HOSTNAME=$(hostname)
VIP="192.168.1.100"
case $STATE in
MASTER)
MSG="${HOSTNAME}已接管VIP ${VIP},成为主节点"
;;
BACKUP)
MSG="${HOSTNAME}释放VIP ${VIP},退为备份节点"
;;
FAULT)
MSG="${HOSTNAME}进入FAULT状态,请立即排查"
;;
esac
# 发送告警(示例:调用企业微信Webhook)
curl -s -X POST "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY" -H 'Content-Type: application/json' -d "{"msgtype":"text","text":{"content":"[Keepalived告警] ${MSG}"}}"
常见故障场景验证
部署完成后需要逐一验证以下场景:
场景1:Master节点HAProxy进程崩溃
# 在Master上模拟
systemctl stop haproxy
# 预期:2秒内chk_haproxy检测到,priority降20,Backup接管VIP
# 验证:在Backup上 ip addr show eth0 | grep 192.168.1.100
场景2:Master节点整机宕机
# 在Master上模拟
shutdown -h now
# 预期:Backup在advert_int*3(约3秒)内未收到VRRP通告,抢占VIP
场景3:后端Web服务器故障
# 停止web02的HTTP服务
ssh web02 systemctl stop nginx
# 预期:HAProxy在inter*fall(约9秒)内标记web02为down,流量自动分发到web01和web03
# 验证:echo "show stat" | socat stdio /var/run/haproxy.sock
场景4:脑裂问题
当Master和Backup之间的网络不通但两台服务器本身正常时,可能出现两台同时持有VIP的脑裂问题。解决方案:在Keepalived配置中增加unicast_peer和防火墙规则,确保VRRP通告只在指定对端间传递。同时配置arping检测,接管VIP前先探测该IP是否已有响应。
性能调优与安全加固
系统层面的内核参数优化:
# /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1 # 允许HAProxy绑定非本机IP
net.ipv4.tcp_tw_reuse = 1 # 复用TIME_WAIT连接
net.core.somaxconn = 32768 # 增大监听队列
net.ipv4.tcp_max_syn_backlog = 16384 # SYN队列长度
net.ipv4.tcp_fin_timeout = 15 # 缩短FIN超时
# 生效
sysctl -p
安全层面:限制VRRP通告仅在内网接口传播,用iptables过滤非授权VRRP包;auth_pass使用强密码;启用SELinux并配置合理的HAProxy策略。
架构扩展方向
当业务规模增长需要更多HAProxy节点时,可以引入三节点甚至五节点VRRP集群,priority值递减。后端服务器扩容只需在haproxy.cfg中添加server行并reload(HAProxy支持优雅reload,不丢弃已有连接)。对于跨机房容灾,可以配合DNS全局负载均衡(GSLB)实现异地双活,Keepalived负责机房内高可用,DNS负责机房级流量调度。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fu-wu-qi-gao-ke-yong-ji-qun-da-jian-keepalivedhaproxy/