Haproxy的介绍以及配置示例

1.Haproxy介绍

HAProxy是一款开源、高性能的负载均衡软件,同时支持基于TCP的四层和基于HTTP的七层应用流量分发。

其核心优势在于大规模生产环境考验的可靠性与稳定性,能够作为高要求业务系统的首选基础组件。

性能层面,最高可同时维护40000至50000个并发连接,单机每秒请求处理能力达20000次,数据处理吞吐量可达10Gbps,足以应对海量流量冲击。

负载策略方面,支持8种以上动态与静态负载均衡算法,并提供完善的会话保持功能。此外还具备虚拟主机、连接拒绝、全透明代理等高级特性,适应复杂多变的网络拓扑。

运维管理层面,内置功能强大的实时服务器状态监控页面,帮助运维人员直观掌握后端健康状态;其灵活的ACL系统支持基于内容、源地址、方法等多维度的精细流量治理。

在业务适配方面,HAProxy尤其适用于电商、金融等并发量极高且依赖长连接或四/七层混合代理机制的Web系统。同时,它也能有效承担MySQL数据库读操作的负载均衡,在无需侵入应用层的前提下快速提升数据层的横向扩展能力。

2.Haproxy安装

复制代码
[root@Haproxy ~]# dnf install haproxy.x86_64 -y
[root@Haproxy ~]# systemctl enable --now haproxy
Created symlink /etc/systemd/system/multi-user.target.wants/haproxy.service → /usr/lib/systemd/system/haproxy.service.

3.Haproxy配置解析

3.1全局配置段

全局配置段的参数将被应用到全部运行 HAProxy的节点中,全局配置段并不针对具体的代理和负载均衡进行设置。所需要的配置也相对简单。

复制代码
global
daemon
maxconn   4000
Pidfile  /var/run/HAproxy.pid
user     HAproxy
group    HAproxy
stats    socket /var/lib/HAproxy/stats
log      127.0.0.1  ocal0

**daemon:**指定HAProxy以后台进程的形式运行。

**maxconn:**HAProxy代理允许的最大并行连接数,此处为4000,默认为2000。

**pidfile:**HAProxy的进程文件,此处为/var/run/haproxy.pid。

**user:**运行HAProxy的用户,此处为 HAproxy。

**group:**运行 HAproxy的用户属组,此处为 HAproxy。

**log:**设置HAProxy运行日志的输出设备,通常默认为本机的并默认记录 INFO级别的日志,用户可以将 HAProxy的日志输出到本机或者远程主机的日志设备上,并设置需要记录的日志级别,如 ERROR和 WARN。

3.2默认配置段

默认(default)配置段设置的参数会被haproxy.cfg的其他配置段继承,如frontend、backend和 listen配置段都会继承 default配置段参数,同时这些配置段也可以写default配置段的参数值。

复制代码
defaults
mode    http
log     global
option  httplog
option  dontlognull
retries 3
timeout  http-request 10s
timeout  queue 1m
timeout  connect 10s
timeout  client 1m
maxconn  10000
timeout  client 1m
timeout  server 1m
timeout  check 10s

**mode:**指定 HAProxy实例使用的连接协议,即源请求到后端服务器之间的连接协议,可能值为 HTTP和 TCP。对基于HTTP的 web应用服务,通常使用 HTTP模式,对于其他应用服务,通常使用 TCP模式。

**log:**指定日志地址和记录日志条目的 syslog/rsyslog日志设备,此处的 global表示使用 global配置段中设定的log值。

**option:**日志记录选项, httplog表示记录与 HTTP会话相关的各种属性值,包括 HTTP请求、会话状态、连接数、源地址以及连接时间等。dontlognull表示不记录空会话连接日志,即 HAProxy不会记录没有数据传输的会话连接日志,基于互联网的 web应用中不推荐使用dontlognull因为很多空会话连接可能包含有恶意行为,如恶意的端口漏洞扫描就是一种没有数据传输的空连接。 retries:在连接失败后重新尝试请求连接的次数,超过设置的尝试次数将认为连接失败。

**timeout:**设置各种请求、连接、响应的 Timeout时间,单位为秒(s)或者毫秒(m)。

**HTTP-Request:**等待客户端完整 HTTP请求的时间,此处为等待10s。

