haproxy自身不提供高可用,必须与keepalived配合通过vrrp协议抢占vip实现故障自动切换;仅配置haproxy.cfg中的后端健康检查无法避免haproxy单点故障。

HAProxy 本身不提供高可用(HA),它只是负载均衡器;真要实现“高可用”,必须和 Keepalived 配合,用 VRRP 协议抢 VIP。单独配 haproxy.cfg 再怎么调参,挂了就是单点故障。
为什么只改 haproxy.cfg 永远不是高可用
很多人以为把 backend 加上 check、inter、fall 就算“高可用”了——这只是后端服务健康检查,不是 HAProxy 自身的容灾。一旦运行 haproxy 的那台机器死机、内核 panic、磁盘满或 systemd 崩溃,整个入口就断了。
真正高可用的关键是:两台(或以上)HAProxy 服务器共享同一个虚拟 IP(VIP),主节点挂掉后,备节点 1~3 秒内自动接管该 IP 并继续响应流量。这个切换动作由 keepalived 完成,haproxy 只负责转发。
-
keepalived不代理任何请求,只管 VIP 生死和优先级仲裁 -
haproxy进程必须监听在0.0.0.0:80或*:80,不能绑定具体物理 IP,否则 VIP 切换后无法响应 - 两台 HAProxy 的
haproxy.cfg必须完全一致(除了可选的本地日志路径),否则分流逻辑错乱
Keepalived + HAProxy 最小可行配置
以两节点主备为例(IP:172.24.8.10 主 / 172.24.8.11 备,VIP:172.24.8.100):
在主节点 /etc/keepalived/keepalived.conf 中:
global_defs {
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.24.8.100/24
}
}
在备节点中仅改两项:state BACKUP 和 priority 90。
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 确保
interface名称真实存在(用ip link确认,不是ens33就别硬写) -
virtual_router_id主备必须相同,且在同一二层网络中不能冲突 - 启动前确认防火墙放行 VRRP 组播(
224.0.0.18,协议号 112),否则心跳收不到 - 启动顺序:先启
keepalived,再启haproxy(systemctl start keepalived haproxy)
HAProxy 自身必须规避的三个绑定陷阱
即使 keepalived 正常工作,如果 haproxy.cfg 里写了这些,VIP 切换后照样 503 或连接拒绝:
-
bind 172.24.8.10:80→ 必须改成bind *:80或bind 0.0.0.0:80 -
bind 127.0.0.1:80→ 本地回环绑不了 VIP,直接失效 - frontend 中用了
http-request set-src或tcp-request connection reject且依赖物理 IP 判断 → 切换后规则失效或误判
验证方式很简单:在主节点执行 ip addr show eth0,看到 172.24.8.100/24 在列;然后手动 systemctl stop keepalived,立刻在备节点执行同样命令,确认 VIP 已迁移。此时 curl http://172.24.8.100 应仍能通。
健康检查与 failover 的时间差必须对齐
keepalived 的故障检测(advert_int + fail 次数)和 haproxy 的后端健康检查(inter、fall)是两套独立机制,但用户感知的是整体不可用时长。若不对齐,会出现“VIP 切过去了,但新主上的 HAProxy 还在等后端超时才剔除坏节点”的情况。
- 建议
keepalived的advert_int 1+fail 3→ 最多 3 秒发现主挂 - 对应
haproxy的inter 1000(1s)、fall 3→ 后端探测也控制在 3 秒内失效 - 避免把
haproxy的timeout check设成 30s,否则 VIP 切过去后还要等半分钟才把坏后端踢掉
最易被忽略的一点:所有节点的系统时间必须严格同步(chronyd 或 ntpd),否则 keepalived 的 VRRP 报文会被当作延迟包丢弃,导致脑裂。










