文章目录
HAProxy的安装和配置文件详解
参考视频:B站
简介
HAProxy是一款开源的、高性能的、基于TCP(第四层)和HTTP(第七层)应用的负载均衡软件,借助HAProxy可以快速、可靠地提供基于TCP和HTTP应用的负载均衡解决方案。HAProxy作为一款专业的负载均衡软件,它的显著优点如下:
可靠性和稳定性非常好,可以与硬件级的F5负载均衡设备相媲美。
最高可以同时维护40000~50000个并发连接,单位时间内处理的最大请求数为20000个,最大数据处理能力可达10Gbps。作为软件级别的负载均衡来说,HAProxy的性能强大可见一斑。
支持多于8种负载均衡算法,同时也支持session保持。
支持虚拟主机功能,这样实现Web负载均衡更加灵活。
从HAProxy1.3版本后开始支持连接拒绝、全透明代理等功能,这些功能是其他负载均衡器所不具备的。
HAProxy拥有一个功能强大的服务器状态监控页面,通过此页面可以实时了解系统的运行状况。
HAProxy拥有功能强大的ACL支持,能给使用带来很大方便。
HAProxy是借助于操作系统的技术特性来实现性能最大化的,因此,在使用HAProxy时,对操作系统进行性能调优是非常重要的。在业务系统方面,HAProxy非常适用于那些并发量特别大且需要持久连接或七层处理机制的Web系统,例如门户网站或电商网站等。另外HAProxy也可用于Mysql数据库(读操作)的负载均衡。
1. 下载安装
下载地址:https://src.fedoraproject.org/repo/pkgs/haproxy/
[root@mysql01 ~]# ll
-rw-r--r-- 1 root root 3623854 7月 6 23:11 haproxy-2.4.17.tar.gz
# 解压
tar zxvf haproxy-2.4.17.tar.gz -C /opt
# 进去解压目录下使用 make 安装,可能是会报错,需要 C 语言的编译环境 yum install gcc gcc-c++ -y
make TARGET=linux2628 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
2. 准备配置文件
可以使用自带的配置文件拷贝一份或者自己编写
1️⃣ 拷贝
# 在 haproxy 解压目录下拷贝到指定目录下
cp examples/option-http_proxy.cfg /usr/local/haproxy/haproxy.cfg
2️⃣ 自己编写(百度)
[root@mysql01 haproxy-2.4.17]# cd /usr/local/haproxy/
[root@mysql01 haproxy]# ll
总用量 0
drwxr-xr-x 3 root root 21 7月 6 23:30 doc
drwxr-xr-x 2 root root 21 7月 6 23:30 sbin
drwxr-xr-x 3 root root 17 7月 6 23:30 share
# 创建配置文件
[root@mysql01 haproxy]# vim haproxy.cfg
global
# 日志
log 127.0.0.1 local0 info
# 最大连接数
maxconn 10240
daemon
defaults
# 应用全局的日志配置
log global
mode http
# 超时配置
timeout connect 5000
timeout client 5000
timeout server 5000
timeout check 2000
listen http_front # haproxy的客户页面
bind 192.168.169.101:8888 # HAProxy自己的IP地址
mode http
option httplog
stats uri /haproxy # 自定义页面的 url(即访问时地址为:192.168.169.101:8888/haproxy)
stats auth admin:123456 # 控制面板账号密码 账号:admin
stats refresh 5s
stats enable
3. 编写日志输出文件
vim /etc/rsyslog.d/haproxy.conf
$ModLoad imudp
$UDPServerRun 514
local0.* /usr/local/haproxy/logs/haproxy.log
&~
#开启远程日志
vim /etc/sysconfig/rsyslog
SYSLOGD_OPTIONS="-c 2 -r -m 0"
参数解析:
-c 2 使用兼容模式,默认是 -c 5。 -r 开启远程日志。
-m 0 标记时间戳。单位是分钟,为0时,表示禁用该功能。
# 使修改生效
systemctl restart rsyslog
4. haproxy 算法
-
HAProxy支持的负载均衡算法
(1)roundrobin:表示简单的轮询,负载均衡基础算法(静态web系统)(2)static-rr,表示根据权重(静态web系统)
(3)leastconn:表示最少连接者先处理(db系统)
(4)source:表示根据请求源IP(动态web系统)
(5)uri:表示根据请求的URI;
(6)url_param:表示根据请求的URl参数来进行调度
(7)hdr(name):表示根据HTTP请求头来锁定每一次HTTP请求;
(8)rdp-cookie(name):表示根据据cookie(name)来锁定并哈希每一次TCP请求。
-
常用的负载均衡算法
(1)轮询算法:roundrobin(2)根据请求源IP算法:source
(3)最少连接者先处理算法:lestconn
5. 配置文件详解
这里主要针对解压目录下的 examples/option-http_proxy.cfg
主要组成部分
HAProxy配置文件根据功能和用途,主要有5个部分组成,但有些部分并不是必须的,可以根据需要选择相应的部分进行配置。
-
global部分
用来设定全局配置参数,属于进程级的配置,通常和操作系统配置有关。
-
defaults部分
默认参数的配置部分。在此部分设置的参数值,默认会自动被引用到下面的
frontend
、backend
和listen
部分中,因此,如果某些参数属于公用的配置,只需在
defaults
部分添加一次即可。而如果在 frontend、backend 和 listen 部分中也配置了与defaults
部分一样的参数,那么defaults
部分参数对应的值自动被覆盖。 -
frontend部分
此部分用于设置接收用户请求的前端虚拟节点。
frontend
是在HAProxy1.3
版本之后才引入的一个组件,同时引入的还有backend
组件。通过引入这些组件,在很大程度上简化了HAProxy
配置文件的复杂性。frontend
可以根据ACL
规则直接指定要使用的后端backend
。 -
backend部分
此部分用于设置集群后端服务集群的配置,也就是用来添加一组真实服务器,以处理前端用户的请求。添加的真实服务器类似于LVS中的
real server
节点。 -
listen部分
此部分是
frontend
部分和backend
部分的结合体。在HAProxy1.3
版本之前,HAProxy
的所有配置选项都在这个部分中设置。为了保持兼容性,HAProxy
新的版本仍然保留了listen
组件的配置方式。目前在HAProxy
中,两种配置方式任选其一即可
1️⃣ global
global
log 127.0.0.1 local0 info
maxconn 4096
user nobody
group nobody
daemon
nbproc 1
pidfile /usr/local/haproxy/logs/haproxy.pid
参数解析:
参数 | 说明 |
---|---|
log | 全局的日志配置,local0 是日志设备,info 表示日志级别。其中日志级别有 err、warning、info、debug 四种可选。这个配置表示使用127.0.0.1上的 rsyslog 服务中的 local0 日志设备,记录日志等级为 info。 |
maxconn | 设定每个 haproxy 进程可接受的最大并发连接数,此选项等同于 Linux 命令行选项“ulimit -n” |
user/group | 设置运行haproxy进程的用户和组,也可使用用户和组的uid和gid值来替代 |
daemon | 设置HAProxy进程进入后台运行。这是推荐的运行模式。 |
nbproc | 设置HAProxy启动时可创建的进程数,此参数要求将 HAProxy 运行模式设置为“daemon”,默认只启动一个进程。根据使用经验,该值的设置应该小于服务器的CPU核数。创建多个进程,能够减少每个进程的任务队列,但是过多的进程可能会导致进程的崩溃。 |
pidfile | 指定HAProxy进程的pid文件。启动进程的用户必须有访问此文件的权限 |
2️⃣ defaults
defaults
mode http
retries 3
timeout connect 10s
timeout client 20s
timeout server 30s
timeout check 5s
参数解析:
参数 | 说明 |
---|---|
mode | 设置HAProxy实例默认的运行模式,有tcp、http、health三个可选值 |
tcp模式 | 在此模式下,客户端和服务器端之间将建立一个全双工的连接,不会对七层报文做任何类型的检查,默认为tcp模式,经常用于SSL、SSH、SMTP等应用。 |
http模式 | 在此模式下,客户端请求在转发至后端服务器之前将会被深度分析,所有不与RFC格式兼容的请求都会被拒绝。 |
health模式 | 目前此模式基本已经废弃,不在多说。 |
retries | 设置连接后端服务器的失败重试次数,连接失败的次数如果超过这里设置的值,HAProxy会将对应的后端服务器标记为不可用。此参数也可在后面部分进行设置。 |
timeout connect | 设置成功连接到一台服务器的最长等待时间,默认单位是毫秒,但也可以使用其他的时间单位后缀 |
timeout client | 设置连接客户端发送数据时最长等待时间,默认单位是毫秒,也可以使用其他的时间单位后缀。 |
timeout server | 设置服务器端回应客户度数据发送的最长等待时间,默认单位是毫秒,也可以使用其他的时间单位后缀。 |
timeout check | 设置对后端服务器的检测超时时间,默认单位是毫秒,也可以使用其他的时间单位后缀。 |
3️⃣ frontend
frontend www
bind *:80
mode http
option httplog
option forwardfor
option httpclose
log global
default_backend htmpool
这部分通过frontend关键字定义了一个名为“www”的前端虚拟节点
参数 | 说明 |
---|---|
bind | 此选项只能在frontend和listen部分进行定义,用于定义一个或几个监听的套接字。 bind的使用格式为:bind [<address>:<port_range>] interface <interface> 其中,address为可选选项,其可以为主机名或IP地址,如果将其设置为“*”或“0.0.0.0”,将监听当前系统的所有IPv4地址。port_range可以是一个特定的TCP端口,也可是一个端口范围,小于1024的端口需要有特定权限的用户才能使用。interface为可选选项,用来指定网络接口的名称,只能在Linux系统上使用。 |
option httplog | 在默认情况下,haproxy日志是不记录HTTP请求的,这样很不方便HAProxy问题的排查与监控。通过此选项可以启用日志记录HTTP请求。 |
option forwardfor | 如果后端服务器需要获得客户端的真实IP,就需要配置此参数。由于HAProxy工作于反向代理模式,因此发往后端真实服务器的请求中的客户端IP均为HAProxy主机的IP,而非真正访问客户端的地址,这就导致真实服务器端无法记录客户端真正请求来源的IP,而“X-Forwarded-For”则可用于解决此问题。通过使用“forwardfor”选项,HAProxy就可以向每个发往后端真实服务器的请求添加“X-Forwarded-For”记录,这样后端真实服务器日志可以通过“X-Forwarded-For”信息来记录客户端来源IP |
option httpclose | 此选项表示在客户端和服务器端完成一次连接请求后,HAProxy将主动关闭此TCP连接。这是对性能非常有帮助的一个参数。 |
log global | 表示使用全局的日志配置,这里的“global”表示引用在HAProxy配置文件global部分中定义的log选项配置格式。 |
default_backend | 指定默认的后端服务器池,也就是指定一组后端真实服务器,而这些真实服务器组将在backend段进行定义。这里的htmpool就是一个后端服务器组。 |
4️⃣ backend
backend htmpool
mode http
option redispatch
option abortonclose
balance roundrobin
cookie SERVERID
option httpchk GET /index.php
server web1 10.200.34.181:80 cookie server1 weight 6 check inter 2000 rise 2 fall 3
server web2 10.200.34.182:8080 cookie server2 weight 6 check inter 2000 rise 2 fall 3
这个部分通过 backend 关键字定义了一个名为“htmpool”的后端真实服务器组,在上面 “defaults”中也有定义
参数解析:
- option redispatch
此参数用于cookie保持的环境中。在默认情况下,HAProxy会将其请求的后端服务器的serverID插入到cookie中,以保证会话的SESSION持久性。而如果后端的服务器出现故障,客户端的cookie是不会刷新的,这就出现了问题。此时,如果设置此参数,就会将客户的请求强制定向到另外一个健康的后端服务器上,以保证服务的正常。
- option abortonclose
如果设置了此参数,可以在服务器负载很高的情况下,自动结束掉当前队列中处理时间比较长的链接。
- balance
此关键字用来定义负载均衡算法。目前HAProxy支持多种负载均衡算法,常用的有如下几种:
- roundrobin:是基于权重进行轮叫调度的算法,在服务器的性能分布比较均匀的时候,这是一种最公平、最合理的算法。此算法经常使用。
- static-rr:也是基于权重进行轮叫的调度算法,不过此算法为静态方法,在运行时调整其服务器权重不会生效。
- source:是基于请求源IP的算法。此算法先对请求的源IP进行hash运算,然后将结果与后端服务器的权重总数相除后转发至某个匹配的后端服务器。这种方式可以使同一个客户端IP的请求始终被转发到某特定的后端服务器。
- leastconn:此算法会将新的连接请求转发到具有最少连接数目的后端服务器。在会话时间较长的场景中推荐使用此算法,例如数据库负载均衡等。此算法不适合会话较短的环境中,例如基于HTTP的应用。uri:此算法会对部分或整个URI进行hash运算,再经过与服务器的总权重相除,最后转发到某台匹配的后端服务器上。
- uri_param:此算法会根据URL路径中的参数进行转发,这样可保证在后端真实服务器数量不变时,同一个用户的请求始终分发到同一台机器上。
- hdr():此算法根据http头进行转发,如果指定的 http 头名称不存在,则使用 roundrobin 算法进行策略转发。
- cookie
表示允许向cookie插入SERVERID,每台服务器的SERVERID可在下面的server关键字中使用cookie关键字定义。
- option httpchk
此选项表示启用HTTP的服务状态检测功能。HAProxy作为一款专业的负载均衡器,它支持对backend部分指定的后端服务节点的健康检查,以保证在后端backend中某个节点不能服务时,把从frotend端进来的客户端请求分配至backend中其他健康节点上,从而保证整体服务的可用性。“option httpchk”的用法如下:
option httpchk <method> <uri> <version>
参数解析:
method:表示HTTP请求的方式,常用的有OPTIONS、GET、HEAD几种方式。一般的健康检查可以采用HEAD方式进行,而不是才采用GET方式,这是因为HEAD方式没有数据返回,仅检查Response的HEAD是不是200状态。因此相对与GET来说,HEAD方式更快,更简单。
uri:表示要检测的URL地址,通过执行此URL,可以获取后端服务器的运行状态。在正常情况下将返回状态码200,返回其他状态码均为异常状态。
version:指定心跳检测时的HTTP的版本号。
- server
这个关键字用来定义多个后端真实服务器,不能用于defaults和frontend部分。使用格式为:
server <name> <address>[:port] [param*]
参数解析:
<name>:为后端真实服务器指定一个内部名称,随便定义一个即可。
<address>:后端真实服务器的IP地址或主机名。
<port>:指定连接请求发往真实服务器时的目标端口。在未设定时,将使用客户端请求时的同一端口。
[param*]:为后端服务器设定的一系参数,可用参数非常多,这里仅介绍常用的一些参数:
check:表示启用对此后端服务器执行健康状态检查。
inter:设置健康状态检查的时间间隔,单位为毫秒。
rise:设置从故障状态转换至正常状态需要成功检查的次数,例如。“rise 2”表示2次检查正确就认为此服务器可用。
fall:设置后端服务器从正常状态转换为不可用状态需要检查的次数,例如,“fall 3”表示3次检查失败就认为此服务器不可用。
cookie:为指定的后端服务器设定cookie值,此处指定的值将在请求入站时被检查,第一次为此值挑选的后端服务器将在后续的请求中一直被选中其目的在于实现持久连接的功能。上面的“cookie server1”表示web1的serverid为server1。同理,“cookie server2”表示web2的serverid为server2。
weight:设置后端真实服务器的权重,默认为1,最大值为256。设置为0表示不参与负载均衡。
backup:设置后端真实服务器的备份服务器,仅仅在后端所有真实服务器均不可用的情况下才启用。
5️⃣ listen
listen admin_stats
bind 0.0.0.0:9188
mode http
log 127.0.0.1 local0 err
stats refresh 30s
stats uri /haproxy-status
stats realm welcome login\ Haproxy
stats auth admin:admin~!@
stats hide-version
stats admin if TRUE
这个部分通过 listen 关键字定义了一个名为“admin_stats”的实例,其实就是定义了一个 HAProxy 的监控页面
参数解析:
参数 | 说明 |
---|---|
stats refresh | 设置HAProxy监控统计页面自动刷新的时间。 |
stats uri | 设置HAProxy监控统计页面的URL路径,可随意指定。例如,指定“stats uri /haproxy-status”,就可以通过http://IP:9188/haproxy-status 查看。 |
stats realm | 设置登录HAProxy统计页面时密码框上的文本提示信息 |
stats auth | 设置登录HAProxy统计页面的用户名和密码。用户名和密码通过冒号分割。可为监控页面设置多个用户名和密码,每行一个。 |
stats hide-version | 用来隐藏统计页面上HAProxy的版本信息。 |
stats admin if TRUE | 通过设置此选项,可以在监控页面上手工启用或禁用后端真实服务器,仅在 haproxy1.4.9 以后版本有效。 |
6. 配置 systemctl 管理
# 注意配置自己的解压文件目录,配置文件目录
vim /usr/lib/systemd/system/haproxy.service
[Unit]
Description=HAProxy
After=network.target
[Service]
PIDFile=/usr/local/haproxy/logs/haproxy.pid
Type=forking
ExecStart=/opt/soft/haproxy/haproxy -f /usr/local/haproxy/haproxy.cfg
ExecStop=/usr/bin/kill `/usr/bin/cat /usr/local/haproxy/logs/haproxy.pid`
ExecReload=/opt/soft/haproxy/haproxy -f /usr/local/haproxy/haproxy.cfg -st `/usr/bin/cat /usr/local/haproxy/logs/haproxy.pid`
PrivateTmp=true
[Install]
WantedBy=multi-user.target