**queue:**设置删除连接和客户端收到503或服务不可用等提示信息前的等待时间,此处等待时间为10毫秒。

**connect:**设置等待服务器连接成功的时间,此处为等待10s。

**client:**设置允许客户端处于非活动状态,即既不发送数据也不接收数据的时间,此处为1毫秒。

**server:**设置服务器超时时间,即允许服务器处于既不接收也不发送数据的非活动时间,此处为1毫秒。

3.3Frontend配置

前端配置主要完成两个功能:一是配置监听客户端请求的 IP地址和端口;二是将监听到的客户端请求转发到指定的后端配置中进行负载均衡。

复制代码
frontend  WEB
bind  192.168.0.10:80
default_backend  app

HAProxy中允许配置多个前端,前端名称可以自定义,此处设置了名为 WEB的HAProxy前端,通过bind参数指定该前端监听的IP为192.168.0.10,端口为80,而该前端对应的后端名称是app,一旦前端监听到连接,就会将该连接直接转给名为app的后端处理,前端与后端是HAProxy配置中的关键部分,通常前端负责监听请求连接,后端负责负载均衡。

3.4Backend配置

后端配置主要实现两个主要功能:一是负载均衡调度算法的设置;二是设置最终响应请求的服务器池各个节点的IP地址和端口,并设置每个节点的健康检查方式。

复制代码
backend app
balance roundrobin
server appl 192.168.1.1:80 check
server app2 192.168.1.2:80 check
server app3 192.168.1.3:80 check inter 2s rise 4 fall 3
server app4 192.168.1.4:80 backup

HAProxy允许配置多个后端,并且每个后端都有一个前端与其对应,后端实例的名称可以用户自定义,但是一定要与对应前端中设置的后端名称一致。上述后端配置中,后端实例的名称是 app,采用 Round-Robin负载均衡算法,server行定义后端的真实服务器,服务器的名称为app1、app2、app3和 app4,这里的服务器名称并非真实的后端服务器主机名,而只是便于识别的自定义服务器名称,服务器的具体地址通过紧随其后的地址和端口号来确定。此外,在定义后端服务器的同时,通过check参数还可指定HAProxy对服务器的健康检查方式,上述配置中,后端服务器app3中的inter 2s指定了对app3进行健康检查的时间隔是2s,rise 4 表示 HAproxy对app3发起4次健康检查均正常则认为app3正常,3表示连续3次健康检查失败则认为app3己经故障,HAproxy后端配置中指定了负载均衡所采用的算法。

4.Haproxy的负载均衡算法

**Round-Robin(roundrobin):**与Keeplived的Round-Robin类似,使用这种算法服务请求会被轮询转发到服务器池中的每一个服务器上,而不去评估服务器的‰负载和处理能力,服务器池中的每个节点都被轮询转发请求。

**Static Round-Robin(static-rr):**与 Round-Robin一样轮询转发请求到每一个后端服务器,但是不允许对后端服务器进行动态加权设置,即服务器的权重是静态固定的,而由于权重静态固定,后端服务器池中的节点数目不受限。

**Least-connection(leastconn):**即最少连接数算法,与Keepalived的最少连接数算法类似,后端服务器活动连接数越多,则接收到的服务请求就越少,反之,则接收到的服务请求越多。

**Source(source):**该算法将请求中的源IP地址进行HASH后除以全部正常运行的后端服务器权重来决定接收服务请求的服务器,在这种算法中,同一个客户端(相同的源 IP地址)发出的请求会被固定转发给某一个固定的后端服务器。但是,如果服务器权重大小发生改变或者服务器数目出现变动,则响应该客户端请求的后端服务器会改变,因为这时的 HASH/Wight值已经改变。

**URL(url):**该算法将请求URL字符串进行HASH并除以全部正常运行的后端服务器权重来决定接收服务请求的服务器,在这种算法中,指向同一目标站点的服务请求会被固定转发到相同的后端服务器上。URL也称为基于目标地址的HASH负载均衡算法,主要用于Web Cache集群中,通过URL负载均衡算法,可以避免请求因为指向不同的cache服务器而导致缺页,而缺页会导致刷新 cache最终降低系统响应速率。

