在高可用架构中,HAProxy与Keepalived经常同时出现,但它们的职责边界并不相同。HAProxy负责接收客户端请求,并根据配置的负载均衡算法将请求转发到后端服务器池;Keepalived负责在多个负载均衡节点之间维护一个虚拟IP地址,当主节点故障时把IP漂移到备节点。如果只部署一台HAProxy,后端服务即使没有故障,HAProxy本身宕机也会导致所有流量中断,因此需要Keepalived来消除这个单点。

一、角色定位与工作原理差异
HAProxy是一款开源的TCP/HTTP负载均衡器,支持四层和七层代理。四层模式下它基于IP和端口进行转发,七层模式下还能解析HTTP报文,根据域名、路径、Cookie等条件做更细粒度的调度。它对后端服务器进行主动健康检查,例如通过TCP连接、发送HTTP请求并校验响应状态码,一旦某台后端异常就将其从可用列表中剔除,等恢复后再重新加入。
Keepalived的核心是VRRP协议实现,它不关心后端应用是否健康,只负责在多个节点之间协商虚拟IP归属。VRRP通过优先级选举主节点,主节点持有虚拟IP并响应ARP请求,备节点持续监听主节点的VRRP通告。如果主节点在规定时间内没有发送通告,备节点会认为主节点失效,立即接管虚拟IP。这个切换过程对客户端透明,客户端始终访问同一个虚拟IP。
从层级上看,HAProxy解决的是应用层流量分发问题,Keepalived解决的是网络层IP高可用问题。两者不在同一维度,因此直接对比谁更好并不合适,实际选型时更多是考虑如何组合。很多中小型集群会把两者部署在同一台机器上,形成负载均衡层的高可用方案。
二、健康检查与故障转移机制对比
HAProxy的健康检查对象是后端服务器,常见配置如下,它会对每个后端每2秒做一次HTTP检查,连续2次失败摘除,连续2次成功恢复:
backend web_backend
balance roundrobin
option httpchk GET /health
http-check expect status 200
server web1 192.168.0.1:80 check inter 2s fall 2 rise 2
server web2 192.168.0.2:80 check inter 2s fall 2 rise 2
上述配置只解决了后端故障,如果运行HAProxy的主机宕机或HAProxy进程异常退出,客户端请求就会失败。Keepalived的健康检查对象则是本机上的HAProxy进程,它通过一个自定义脚本周期性探测进程是否存活:
vrrp_script check_haproxy {
script "killall -0 haproxy"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
10.0.0.100
}
track_script {
check_haproxy
}
}
这里有两个关键参数:interval表示脚本执行间隔,weight表示脚本检测失败时对节点优先级的调整值。假设MASTER节点原本优先级为100,当HAProxy进程停止后,脚本连续失败,Keepalived会将其优先级降低20,变为80。如果备节点优先级为90,备节点就会抢占虚拟IP,完成故障转移。切换时间通常取决于advert_int和脚本执行间隔,一般在1到3秒之间。
相比之下,HAProxy摘除后端的时间受inter、fall、rise参数影响,通常配置为2到5秒。两者切换速度接近,但对象不同:一个摘除后端服务器,一个切换虚拟IP。生产环境中必须同时配置两类健康检查,才能覆盖完整故障链路。
三、组合部署的典型架构与配置
最常见的部署方式是两台服务器同时安装HAProxy和Keepalived,组成主备模式。两台机器的Keepalived配置基本相同,只是state和priority不同。主节点state为MASTER、priority为100,备节点state为BACKUP、priority为90。虚拟IP配置为业务统一入口,例如10.0.0.100。所有客户端通过这个虚拟IP访问服务,后端服务器只对HAProxy开放。
备节点的关键配置如下:
vrrp_script check_haproxy {
script "killall -0 haproxy"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
10.0.0.100
}
track_script {
check_haproxy
}
}
当主节点整体故障或HAProxy进程停止时,备节点会在数秒内接管虚拟IP,客户端几乎无感知。需要注意的是,VRRP默认通过组播地址224.0.0.18发送通告,部分云环境可能禁止组播,此时需要改为单播模式,明确配置对端IP。此外还要在防火墙上放行VRRP协议和SSH等管理端口,避免脑裂时两个节点同时持有虚拟IP。
脑裂是Keepalived方案中比较典型的问题。当主备节点之间的心跳链路中断,但主节点本身仍然正常时,备节点会误认为主节点故障而接管虚拟IP,导致两个节点同时对外提供服务。虽然可以通过认证口令和优先级抢占机制降低概率,但无法完全避免。对于数据一致性要求高的场景,还需要配合通知脚本来处理资源释放和日志记录。
四、选型对比与适用场景
如果业务只需要负载均衡和健康检查,不要求负载均衡器自身高可用,那么单独部署HAProxy即可满足。但正式生产环境几乎不会接受单点,因此Keepalived成为必备组件。两者不是竞争关系,而是各自承担不同职责。下面的对照表可以更直观地展示差异:
| 对比维度 | HAProxy | Keepalived |
|---|---|---|
| 主要功能 | 四层/七层负载均衡与反向代理 | 基于VRRP的虚拟IP高可用 |
| 健康检查对象 | 后端应用服务器 | 本机HAProxy或网络接口状态 |
| 故障转移对象 | 后端服务器列表 | 虚拟IP归属 |
| 能否独立消除自身单点 | 不能 | 能 |
| 流量是否经过 | 是,所有业务流量经过 | 否,只处理VRRP控制报文 |
| 切换速度 | 2至5秒,取决于健康检查参数 | 1至3秒,取决于VRRP通告间隔 |
对于Web应用、API网关、微服务入口等场景,推荐使用HAProxy加Keepalived的组合。如果已经有云厂商提供的负载均衡服务,云负载均衡本身具备高可用能力,可能不需要自建Keepalived,但HAProxy在七层路由、限流、改写请求等能力上仍有优势。对于数据库主从、消息队列等TCP层服务,HAProxy同样可以承担代理和故障检测,但要注意长连接和连接复用的配置。
总的来说,HAProxy解决的是把流量正确送到可用后端的问题,Keepalived解决的是虚拟IP始终有节点响应的问题。理解两者的工作层次后,就不会再纠结于二选一,而是根据架构需求把它们放到合适的位置。
HAProxyKeepalived高可用修改时间:2026-08-21 03:57:57