简介
HAProxy(High Availability Proxy)是一个开源的高性能负载均衡器和代理服务器,它广泛应用于Linux和其他类Unix系统。由法国开发者-威利塔罗(Willy Tarreau)在2000年使用C语言制作的一款开源软件,HAProxy最初是为了解决高可用性和负载均衡问题而开发的,因此它具有非常高的性能、稳定性和丰富的特性。它不仅支持HTTP和HTTPS协议,还能够处理TCP和UDP流量,适用于各种网络应用场景。
HAProxy是一款具备高并发、高性能的TCP/HTTP负载均衡器,支持基于cookie的持久性,自动故障切换,支持正则表达式及Web状态统计。
官方网站
HAProxy - The Reliable, High Perf. TCP/HTTP Load Balancerhttps://www.haproxy.org/
主要特点和功能
**负载均衡:**HAProxy提供了多种负载均衡算法,如轮询、加权轮询、最少连接数等,能够根据不同的需求将流量合理分配到后端服务器上。
**健康检查:**HAProxy能够定期检查后端服务器的健康状态,并根据预设的规则自动将流量重定向到健康的服务器。
**SSL/TLS终结:**支持对SSL/TLS的终结,可以在HAProxy服务器上对加密的请求进行解密,并将请求转发到后端的非加密服务器上。
会话保持: HAProxy能够根据客户端IP或cookie等方式保持会话,确保同一客户端的请求能够路由到同一个后端服务器上。
**反向代理:**可以作为反向代理服务器,接收客户端的请求并将其转发到后端的多个服务器上,同时隐藏了后端服务器的实际信息。
**动态配置:**支持热部署和动态配置更新,可以在运行时添加或删除后端服务器,而无需重启整个服务。
**日志和统计:**提供详细的日志记录和统计信息,可以实时监控服务的运行状态,帮助管理员进行故障排查和性能优化。
**支持多种协议:**除了HTTP和HTTPS外,还支持TCP和UDP等多种协议的负载均衡和代理。
工作模式
HAProxy主要有两种工作模式:
-
TCP模式:在客户端和服务器之间建立一个全双工的连接,不处理7层的报文。
-
HTTP模式:对客户端请求进行深度分析,处理HTTP协议,并根据需要进行会话保持和其他7层处理。
性能和可扩展性
HAProxy设计用于处理大量并发连接,能够在现代硬件上支持数以万计的并发连接。它的事件驱动模型和单一进程模型使得它能够高效地处理大量的网络流量,同时保持良好的稳定性和可扩展性。
负载均衡算法
静态算法
**static-rr(静态轮询):**基于权重的轮询调度,不支持运行时调整权重及后端服务器慢启动,适合服务器数量不限的场景。
first(最先):根据服务器在列表中的位置进行调度,不考虑权重,当第一台服务器的连接数达到上限时,新请求才会分配给下一台服务。
动态算法
**roundrobin(轮询):**默认调度算法,基于权重的动态调度算法,支持运行时调整权重及后端服务器慢启动,每个后端backend最多支持4095个后端服务器。
**leastconn(加权最少连接):**基于后端服务器最少连接优先调度的算法,支持运行时的权重调整及后端服务器慢启动;适合长连接的使用场景。
混合算法
**source:**源地址hash,基于客户端IP地址hash的算法,hash后被转发至后端服务器,后续相同IP地址的请求都将转发至同一后端服务器中。当后端服务器数量变化时,会导致大量用户的请求会转发至新后端服务器,默认为静态算法;可以通过hash-type选项转变为动态算法,一般使用在不插入cookie的TCP模式,可以给拒绝会话cookie的客户端提供最好的会话粘性,适用于session会话保持但不支持cookie和缓存的情况。
源地址hash有两种计算方式:取模法、一致性hash
**map-base取模法:**先对客户端IP地址进行hash计算,在基于服务器总权重进行取模,最终值决定将客户端请求转发至对应后端服务器。此方法为静态,不支持运行时权重调整及慢启动;该算法在服务器总权重发生变化时,会因总权重变化而导致调度结果的整体变更,该算法为hash-type默认算法。
**一致性hash:**该算法是动态算法,支持使用socat等工具进行运行时权重调整以及慢启动;该算法在服务器的总权重发生变化时,对调度结果的影响是局部的,不会产生大变化。
一致性hash使用的算法为hash环,它将一个0至2^32-1的hash值映射成一个环形空间,将服务器IP地址hash后模以2^32获得的值为该服务器在hash环上的位置,访问的客户端IP地址hash后模以2^32为客户端在hash环上的位置,hash后的值在[0-4294967295]之间,客户端会访问hash环上顺时针遇到的第一个服务器。当其中某个服务器上线或下线时,只会有一部分客户端访问的服务器会发生变化。
URI **:**基于用户请求的URI的左半部分或整个URI做hash,再将hash结果对总权重进行取模后,根据最终结果将请求转发到对应的后端服务器。
默认是静态算法,可以通过hash-type指定map-based和consistent,该算法基于应用层,所以只支持七层,不支持四层。
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
左半部分:/<path>;<params>
整个uri:/<path>;<params>?<query>#<frag>
**URL_param:**对用户请求的URL中的params部分中的一个参数 key 对应的 value值作hash运算,并与服务器总权重相模后,派发至指定服务器;搜索同一个数据就会被调度到同一个服务器,多用于购物平台,以确保来自同一个用户的请求始终发往同一个后端服务器;如果没有key,将按照roundrobin算法。
**HDR:**针对用户HTTP头部(header)请求中的指定信息做hash,与服务器总权重取模后,派发至指定服务器,若无有效值,则会使用roundrobin
基本配置信息
HAProxy的配置文件haproxy.cfg由两大部分组成:
**global:**全局配置段
进程及安全配置相关的参数
性能调整相关的参数
Debug参数
**proxies:**代理配置段
defaults:为frontend,backend,listen提供默认配置
frontend:前端
backend:后端
listen:同时拥有前端、后端的配置,配置简单,推荐生产使用
参数说明
global
| chroot | 锁定运行目录 |
| deamon | 以守护进程运行 |
| user,group,uid,gid | 运行HAProxy的用户身份 |
| stats socket | 套接字文件 |
| nbproc N | 开启的进程数,默认为一个(与nbthread互斥) |
| nbthread N | 指定HAProxy进程开启的线程数,默认为每个进程一个线程 |
| cpu-map N M | 绑定HAProxy进程至指定核心,将第N个进程绑定至M个核心 |
| maxconn N | 每个HAProxy进程的最大并发连接数 |
| maxsslconn N | 每个HAProxy进程使用ssl最大并发连接数,适用于配置证书的场景 |
| maxconnrate N | 每个进程每秒创建的最大连接数 |
| spread-checks N | 后端server状态check提前或延迟百分比时间,默认为0 |
| pidfile | 指定pid文件路径 |
log 127.0.0.1 local2 info | 定义全局的syslog服务器;需要日志服务器开启UDP协议,最多可以定义两个 |
---|
proxies
|------------------------------------|---------------------------------------------------------------------|
| option abortonclose | 当服务器负载过高时,自动结束当前队列中过久的连接,针对业务情况选择 |
| option redispatch | 当server ID对应的服务器下线后,强制定向到其他服务器,重新派发 |
| option http-keep-alive | 开启与客户端的会话保持 |
| option forwardfor | 透传客户端真实IP至后端服务器 |
| mode http | tcp | 设置默认工作类型 |
| timeout http-keep-alive 120s | session会话保持超时时间,此时间段内会转发至相同的后端服务器 |
| timeout connect 120s | 客户端请求从HAProxy到后端服务器的最长连接等待时间(TCP之前),默认单位ms |
| timeout server 600s | 客户端请求从HAProxy到后端服务器的请求处理超时时长(TCP链接之后)默认单位ms,如果超时,会出现502错误,建议将时间设置大些 |
| timeout client 600s | HAProxy与客户端的最长飞活动时间,默认单位ms,建议与timeout server保持相同 |
| timeout check 5s | 对后端服务器的状态检测 |
| default-server inter 1000 weight 3 | 指定后端服务器的默认权重 |
[defaults参数]