**URL Parameter(uri_param):**该算法通过查询源 HTTP请求报文中的某一字符串参数并将其进行 HASH后除以全部服务器权重来决定接收服务请求的服务器。如果HTTP报文中没有需要的参数,则默认使用Round_Robin算法

**Header Name(hdr):**该算法通过查询HTTP请求报文中的HEAD字段并将HASH后除以全部服务器权重来决定接收服务请求的服务器。如果报文中没有HEAD参数,则默认使用Round_Robin算法。

复制代码
在高可用集群配置中,为了实现服务的高可用,通常每个后端配置中都需要提供两个以上的后端服务器进行负载均衡。

5、HAProxy监控页面

HAProxy为每个监听代理提供了实时监控,并可以将监控参数以 GUI页而的形式呈现给用户。要使用HAProxy的GUI页面,需要在/etc/haproxy/haproxy.cfg配置文件中配置相应的监听参数,通常需要配置一个Listen置段(也可以是 Frontend或 Backend配置段)。

复制代码
[root@Haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen stats
    mode        http
    bind 0.0.0.0:4321
    stats       enable
    log         global
    stats       refresh   1
    stats uri   /status

通过 HTTP协议访问HAProxy的监控页面,最为常用的HAProxy监控页面配置如下:

复制代码
listen status      #定义一个listen,也可以放在frontend或backend段中
mode http        #使用协议
bind 192.168.142.110:8080 #监听地址和端口
stats enable       #启用信息统计功能
stats hide-version     #隐藏版本号
stats uri /HAproxy     #访问URL
stats realm HAProxy\Statistics #登录提示信息
stats auth admin:admin         #admin界面,验证成功后允许管理节点
stats refreah 10s              #页面刷新时间 
复制代码
(1)Queue
  cur:表示当前队列的请求数量。
  Max:表是当前队列最大的请求数量。
  Limit:表示队列的限制数量。

(2) Session rate
  Cur:每秒会话连接数量。
  Max:每秒会话数量最大值。囗 Limit:每秒会话数量的限制值。

(3) Sessions
  Total:总共会话数量。
  Cur:当前的会话数量。
  Max:最大会话数量。
  Limit;会话连接限制。
  Lbtot:选中一台服务器所用的总时间。
  Last:最后一次会话时间。

(4) Bytes
  In:网络会话输人字节数总量。
  Out:网络会话输出字节数总量。

(5) Denied
  Req:被拒绝的会话请求数量。
  Resp:拒绝回应的请求数量。

(6) Errors
  Req:错误的请求数量。
  Conn:错误连接数量。
  Resp:错误响应数量。

(7) Warnings
   Retr:重新尝试连接的请求数量。
   Redis:重新发送的请求数量。

(8) Server
  status:后端服务器状态,可以有 UP和 DOWN两种状状态。
  LastChk:持续检查后端服务器的时间。
  Wght:服务器权重。
  Act:活动后端服务器数量。
  Bck:后端备份服务器的数量。
  Down:状态为 Down的后端服务器数量。
  Downtime:服务器总的 Downtime时间。
  Throttle:状态 Backup变为 Active的服务器数量。
相关推荐
BHXDML2 小时前
VMware 安装 Ubuntu 24.04 详细步骤
运维·服务器·ubuntu
山北雨夜漫步2 小时前
Docker
运维·docker·容器
草莓熊Lotso2 小时前
Qt文件操作:QFile读写全解析
运维·开发语言·c++·人工智能·qt
一路往蓝-Anbo2 小时前
第 10 章:OpenAMP 实战——构建 M33 与 Linux 的 RPMsg 消息隧道
linux·运维·服务器·驱动开发·stm32·单片机·嵌入式硬件
Starry_hello world2 小时前
Linux 网络(6)
linux·运维·网络
i建模2 小时前
通过Hyprland事件查看器(如`wev`)修改物理按键的扫描码
linux·运维
_OP_CHEN3 小时前
【Linux系统编程】(三十八)进程信号拓展:可重入函数 /volatile/SIGCHLD 全解析
linux·运维·进程·c/c++·信号·可重入函数·volatile
papaofdoudou3 小时前
Linux内核任务调度时机总结
linux·运维·网络
开开心心_Every3 小时前
系统清理工具清理缓存日志,启动卸载管理
运维·服务器·网络·数学建模·电脑·excel·抽象代数