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、安装
将下载的安装包上传至服务器。
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
cd conf
vi haproxy.cfg
配置内容
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:此选项只能在
frontend
和listen
部分进行定义,用于定义一个或几个监听的套接字。
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
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg
可能会出现以下的提示:
[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.
可以用如下办法解决:
sudo vi /etc/profile
在最后增加一行内容:
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/xxx
,Haproxy
会将请求转发到对应的后端真实服务器http://172.16.122.104~6:10900/xxx
,多次调用可以看到是轮询的效果。
网友评论