目录
1,Haproxy简介
1,核心功能与特点
二,搭建haproxy群集
1,准备工作
2,修改haproxy的配置文件
3,准备网站
4,配置日志
5,验证
1,Haproxy简介
HAProxy 是一款高性能的 开源负载均衡器 和 反向代理工具,主要用于高可用性架构中分配流量,支持 HTTP、TCP、SSL 等多种协议。它最初由法国工程师 Willy Tarreau 开发,目前由 HAProxy Technologies 维护,广泛应用于 Web 服务、数据库、消息队列等场景。
1,核心功能与特点
-
支持多种算法:轮询(Round Robin)、最少连接(Least Connections)、源地址哈希(Source Hash)、URI 哈希等,可根据业务需求灵活选择。
-
动态负载调整:实时监控后端服务器状态,自动剔除故障节点,恢复后重新加入集群,确保高可用性。
-
反向代理:接收客户端请求并转发至后端服务器集群,隐藏真实服务器地址,增强安全性。
-
高可用性与可靠性:支持 热更新:无需停机即可更新配置或升级程序,保证服务连续性。
应用场景
场景 | 说明 |
---|---|
Web 服务负载均衡 | 分发 HTTP/HTTPS 请求至多个 Web 服务器,提升吞吐量和容错能力。 |
数据库读写分离 | 将读请求分配至从库,写请求转发至主库,减轻主库压力。 |
微服务架构流量管理 | 在微服务集群中作为入口,路由请求至不同服务实例,并实现熔断、限流等功能。 |
静态资源加速 | 缓存静态文件(如图片、JS),直接返回给客户端,减少后端服务器响应压力。 |
工作原理
- 客户端请求:用户通过域名或 IP 访问 HAProxy 实例。
- 规则匹配:HAProxy 根据配置文件(
haproxy.cfg
)中的规则(如域名、路径、端口)匹配请求。 - 负载均衡算法:根据预设算法选择后端服务器(如轮询选择节点)。
- 健康检查:检查目标服务器是否可用,不可用则跳过并选择下一个节点。
- 转发请求:将请求转发至后端服务器,接收响应后返回给客户端。
2,haproxy的算法分类
-
轮询(Round Robin):按顺序依次将请求分配给后端服务器,
-
最少连接(Least Connections):动态将请求分配给当前连接数最少的服务器,平衡负载压力。
-
源地址哈希(Source IP Hash):根据客户端 IP 地址计算哈希值,将同一客户端的请求固定分配到同一服务器。
-
URI 哈希(URI Hash):根据请求的 URI(如
https://example.com/api/users
)计算哈希值,相同 URI 总是路由到同一服务器。 -
URI 路径哈希(URI Path Hash):仅根据 URI 的路径部分(如
/api/users
)计算哈希,忽略查询参数。 -
权重轮询(Weighted Round Robin):为每个服务器分配权重(如
server web1 192.168.1.10:80 weight 3
),按权重比例分发请求。 -
权重最少连接(Weighted Least Connections):结合权重与连接数,优先分配请求给 “权重 / 连接数” 比值最高的服务器。
HAProxy 的算法选择需结合业务特性、服务器配置和性能需求综合考虑。大多数场景下,roundrobin
(轮询)或 leastconn
(最少连接)即可满足需求;而对会话保持或缓存优化有特殊要求时,source
或 uri
算法更为合适。合理配置算法能显著提升系统吞吐量和稳定性。
二,搭建haproxy群集
1,准备工作
192.168.10.101 | haproxy |
192.168.10.102 | 服务器01 |
192.168.10.103 | 服务器02 |
2,修改haproxy的配置文件
globallog 127.0.0.1 local2chroot /var/lib/haproxypidfile /var/run/haproxy.piduser haproxygroup haproxydaemonmaxconn 4000defaultsmode httplog globaloption httplogoption dontlognullretries 3timeout http-request 5stimeout queue 1mtimeout connect 5stimeout client 1mtimeout server 1mtimeout http-keep-alive 5stimeout check 5smaxconn 3000listen hawebbind 0.0.0.0:80balance roundrobinoption httpchk GET /index.htmlserver web1 192.168.10.102:80 check inter 2000 fall 3server web2 192.168.10.103:80 check inter 2000 fall 3
3,准备网站
systemctl stop firewalld
setenforce 0##准备两台服务器网站
vim /var/www/html/index.html
serever1 102vim /var/www/html/index.html
serever1 103
4,配置日志
[root@localhost ~]# vim /etc/haproxy/haproxy.cfg
global #全局log 127.0.0.1 local2 #日志/日志设备log 127.0.0.1 local3 #添加新的日志设备 vim /etc/rsyslog.d/haproxy.conf #日志路径
$ModLoad imudp
$UDPServerRun 514
local3.* /var/log/haproxy.log
&~ systemctl restart haproxy
systemctl restart rsyslog
5,验证
[root@server1 ~]# curl 192.168.10.101
server1 102
[root@server1 ~]# curl 192.168.10.101
server2 103##查看日志
[root@haproxy /]# cat /var/log/haproxy.log
May 30 11:36:55 localhost haproxy[5008]: 192.168.10.1:62311 [30/May/2025:11:36:55.457] haweb haweb/web1 0/0/0/0/0 200 238 - - ---- 1/1/0/0/0 0/0 "GET /index.html HTTP/1.1"
May 30 11:36:55 localhost haproxy[5008]: 192.168.10.1:62311 [30/May/2025:11:36:55.609] haweb haweb/web2 0/0/1/0/1 200 238 - - ---- 1/1/0/0/0 0/0 "GET /index.html HTTP/1.1"
May 30 11:36:55 localhost haproxy[5008]: 192.168.10.1:62311 [30/May/2025:11:36:55.756] haweb haweb/web1 0/0/0/1/1 200 238 - - ---- 1/1/0/0/0 0/0 "GET /index.html HTTP/1.1"
May 30 11:36:55 localhost haproxy[5008]: 192.168.10.1:62311 [30/May/2025:11:36:55.901] haweb haweb/web2 0/0/0/1/1 200 238 - - ---- 1/1/0/0/0 0/0 "GET /index.html HTTP/1.1"
May 30 11:36:56 localhost haproxy[5008]: 192.168.10.1:62311 [30/May/2025:11:36:56.034] haweb haweb/web1 0/0/0/0/0 200 238 - - ---- 1/1/0/0/0 0/0 "GET /index.html HTTP/1.1"
May 30 11:47:01 localhost haproxy[5008]: 192.168.10.102:51498 [30/May/2025:11:47:01.945] haweb haweb/web2 0/0/0/1/1 200 238 - - ---- 1/1/0/0/0 0/0 "GET / HTTP/1.1"