haproxy服务介绍
@
HAProxy(High Availability Proxy)是一个高性能的TCP/HTTP负载均衡器和代理服务器,广泛用于提升Web应用的可用性和性能。
官网
功能和特点:
-
负载均衡:
- 支持多种负载均衡算法,例如轮询(Round Robin)、最少连接(Least Connections)、源地址散列(Source IP Hashing)等。
- 支持会话保持(Session Persistence),可以根据用户的会话信息将请求分配给同一个服务器。
-
高可用性:
- 支持健康检查(Health Checks),定期检测后端服务器的状态,自动将故障服务器从负载均衡池中移除。
- 支持主备模式(Active-Backup),可以在主服务器故障时自动切换到备用服务器。
-
性能优化:
- 高效的资源管理和事件处理机制,能够处理大量并发连接。
- 支持连接池和连接复用,减少连接建立和关闭的开销。
-
安全性:
- 提供SSL/TLS终止和加速功能,减少后端服务器的加密负担。
- 支持访问控制列表(ACL)和自定义的安全策略,保护应用免受恶意攻击。
-
灵活的配置:
- 配置文件简单且强大,支持复杂的路由和流量管理规则。
- 支持热加载配置,允许在不中断服务的情况下修改配置。
-
监控和统计:
- 提供详细的监控和统计信息,帮助管理员了解服务器的负载情况和运行状态。
- 支持多种日志格式和集成外部监控工具。
HAProxy 的工作原理
- HAProxy 是一个事件驱动的非阻塞引擎,结合了非常快速的 I/O 层使用基于优先级的多线程调度程序。由于它设计有数据考虑到转发目标,其架构经过优化,可以尽可能快地移动数据尽可能少的操作。它专注于优化 CPU通过尽可能长时间地保持与同一个 CPU 的连接来提高缓存的效率。因此,它实现了分层模型,在每个级别都提供了旁路机制确保数据不会在需要时到达更高层。大部分处理
在内核中执行,HAProxy 尽力帮助内核执行通过给出一些提示或避免某些操作来尽可能快地工作
当它猜测它们稍后可能会被分组时。因此,典型的数字显示15% 的处理时间花在 HAProxy 上,而 85% 的处理时间花在内核的 TCP 或HTTP 关闭模式,HAProxy 约占 30%,而 HTTP 模式下内核约占 70%保持活动模式。
搭建使用
实验环境Ubuntu2404
安装下载
apt install -y haproxy
systemctl enable --now haproxy
- /etc/haproxy/haproxy.cfg主配文件的全局参数说明
# 全局配置部分,对整个 HAProxy 进程生效
global
# 将日志信息发送到 /dev/log 设备文件,使用 local0 日志设施
log /dev/log local0
# 将日志信息发送到 /dev/log 设备文件,使用 local1 日志设施,仅记录 notice 及更高级别的日志
log /dev/log local1 notice
# 使用 chroot 机制,将 HAProxy 的运行根目录限制在 /var/lib/haproxy,增强安全性
chroot /var/lib/haproxy
# 创建一个用于获取 HAProxy 统计信息的 UNIX 域套接字,路径为 /var/lib/haproxy/stats
# 权限模式为 660(属主和属组有读写权限),需要 admin 级别权限访问
stats socket /var/lib/haproxy/stats mode 660 level admin
# 设置连接到统计套接字获取信息的超时时间为 30 秒
stats timeout 30s
# 指定 HAProxy 进程运行时使用的用户为 haproxy
user haproxy
# 指定 HAProxy 进程运行时使用的组为 haproxy
group haproxy
# 让 HAProxy 以守护进程的方式在后台运行
daemon
# 设置 HAProxy 所能接受的最大并发连接数为 4000
maxconn 4000
# 针对 SSL/TLS 配置,设置默认的 Diffie-Hellman 参数大小为 2048 位,增强安全性
tune.ssl.default-dh-param 2048
# 默认配置部分,为后续的前端、后端等配置提供默认设置
defaults
# 继承 global 部分定义的日志配置
log global
# 设置 HAProxy 的工作模式为 TCP 模式,适用于基于 TCP 的流量转发
mode tcp
# 启用 TCP 模式下详细的日志记录功能
option tcplog
# 不记录空连接的日志信息,减少不必要的日志量
option dontlognull
# 设置 HAProxy 尝试连接后端服务器的超时时间为 5 秒
timeout connect 5s
# 设置客户端连接的超时时间为 50 秒
timeout client 50s
# 设置与后端服务器交互的超时时间为 50 秒
timeout server 50s
# 当 HAProxy 将客户端请求转发到后端服务器出现故障时,最多重试 3 次
retries 3
开启HAProxy的界面UI
cat >> /etc/haproxy/haproxy.cfg << eof
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /var/lib/haproxy/stats mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
maxconn 4000
tune.ssl.default-dh-param 2048
defaults
log global
mode tcp
option tcplog
option dontlognull
timeout connect 5s
timeout client 50s
timeout server 50s
retries 3
listen stats
bind *:8080
stats enable
stats uri /huhy
stats refresh 10s
stats auth admin:123456
stats admin if TRUE
eof
参数含义
- bind *:8080:监听8080端口。
- stats enable:启用统计页面。
- stats uri /haproxy?stats:访问统计页面的URI(在本例中为http://<你的服务器IP>:8080/haproxy?stats)。
- stats refresh 10s:每10秒刷新一次页面。
- stats auth admin:adminpassword:设置访问统计页面的认证信息,用户名为admin,密码为123456。
- stats admin if TRUE:启用管理功能。
systemctl restart haproxy
界面访问:IP:8080/huhy


监听页面参数含义
-
Queue(队列)
Cur: 当前队列中的请求数
Max: 历史最大队列长度
Limit: 队列大小限制 -
Session rate(会话率)
Cur: 当前每秒新建会话数
Max: 历史最大每秒会话数
Limit: 会话率限制 -
Sessions(会话)
Cur: 当前活跃会话数
Max: 历史最大并发会话数
Limit: 最大会话数限制
Total: 总会话数 - 从启动至今处理的所有会话总数
LbTot: 负载均衡会话数 - 通过负载均衡算法分配的总会话数
Last: 最后会话时间 - 距离最后一个新会话建立的时间 -
Bytes(字节流量)
In: 输入字节数(客户端→HAProxy)
Out: 输出字节数(HAProxy→客户端) -
Denied(拒绝)
Req: 被拒绝的请求数(因安全规则等)
Resp: 被拒绝的响应数 -
Errors(错误)
Req: 请求错误数(客户端侧)
Conn: 连接错误数
Resp: 响应错误数(服务器侧) -
Warnings(警告)
Retr: 重试次数
Redis: 重新调度次数 -
Server(服务器状态)
Status: 服务器状态(UP/DOWN/MAINT)
LastChk: 最后一次健康检查结果
Wght: 服务器权重
Act: 活跃服务器数
Bck: 备份服务器数
Chk: 健康检查状态
Dwn: 宕机次数
Dwntme: 总宕机时间
Thrtle: 节流状态
配置负载均衡
一般用于高可用集群;可参考博文配置openstack高可用集群
vim /etc/haproxy/haproxy.cfg
#可根据服务自定义名称
listen openstack_mariadb_galera_cluster
# 绑定HAProxy监听的IP地址和端口
bind 192.168.200.154:3306
# 负载均衡算法,基于客户端源IP地址进行负载均衡
balance source
# 设置TCP模式,用于处理TCP连接
mode tcp
# 启用TCP日志记录
option tcplog
# 自定义日志格式
log-format "%ci:%cp [%t] %ft %b/%s %TR/%Tw/%Tc/%Tr/%Ta %ST %B %ts %D %ac/%fc/%bc/%sc/%rc %sq/%bq"
# 设置连接超时为5000毫秒(5秒)
timeout connect 5000ms
# 设置客户端连接超时为30000毫秒(30秒)
timeout client 30000ms
# 设置服务器连接超时为30000毫秒(30秒)
timeout server 30000ms
# 设置连接重试次数为3次
retries 3
# 定义后端服务器1,启用健康检查,检查间隔为2000毫秒(2秒),连续2次成功认为正常,连续5次失败认为不可用,限制最大连接数为100
server controller01 192.168.200.155:3306 check inter 2000 rise 2 fall 5 maxconn 100
# 定义后端服务器2,启用健康检查,检查间隔为2000毫秒(2秒),连续2次成功认为正常,连续5次失败认为不可用,限制最大连接数为100
server controller02 192.168.200.156:3306 check inter 2000 rise 2 fall 5 maxconn 100
# 定义后端服务器3,启用健康检查,检查间隔为2000毫秒(2秒),连续2次成功认为正常,连续5次失败认为不可用,限制最大连接数为100
server controller03 192.168.200.157:3306 check inter 2000 rise 2 fall 5 maxconn 100
# server后还可定义以下参数
# weight 100 服务器权重(负载均衡时有用)
# backup 标记为备份服务器(主服务器宕机时使用)
# disabled 初始禁用状态
负载均衡的算法有如下;可根据需求修改
-
balance roundrobin:轮询算法,将请求依次分配给后端服务器。
-
balance leastconn:最少连接数算法,将请求分配给当前连接数最少的服务器。
-
balance source:源地址散列算法,根据客户端的源 IP 地址进行负载均衡,确保同一客户端的请求总是分配到同一台服务器。
-
balance uri:URI 散列算法,根据请求的 URI 进行负载均衡,确保相同 URI 的请求总是分配到同一台服务器。
-
balance uri len:URI 长度散列算法,根据请求 URI 的长度进行负载均衡。
-
balance uri depth:URI 深度散列算法,根据请求 URI 的目录深度进行负载均衡。
-
balance url_param:URL 参数散列算法,根据指定的 URL 参数进行负载均衡。
-
balance rdp-cookie:RDP Cookie 散列算法,根据 RDP Cookie 进行负载均衡。
HAProxy 模式;得根据服务实际情况选择
- mode tcp:传输层模式,用于处理 TCP 连接。这是用于数据库、SMTP 等应用程序的最常见模式。
- mode http:应用层模式,用于处理 HTTP/HTTPS 流量。这允许使用 HTTP 特定的功能,如 URL 重写、负载均衡基于 HTTP 头或 Cookie 等。
- mode health:健康检查模式,用于为后端服务器执行健康检查。此模式通常用于专用健康检查实例,而不实际处理客户端流量。
配置web代理
配置了 HAProxy 作为前端代理服务器后,客户端只需要访问 HAProxy 的监听地址,而不需要直接访问真实的后端 Web 服务器。具体来说,客户端的请求将如下处理:
- 客户端发起 HTTPS 请求,目标地址是 HAProxy 的监听地址
- HAProxy 接收到请求后,根据配置的负载均衡算法(例如轮询 roundrobin)将请求转发给后端服务器之一(例如 192.168.1.101 或 192.168.1.102)。
- 后端服务器处理请求并返回响应给 HAProxy。
- HAProxy 再将响应转发回客户端。
http代理
vim /etc/haproxy/haproxy.cfg
frontend http_front
# 绑定 HAProxy 在所有 IP 地址的 80 端口上监听 HTTP 请求
bind *:80
# 设置 HTTP 模式
mode http
# 使用 HTTP 日志格式记录日志
option httplog
# 默认后端服务器组
default_backend http_back
backend http_back
# 设置 HTTP 模式
mode http
# 负载均衡算法,轮询分配请求
balance roundrobin
# 定义后端服务器,
# inter 2000:每隔 2000 毫秒进行一次健康检查。
# rise 2:连续 2 次健康检查成功,认为服务器正常。
# fall 3:连续 3 次健康检查失败,认为服务器不可用。
server web1 192.168.1.101:80 check inter 2000 rise 2 fall 3
server web2 192.168.1.102:80 check inter 2000 rise 2 fall 3
示例:通过haproxy配置代理openstack节点
| 主机 | IP |
|---|---|
| haproxy代理 | 192.168.200.190 |
| openstack | 192.168.200.195 |
vim /etc/haproxy/haproxy.cfg
frontend openstack_http_front
bind 192.168.200.190:80
mode http
option httplog
default_backend http_back
backend http_back
mode http
balance roundrobin
server controller 192.168.200.195:80/horizon check inter 2000 rise 2 fall 3
systemctl restart haproxy
访问haproxy节点IP

haproxy节点状态


浙公网安备 33010602011771号