负载均衡解决方案-HAproxy
HAProxy(High Availability Proxy)是由法国人 Willy Tarreau 个人开发的基于 TCP、HTTP 协议实现的开源 L4-L7 软件负载均衡器,采用单进程和事件驱动模型实现,具有高可用和反向代理特性,支持双机热备与虚拟主机。目标是支持 10000+ 请求连接,为后端业务服务器集群提供高性能的负载均衡服务。适用于大连接数,要求会话保持,分发复杂的流量负载均衡场景。HAProxy以一种事件驱动、单一进程模型实现,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。它提供了高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

四层代理:HAProxy 采用 NAT 模式,在客户端和 Real Server 之间双向转发流量;
七层代理:HAProxy 通过分析、理解、修改应用层协议来实现更加 “智能” 的流量分发。
注:Real Server,实际处理客户端请求的业务服务器。
HAProxy is a free, very fast and reliable solution offering high availability, load balancing, and proxying for TCP and HTTP-based applications. It is particularly suited for web sites crawling under very high loads while needing persistence or Layer7 processing. Supporting tens of thousands of connections is clearly realistic with todays hardware. Its mode of operation makes its integration into existing architectures very easy and riskless, while still offering the possibility not to expose fragile web servers to the Net.
下图是HAProxy的架构:

