个人博客


Haproxy是一款高性能的负载均衡软件。因为其专注于负载均衡这一些事情,因此与Nginx比起来在负载均衡这件事情上做得更好,更专业。

安装环境:4台Linux机,系统为CentOS 7.7。
Haproxy版本:1.8.25

ip作用
172.16.122.101部署Haproxy,代理真实服务器1、2、3
172.16.122.104真实服务器1,已经部署应用,并对外暴露http端口10900
172.16.122.105真实服务器2,已经部署应用,并对外暴露http端口10900
172.16.122.106真实服务器3,已经部署应用,并对外暴露http端口10900

1、下载安装Haproxy

1.1、下载

下载地址:https://src.fedoraproject.org/repo/pkgs/haproxy/
选择一个版本进行下载,这里我用的是haproxy-1.8.25.tar.gz版本。

1.2、安装

将下载的安装包上传至服务器。

1
2
3
4
5
6
tar -xvf haproxy-1.8.25.tar.gz
cd haproxy-1.8.25
make TARGET=linux31 # uname -r 查看下内核版本,centos7.x是linux31、centos6.x是linux26
sudo make install PREFIX=/usr/local/haproxy # 安装到指定路径
cd /usr/local/haproxy/
mkdir conf pid # 分别用来存放配置、进程文件

2、配置Haproxy

2.1、Haproxy配置文件组成

Haproxy 配置文件根据功能和用途,主要有 5 个部分组成,但有些部分并不是必须的, 可以根据需要选择相应的部分进行配置。

1、global 部分
用来设定全局配置参数,属于进程级的配置,通常和操作系统配置有关。

2、defaults 部分
默认参数的配置部分。在此部分设置的参数值,默认会自动被引用到下面的 frontend、backend 和 listen 部分中,因此,如果某些参数属于公用的配置,只需在 defaults 部分添加一次即可。而如果在 frontend、backend 和 listen 部分中也配置了与 defaults 部分一样的参数,那么defaults 部分参数对应的值自动被覆盖。

3、frontend 部分
此部分用于设置接收用户请求的前端虚拟节点。frontend 是在 Haproxy1.3 版本之后才引入的一个组件,同时引入的还有 backend 组件。通过引入这些组件,在很大程度上简化了 Haproxy 配置文件的复杂性。frontend 可以根据 ACL 规则直接指定要使用的后端。

4、backend 部分
此部分用于设置集群后端服务集群的配置,也就是用来添加一组真实服务器,以处理前端用户的请求。添加的真实服务器类似于 LVS 中的 real server 节点。

5、listen 部分
此部分是 frontend 部分和 backend 部分的结合体。在 Haproxy1.3 版本之前,Haproxy 的所有配置选项都在这个部分中设置。为了保持兼容性,Haproxy 新的版本仍然保留了 listen 组件的配置方式。目前在 Haproxy 中,两种配置方式任选其一即可。

2.2、Haproxy配置文件示例

创建配置文件 haproxy.cfg

1
2
cd conf
vi haproxy.cfg

配置内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
global
log 127.0.0.1 local0 debug
maxconn 4096
daemon
nbproc 1 # 进程数,创建多个进程,能够减少每个进程的任务队列,但是过多的进程可能会导致进程的崩溃
pidfile /usr/local/haproxy/pid/haproxy.pid
defaults
mode http
retries 3 # 连接后端服务器失败的次数如果超过这里设置的值,haproxy会将对应的后端服务器标记为不可用
timeout connect 10s
timeout client 20s
timeout server 30s
timeout check 5s
# 接入配置
frontend http_in
bind *:11000
mode http
option httpclose # 此选项表示在客户端和服务器端完成一次连接请求后,haproxy将主动关闭此TCP连接
default_backend http_in_forward
# 接出配置
backend http_in_forward
mode http
balance roundrobin
option abortonclose # 在服务器负载很高的情况下,自动结束掉当前队列中处理时间比较长的链接
server real_server1 172.16.122.104:10900 check inter 10000 rise 1 fall 3 weight 1
server real_server2 172.16.122.105:10900 check inter 10000 rise 1 fall 3 weight 1
server real_server3 172.16.122.106:10900 check inter 10000 rise 1 fall 3 weight 1

# 接入接出一起配置,相当于frontend和backend同时配置
listen http_in_config
bind *:12000
mode http
balance roundrobin
option httpclose # 此选项表示在客户端和服务器端完成一次连接请求后,haproxy将主动关闭此TCP连接
option abortonclose # 在服务器负载很高的情况下,自动结束掉当前队列中处理时间比较长的链接
server real_server4 172.16.122.104:10900 check inter 10000 rise 1 fall 3 weight 1
server real_server5 172.16.122.105:10900 check inter 10000 rise 1 fall 3 weight 1
server real_server6 172.16.122.106:10900 check inter 10000 rise 1 fall 3 weight 1

# 监控页面
listen admin_stats
bind *:11001
mode http
stats refresh 30s
stats uri /admin
stats realm welcome login\ Haproxy
stats auth admin:admin123
stats admin if TRUE # 通过设置此选项,可以在监控页面上手工启用或禁用后端真实服务器

global配置

log:全局的日志配置,local0是日志设备,debug表示日志级别。其中日志级别有err、warning、info、debug四种可选。这个配置表示使用127.0.0.1上的rsyslog服务中的local0日志设备,记录日志等级为debug

maxconn:设定每个haproxy进程可接受的最大并发连接数,此选项等同于Linux命令行选项"ulimit -n"

daemon:设置haproxy进程进入后台运行。这是推荐的运行模式。

