HAProxy和Keepalived高可用方案怎么选型搭配?

来源:编程网作者:书生头衔:草根站长
导读:本期聚焦于书生创作的《HAProxy和Keepalived高可用方案怎么选型搭配?》,敬请观看详情。同样是保障业务不中断,HAProxy和Keepalived在架构中的角色经常被混为一谈。HAProxy是负载均衡器,工作在四层或七层,通过健康检查把流量分发给可用的后端服务器;Keepalived本身并不转发业务流量,它基于VRRP协议在多台服务器之间维护一个虚拟IP,实现主备节点自动切换。两者解决的是不同层面的高可用问题:HAProxy解决后端服务不可用时的流量调度,Keepalived解决负载均衡器自身的单点故障。生产环境通常将两者组合使用,由Keepalived为HAProxy提供虚拟IP和故障转移,再由HAProxy负责后端流量分发。本文从工作原理、健康检查、切换速度和配置复杂度等角度进行对比,并给出常见的组合部署示例,帮助读者在实际选型时作出更合理的判断。

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

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成为必备组件。两者不是竞争关系,而是各自承担不同职责。下面的对照表可以更直观地展示差异:

对比维度HAProxyKeepalived
主要功能四层/七层负载均衡与反向代理基于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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。