HAProxy has been installed several times as an emergency solution when very expensive, high-end hardware load balancers suddenly failed on Layer 7 processing. Hardware load balancers process requests at the packet level and have a great difficulty at supporting requests across multiple packets and high response times because they do no buffering at all. On the other side, software load balancers use TCP buffering and are insensible to long requests and high response times. A nice side effect of HTTP buffering is that it increases the server's connection acceptance by reducing the session duration, which leaves room for new requests. New benchmarks will be executed soon, and results will be published. Depending on the hardware, expected rates are in the order of a few tens of thousands of new connections/s with tens of thousands of simultaneous connections.
应用特性
客户端侧长连接(Client-side Keep-alive)
TCP 加速(TCP Speedups)
响应池(Response Buffering)
RDP 协议
基于源的粘性(Source-based Stickiness)
更好的统计数据接口(A much better stats interfaces)
更详细的健康状态检测机制(More verbose health checks)
基于流量的健康评估机制(Traffic-based Health)
支持 HTTP 认证
服务器管理命令行接口(Server management from the CLI)
基于 ACL 的持久性(ACL-based Persistence)
日志分析器
性能优势
HAProxy 基于事件驱动(Event-Driven)、单一进程模型和 Ebtree 弹性二叉树机制,显著降低了上下文切换的开销及内存占用,根据官方文档介绍,HAProxy 可以跑满 10Gbps-New benchmark of HAProxy at 10 Gbps using Myricom’s 10GbE NICs (Myri-10G PCI-Express),作为软件级负载均衡是比较惊人的。多进程或多线程模型受内存限制、系统调度器限制以及无处不在的锁限制,很少能处理数千量级的并发连接。
基于事件驱动(Event-Driven):事务不会长时间占用 CPU,直到事件来临时,操作系统才会将事务唤醒。
单一进程模型:避免了多线程、多进程的上下文切换、模式切换以及调度器负载的性能开销。
Ebtree(Elastic Binary Tree,弹性二叉树机制)树形存储:是由 Willy Tarreau 自己发明的一种不平衡二叉搜索树数据结构,实现了以 O(log(N)) 的低开销来保持计时器命令、保持运行队列命令及管理轮询及最少连接队列,还实现了删除叶节点时保持 O(1) 的时间复杂度,但同时也放弃了树的平衡。
O(1) 事件检查器(Event Checker):允许其在高并发连接中对任何连接的任何事件实现即时探测。
单缓冲(Single Buffering)机制:能以不复制任何数据的方式完成读写操作,这会节约大量的 CPU 时钟周期及内存带宽。
借助于 Linux 2.6(>=2.6.27.19)上的 splice() 系统调用,HAProxy 可以实现零复制转发(Zero-copy Forwarding),在 Linux 3.5 及以上的操作系统中还可以实现零复制启动(Zero-Starting)。
内存分配器在固定大小的内存池中可实现即时内存分配,这能够显著减少创建一个会话的时长。
优化的 HTTP Header 分析:优化协议头分析功能避免了在 HTTP Header 分析过程中重复读取任何内存区域。
精心地降低了昂贵的 Linux 系统调用,减少模式切换开销,大部分工作都在用户空间完成,如时间读取、缓冲聚合及文件描述符的启用和禁用等。
会话保持
HAProxy 为来自同一客户端的请求访问实现了三种会话保持方案:
SOURCE_IP:HAProxy 将客户端的 SOURCE IP 进行 Hash 计算并保存,由此确保相同 IP 访问时被转发到同一台 Real Server 上。
Cookie:HAProxy 依靠 Real Server 发送给客户端的 Cookie 信息进行会话保持
Session:HAProxy 保存 Real Server 的 Session 及服务器标识
健康检查
HAProxy 使用 Health Check 来确定 Backend Real Server 能不能处理分发的客户端请求,这避免了运维人员在 Real Server 不可用时需要人工移除。默认的 Health Check 方法是尝试和 Real Server 建立 TCP 连接,比如:检查 Real Server 是否在预设的 IP:Port 上进行监听。HAProxy 允许手动配置 Health Check 方法,有 TCP,HTTP,PING 三种方式。
当 Real Server 被检查失败时,HAProxy 会自动禁用它,客户端请求不会分发到该 Real Server,直到它重新激活位置。
配置文件
HAProxy 的配置文件为 /etc/haproxy.cfg,主要由 5 部分组成:
global:全局配置参数,属于进程级配置,通常与操作系统配置相关。
defaults:默认配置参数,此部分的设置参数值默认会自动被引用到 frontend、backend 和 listen,属于公用的配置参数部分。如果 default 的配置参数与后面几个部分的私有配置参数冲突,则优先私有配置参数。
frontend(前端):设置接收客户端请求的前端虚拟节点(LB 服务器),允许根据 ACL 规则直接指定 backend。
backend(后端):配置后端服务器集群,也就是一组处理客户端请求的 Real Server。
listen:是 frontend 部分和 backend 部分的结合体,在较新版本的版本中 listen section 是可选的。
负载均衡策略
roundrobin:简单轮询
static-rr:权重轮询
leastconn:最少连接数优先
source:请求源主机 IP 地址
uri:请求 URI
url_param:请求 URl 的参数
hdr(name):根据 HTTP Request Hander 锁定每一次 HTTP 请求
rdp-cookie(name):根据据 Cookie 锁定并哈希每一次 TCP 请求
ACL 规则
HAProxy 支持基于 ACL 规则的分发策略:
通过 ACL 规则检查客户端请求是否合法
符合 ACL 规则的客户端请求被提交到指定 backend
ACL 规则经常被用到 frontend section,使用方式:
acl <acl_name> <acl_method> -i [匹配的路径或文件]
acl_name:自定义名称
<acl_method>:hdr_reg(host)、hdr_dom(host)、hdr_beg(host)、url_sub、url_dir、path_beg、path_end etc.
[匹配的路径或文件]:支持使用正则表达式,如:.html .jpg .gif
EXAMPLE:
acl www_policy hdr_reg(host) -i ^(www.freeoa.net|freeoa.net)
acl bbs_policy hdr_dom(host) -i bbs.freeoa.net
acl url_policy url_sub -i buy_sid=
use_backend server_www if www_policy
use_backend server_app if url_policy
use_backend server_bbs if bbs_policy
default_backend server_cache
常与 ACL 规则一起使用配置参数有 use_backend 和 default_backend,两者均用于指定 backend。
use_backend:满足 ACL 规则的客户端请求就转发至该 backend
default_backend:没有满足 ACL 规则的客户端请求转发至该 backend
Web 监控平台
HAProxy 支持基于 Web 的监控平台,可以查看 frontend 和 backend 的运行状态,当出现故障时,会通过不同颜色来展示故障信息,解决了故障报警问题。
[绑定vip问题]
haproxy备机上无法监听vip,因为vip在主机上。警告如下:
[ALERT] 173/104564 (2626) : Starting proxy mtkvip: cannot bind socket [IP:Port]
解决方法:
修改内核参数:/etc/sysctl.conf
net.ipv4.ip_nonlocal_bind=1
保存结果并使之生效
sysctl -p
或者使用echo进去,前提是sysctl.conf文件中没有本条参数:
echo 'net.ipv4.ip_nonlocal_bind = 1'>>/etc/sysctl.conf
net.ipv4.ip_nonlocal_bind=1 意思是启动haproxy的时候,允许忽视VIP的存在
haproxy代理服务器同时也要打开内核的转发功能,如下参数:
net.ipv4.ip_forward = 1
最新版本:1.6
该版本包括了许多新特性和性能改进:
支持 SNI/NPN/ALPN 和 OCSP stapling 的原生 SSL;
支持 IPv6 和 UNIX sockets;
full HTTP keep-alive for better support of NTLM and improved efficiency in static farms;
HTTP/1.1 compression (deflate, gzip) to save bandwidth;
PROXY protocol versions 1 and 2 on both sides;
最新版本:1.8
HAProxy 1.8.0 正式版已发布。HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。主要更新内容如下:
默认情况下,如果任何进程死亡,master worker 将自动退出。
"thread-map"被移除,功能被合并到"cpu-map"中,该功能也支持进程范围和 cpu 范围,以便于配置。
现在可以通过 USE_SYSTEMD = 1 使用本地系统支持来构建 haproxy,并使用 -Ws(systemd-aware master-worker 模式)启动。
在响应中看到"Connection: close"标题时,HTTP / 2 将不再安排正常的连接关闭。
HTTP / 2 网关代码现可按要求正确地重新组合分割的 Cookie 标头。
完整更新内容请查看发行说明。
最新版本:2
v2.0 发布了。此版本为云原生和容器化环境带来了一些重要特性,并进一步提高了对现代架构集成的无缝支持。全动态 SSL 证书存储、本机响应生成器、TCP 上带有 syslog 的高级环形缓冲区日志,并带来了安全性增强以及改进的可观察性和调试功能。同时还带来了更多可自定义的错误处理以及与 HAProxy 的高性能log-format功能直接集成的新功能,这些功能使用户可以使用 HAProxy 强大的内置访存和转换器来构建复杂的字符串。主要新功能包括:
第 7 层网络重试:可以从第 7 层的另一台服务器重试失败的 HTTP 请求。
现在支持向 Prometheus 暴露 metric。
多语言可扩展性:HAProxy 1.7 中引入了流处理卸载引擎(SPOE,Stream Processing Offload Engine)和流处理卸载协议(SPOP,Stream Processing Offload Protocol),目标是使用任何编程语言创建构建在 HAProxy 上所必需的扩展。最初的例子都是基于 C 的,现在已经支持 C、.NET Core、Lua。
Traffic shadowing,可以将请求从一个环境镜像到另一个环境,这可以将一定比例的生产流量发送到测试或暂存环境,以在完全部署之前审核发布的情况。新的 Traffic Shadowing 守护进程被编写为流处理卸载代理(SPOA,Stream Processing Offload Agent),并利用 HAProxy 的 SPOE,允许使用任何编程语言扩展 HAProxy。
完全支持 gRPC,允许双向数据流,检测 gRPC 消息和记录 gRPC 流量。
此外还引入了 HAProxy Kubernetes Ingress 控制器和功能强大的 HAProxy 数据平面 API,它提供了一个用于配置和管理 HAProxy 的现代 REST API。另外在发布公告中还透露,HAProxy 2.1 将建立在 HAProxy 1.9 与 2.0 的基础之上,计划中的功能包括:
UDP 支持、OpenTracing、动态 SSL 证书更新
完整更新内容查看此处。
最新版本:3
v3.3于2025年12月上旬正式发布了,更新的功能如下:
1:Performance packages
实为新增了一种下载HAProxy包的方式,这个包基于 AWS-LC TLS库构建,在负载大的场景下性能会大幅度增强。
2:ACME 新增 DNS-01 校验
3.2 版本增加了 ACME 协议的支持,也就是说可以自动申请和续期 Let's Encrypt 证书了,不过那时候只支持 HTTP-01 验证,3.3 版本新增了 DNS-01 的支持。不过目前也只能支持单机的证书更新,而 HAProxy Fusion 可以进行集群证书管理。
3:SNI 自动化支持
作为反向代理或负载均衡,SNI 处理就是将原始请求的 HTTP host 头发送给后端服务器,旧版本 HaProxy 需要在 server 配置中自动设置 sni req.hdr(host) 参数配置 SNI。而 3.3 版本不用那么麻烦了,可以自己分析出 HTTP host 头然后设置 SNI。话说 Nginx 早就有这功能了。
4:Kernel TLS 支持
Kernel TLS 就是由 Linux 内核进行对称加密,可以将最消耗性能的加密操作卸载到内核完成。而且不用复制用户空间的数据就能完成加密解密。一方面能节省资源,其次运算速度更快。
5:增强了 OAuth 认证功能
在 2.5 版本,HAProxy 就支持验证 JWT(JSON Web Tokens),它是实现 OAuth的基础。以前版本需要 OAuth 验证提供方的公钥来校验,但公钥存储在证书中,需要用户手动来提取公钥,然后配置。而 3.3 版本可以让 HAProxy 自动提取出公钥,从而整个流程自动化了很多。
6:性能提升
如负载均衡算法在用户没指定的情况下,使用随机算法替代轮询,能够根据后端不同服务器性能进行调度。cpu-policy 现在默认为 performance 模式,现代服务器 CPU 分为性能核与能效核,而 HAProxy 负载均衡只会允许在性能核上,保障性能。
默认 option abortonclose 配置,客户端中止 HTTP 请求后,HAProxy 会中止处理,能够节省资源,这个应用场景很广。
这只是 3.3 版本部分性能提升点。
7:后端代理支持 QUIC 协议
3.3 版本可以通过QUIC协议使用HTTP/3连接
项目主页:http://haproxy.1wt.eu/