nbproc:设置haproxy启动时可创建的进程数,此参数要求将haproxy运行模式设置为daemon,默认只启动一个进程。根据使用经验,该值的设置应该小于服务器的CPU核数。创建多个进程,能够减少每个进程的任务队列,但是过多的进程可能会导致进程的崩溃。

pidfile:指定haproxy进程的pid文件。启动进程的用户必须有访问此文件的权限。

defaults配置

mode:设置haproxy实例默认的运行模式,有tcp、http、health三个可选值。

retries:设置连接后端服务器的失败重试次数,连接失败的次数如果超过这里设置的值,haproxy会将对应的后端服务器标记为不可用。此参数也可在后面部分进行设置。

timeout connect:设置成功连接到一台服务器的最长等待时间,默认单位是毫秒,但也可以使用其他的时间单位后缀。

timeout client:设置连接客户端发送数据时最长等待时间,默认单位是毫秒,也可以使用其他的时间单位后缀。

timeout server:设置服务器端回应客户度数据发送的最长等待时间,默认单位是毫秒,也可以使用其他的时间单位后缀。

timeout check:设置对后端服务器的检测超时时间,默认单位是毫秒,也可以使用其他的时间单位后缀。

frontend配置

bind:此选项只能在frontendlisten部分进行定义,用于定义一个或几个监听的套接字。

option httpclose:此选项表示在客户端和服务器端完成一次连接请求后,haproxy将主动关闭此TCP连接。这是对性能非常有帮助的一个参数。

default_backend:指定默认的后端服务器池,也就是指定一组后端真实服务器,而这些真实服务器组将在backend段进行定义。这里的http_in_forward就是一个后端服务器组。

backend配置

balance:此关键字用来定义负载均衡算法。目前haproxy支持多种负载均衡算法,常用的有如下几种。

算法含义
roundrobin是基于权重进行轮询调度的算法,在服务器的性能分布比较均匀的时候,这是一种最公平、最合理的算法。此算法经常使用。
static-rr也是基于权重进行轮询的调度算法,不过此算法为静态方法,在运行时调整其服务器权重不会生效。
source是基于请求源 IP 的算法。此算法先对请求的源 IP 进行 hash 运算, 然后将结果与后端服务器的权重总数相除后转发至某个匹配的后端服务器。
这种方式可以使同一个客户端 IP 的请求始终被转发到某特定的后端服务器。
leastconn此算法会将新的连接请求转发到具有最少连接数目的后端服务器。在会话时间较长的场景中推荐使用此算法,例如数据库负载均衡等。
此算法不适合会话较短的环境中,例如基于 HTTP 的应用。
uri此算法会对部分或整个 URI 进行 hash 运算,再经过与服务器的总权重相除,最后转发到某台匹配的后端服务器上。
uri_param此算法会根据 URL 路径中的参数进行转发,这样可保证在后端真实服务器数量不变时,同一个用户的请求始终分发到同一台机器上。
hdr(<name>):此算法根据 http 头进行转发,如果指定的 http 头名称不存在,则使用 roundrobin 算法进行策略转发。

option abortonclose:如果设置了此参数,可以在服务器负载很高的情况下, 自动结束掉当前队列中处理时间比较长的链接。

server:这个关键字用来定义多个后端真实服务器,不能用于 defaults 和frontend部分。使用格式为:server <name> <address>[:port] [param*] 其中,每个参数含义如下:

check:表示启用对此后端服务器执行健康状态检查。

inter:设置健康状态检查的时间间隔,单位为毫秒。

rise:设置从故障状态转换至正常状态需要成功检查的次数,例如。“rise 2”表示 2 次检查正确就认为此服务器可用。

fall:设置后端服务器从正常状态转换为不可用状态需要检查的次数,例如,“fall 3”表示 3次检查失败就认为此服务器不可用。

weight:设置后端真实服务器的权重,默认为 1,最大值为 256。设置为 0 表示不参与负载均衡。

listen配置

stats refresh:设置haproxy监控统计页面自动刷新的时间。

stats uri:设置haproxy监控统计页面的URL路径,可随意指定。例如、指定stats uri /admin,就可以通过http://ip:port/admin查看。

stats realm:设置登录haproxy统计页面时密码框上的文本提示信息。

stats auth:设置登录haproxy统计页面的用户名和密码。用户名和密码通过冒号分割。可为监控页面设置多个用户名和密码,每行一个。

stats admin if TRUE:通过设置此选项,可以在监控页面上手工启用或禁用后端真实服务器,仅在haproxy1.4.9以后版本有效。

3、启动Haproxy

3.1、启动

执行以下命令,就可以启动Haproxy

1
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg 

可能会出现以下的提示:

1
2
[WARNING] 333/173319 (22617) : [/usr/local/haproxy/sbin/haproxy.main()] Cannot raise FD limit to 8214, limit is 4096.
[WARNING] 333/173319 (22617) : [/usr/local/haproxy/sbin/haproxy.main()] FD limit (4096) too low for maxconn=4096/maxsock=8214. Please raise 'ulimit-n' to 8214 or more to avoid any trouble.

可以用如下办法解决:

1
sudo vi /etc/profile

在最后增加一行内容:

1
ulimit -n 65536

保存退出,执行sudo source /etc/profile使其生效。这时候重新启动Haproxy就没问题了。

3.2、查看监控页面

浏览器打开http://172.16.122.101:11001/admin输入前面listen部分配置的账号密码登录。

管理页面
管理页面可以通过手动操作开启/禁用后端某台真实服务器。

3.3、负载均衡效果测试

postman调用http://172.16.122.101:11000/xxxHaproxy会将请求转发到对应的后端真实服务器http://172.16.122.104~6:10900/xxx,多次调用可以看到是轮询的效果。

参考链接