目录
一、HAproxy
一、概念
HAProxy 是一款 开源、高性能的负载均衡与反向代理工具,基于 C 语言 开发,支持 四层(传输层) 和 七层(应用层) 流量处理,广泛用于高并发场景下的服务调度、流量分发和系统高可用性保障。
- 核心定位:介于客户端和后端服务器之间的中间层,将客户端请求均匀分配到多个后端服务器,同时监控服务器状态,确保请求高效、可靠地处理。
- 官网:www.haproxy.org
二、核心作用
- 负载均衡(Load Balancing)
- 将客户端请求按预设算法(如轮询、最少连接、源 IP 哈希等)分发到多个后端服务器,避免单点压力过大,提升系统吞吐量。
- 高可用性(High Availability)
- 通过 健康检查(如定期发送心跳包)实时监测后端服务器状态,自动隔离故障节点,待节点恢复后重新纳入负载均衡池,保障服务连续性。
- 会话保持(Session Persistence)
- 基于 Cookie、源 IP 或请求头 等信息,将同一用户的请求固定路由到同一后端服务器,确保会话状态一致(如登录用户的请求始终由同一服务器处理)。
- 协议处理与转发
- 四层代理:处理 TCP/UDP 流量,基于 IP + 端口转发(如数据库、Redis 服务)。
- 七层代理:解析 HTTP/HTTPS 协议,基于 URL、Header、Cookie 等应用层信息精细化路由(如 Web 服务、API 网关)。
- 流量优化与安全
- 支持 HTTP 压缩、SSL 卸载(HTTPS 解密)、请求缓存,减少服务器负载;
- 提供基本的 ACL(访问控制列表),阻挡恶意流量(如限制特定 IP 访问)。
三、主要功能特性
特性 | 说明 |
---|---|
多模式支持 | - TCP 模式(四层):适用于任意基于连接的协议(如 MySQL、MQ); - HTTP 模式(七层):支持 HTTP/HTTPS 协议解析与处理。 |
负载均衡算法 | 支持轮询(Round Robin)、最少连接(Least Connections)、源 IP 哈希(Source Hash)、URI 哈希等多种算法。 |
健康检查机制 | 支持 HTTP/HTTPS、TCP、ICMP 等协议的健康检查,可自定义检查频率、超时时间。 |
动态配置与热更新 | 支持通过配置文件或 API 动态调整后端服务器列表,无需重启服务即可生效。 |
监控与统计 | 内置 stats 页面,实时展示请求量、错误率、服务器状态等指标,便于运维监控。 |
连接管理优化 | 支持连接复用(Keep-Alive)、连接队列管理,减少 TCP 三次握手开销,提升并发性能。 |
四、应用场景
- Web 服务负载均衡
- 作为 Web 服务器(如 Nginx、Tomcat)的前端代理,按 URL 路径、用户地域等规则分流请求。
- API 网关与微服务架构
- 在微服务架构中,对 API 请求进行路由、流量控制和熔断处理,保障服务稳定性。
- TCP 协议服务代理
- 为数据库(如 MySQL、PostgreSQL)、消息队列(如 Kafka、RabbitMQ)提供四层负载均衡,提升连接效率。
- 混合架构中的中间层
- 常与 LVS(四层负载均衡) 结合使用:LVS 作为流量入口进行初步分发,HAProxy 作为二级代理进行七层精细化处理。
五、优势与特点
- 高性能:单台服务器可支持数万并发连接,吞吐量接近硬件负载均衡器(如 F5)。
- 轻量级与灵活性:配置简单,支持复杂路由逻辑,适合中小规模集群和复杂业务场景。
- 稳定性:在金融、电商等对可用性要求高的行业中广泛使用(如 GitHub、Spotify 等)。
- 开源免费:社区活跃,文档丰富,支持二次开发。
典型架构 :
客户端 <----> HAProxy(负载均衡与代理) <----> 后端服务器集群(Web/API/数据库)
↑
└── 健康检查 & 动态调度
二、 案例分析
1. 案例概述
HAproxy 是目前比较流行的群集调度工具,同类群集调度有很多,如LVS和Nginx.
LVS性能最好,但部署复杂;Nginx的upstream 模块支持群集功能但对群集节点健康检查功能不强,高并发性能没有HAproxy好。
2. 案例前置知识点
(1)HTTP 请求
通过 URL 访问网站使用协议是HTTP协议,称为HTTP请求。
请求方式常见为GET和POST方式。当访问时,会根据请求URL返回状态码。
关键步骤:
客户端发送 HTTP 请求(方法 + URL + Headers + Body)
负载均衡器根据调度算法选择后端节点
Web 服务器解析请求,访问缓存/数据库
生成响应(状态码 + Headers + HTML/JSON)
(2)负载均衡常用调度算法
算法 | 原理 | 适用场景 | 案例选择 |
---|---|---|---|
轮询 (RR) | 按序分配请求 | 服务器性能均衡 | 静态资源分发 |
加权轮询 (WRR) | 根据权重分配请求 | 服务器性能差异大 | Web 服务器集群 |
最小连接 (LC) | 优先选择当前连接数最少的节点 | 长连接服务(如数据库) | Redis 访问 |
IP 哈希 (SH) | 相同 IP 固定分配到同一节点 | 需要会话保持的场景 | 用户购物车 |
(3)常见的 web 群集调度器
类型 | 代表工具 | 工作层级 | 案例应用 | 特点 |
---|---|---|---|---|
四层调度器 | LVS | 传输层 | 入口流量分发 | 高性能,支持百万并发 |
七层调度器 | Nginx | 应用层 | HTTP/HTTPS 请求处理 | 支持 URL 重写、SSL 卸载 |
云原生调度 | Kubernetes Ingress | 应用层 | 容器化环境 | 自动扩缩容,服务发现 |
三、实验案例(HAproxy 搭建Web群集)
环境:Web:102 103 代理服务器:101
部署 :
#web部署
102 103:
dnf -y install httpd
systemctl stop firewalld
systemctl distable firewalld
setenforce 0
101:
echo "test2">/var/www/html/index.html
102:
echo "test3">/var/www/html/index.html
systemctl restart httpd
systemctl enable httpd
#HA代理部署
-测试网站 curl 192.168.10.102/103
-安装haproxy
dnf -y install haproxy
#日志文件 /var/log/messages
-配置文件
vim /etc/haproxy/haproxy.cfg
====================================
global
log 127.0.0.1 local2
chroot /var/lib/haproxy //禁锢目录
pidfile /var/run/haproxy.pid //pid文件,运行时生成
user haproxy //用户
group haproxy //用户组
daemon //守护进程
maxconn 4000 //最大连接数
defaults //默认模式,决定haproxy工作在哪一层
mode http
log global //日志记录为全局模式
option httplog //开启 HTTP 格式的日志记录
option dontlognull //不记录空值相关的日志
retries 3 //默认重试次数
timeout http-request 5s // HTTP 请求超时时间
timeout queue 1m //等待时间
timeout connect 5s //规定连接建立的超时时间
timeout client 1m //客户端连接的超时时间
timeout server 1m //服务器端连接的超时时间
timeout http-keep-alive 5s //持久连接超时时间
timeout check 5s //检查的超时时间
maxconn 3000 //最大并发连接数
#删除defaults下面内容
配置新内容------
listen myweb
bind 0.0.0.0:80 //监听所有网卡的80端口(haproxy 的端口取决于监听的服务端口是多少它就是多少)
option httpchk GET /index.html //通过发送请求到服务器来进行健康检查
balance roundrobin //负载均衡算法 为 轮询算法
server inst1 192.168.10.102:80 check inter 2000 fall 3
//用于服务器相关配置或监测
server inst2 192.168.10.103:80 check inter 2000 fall 3
#启动服务
systemctl start haproxy
#HA proxy 日志(默认在系统syslog日志中,不方便,单独定义出来)
配置文件
vim /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2
log 127.0.0.1 local3
配置Rsyslog服务
vim /etc/rsyslog.d/haproxy.conf //添加一个日志服务的配置文件
$ModLoad imudp
$UDPServerRun 514
local3.*/var/log/haproxy.log
&~ //标注参数的结束
重启
systemctl restart haproxy
systemctl restart rsyslog
测试日志信息
cat /var/log/haproxy.log
tail -f /var/log/haproxy.log (自动生成,重新访问网站会生成)
会显示日志信息