一、负载均衡概述
**负载均衡(Load Balance,简称 LB)**是一种服务或基于硬件设备实现的高可用反向代理技术。它将特定的业务(如 Web 服务、网络流量等)分担给一个或多个后端服务器,实现流量分担,从而提高业务的并发处理能力、保证高可用性,并方便后期的水平动态扩展。
1.1 为什么需要负载均衡
- 动态水平扩展:对用户无感知地增加服务器。
- 提升并发能力:解决单服务器性能瓶颈。
- 节约公网 IP:降低 IT 成本。
- 隐藏内部服务器 IP:提高内部服务器安全性。
- 配置简单、功能丰富、性能强劲:支持四层和七层负载,并发可达数万甚至数十万。
1.2 负载均衡类型
1.2.1 硬件负载均衡
- F5(美国 F5 网络公司)
- Netscaler(美国思杰公司)
- Array(华耀)
- AD-1000(深信服)
1.2.2 四层负载均衡
- 通过
IP + Port决定转发去向。 - 对流量进行 NAT 处理,转发至后端服务器。
- 记录 TCP/UDP 连接由哪台服务器处理,后续同一连接的流量都转发到该服务器。
- 常见软件:LVS(重量级)、Nginx(轻量级,可缓存)、HAProxy(模拟四层转发)。
1.2.3 七层负载均衡
- 通过虚拟 URL 或主机 IP 进行流量识别,根据应用层信息(如 HTTP 头部、URL)决定负载均衡策略。
- 代理客户端与后端服务器建立连接(如 Nginx 可代理前后端)。
- 常见软件:Nginx(基于 HTTP 协议)、HAProxy(支持会话保持、标记、路径转移等)。
1.2.4 四层与七层负载均衡的区别
| 对比项 | 四层负载均衡 | 七层负载均衡 |
|---|---|---|
| 分层位置 | 传输层及以下 | 应用层及以下 |
| 性能 | 无需解析报文内容,吞吐量高 | 可解析应用层内容(URL、Cookie、Header 等) |
| 原理 | 基于 IP + Port | 基于虚拟 URL 或主机 IP |
| 功能类比 | 类似于路由器 | 类似于代理服务器 |
| 安全性 | 无法识别 DDoS 攻击 | 可防御 SYN Cookie/Flood 攻击 |
二、HAProxy 简介
HAProxy 是法国开发者 Willy Tarreau 于 2000 年使用 C 语言开发的开源软件,是一款具备高并发(万级以上)、高性能的 TCP 和 HTTP 负载均衡器。它支持基于 Cookie 的持久性、自动故障切换、正则表达式及 Web 状态统计。
- 企业版网站 :HAProxy Technologies | Powering the World's Busiest Applications
- 社区版网站 :http://www.haproxy.org
- GitHub :HAProxy · GitHub
2.1 企业版与社区版功能对比
| 功能 | 社区版 | 企业版 |
|---|---|---|
| 高级 HTTP/TCP 负载平衡和持久性 | 支持 | 支持 |
| 高级健康检查 | 支持 | 支持 |
| 应用程序加速 | 支持 | 支持 |
| 高级安全特性 | 支持 | 支持 |
| 高级管理 | 支持 | 支持 |
| 24×7 支持服务 | 不支持 | 支持 |
| 实时仪表盘 | 不支持 | 支持 |
| VRRP 和 Route Health Injection HA 工具 | 不支持 | 支持 |
| ACL、映射和 TLS 票证密钥同步 | 不支持 | 支持 |
| 基于应用程序的高级 DDoS 和 Bot 保护 | 不支持 | 支持 |
| Bot(机器人)监测 | 不支持 | 支持 |
| Web 应用防火墙 | 不支持 | 支持 |
| HTTP 协议验证 | 不支持 | 支持 |
| 实时集群追踪 | 不支持 | 支持 |
三、HAProxy 安装与配置
3.1 安装
bash
# CentOS/RHEL
dnf install haproxy -y
查看版本
haproxy -v
3.2 配置文件结构
HAProxy 的配置文件 haproxy.cfg 由两大部分组成:
- global:全局配置段(进程、安全、性能、Debug 参数)
- proxies :代理配置段
defaults:为 frontend、backend、listen 提供默认配置frontend:前端,相当于 Nginx 的server {}backend:后端,相当于 Nginx 的upstream {}listen:同时拥有前端和后端配置,配置简单,生产推荐使用
3.3 global 配置示例
nginx
global
log 127.0.0.1 local2 # 定义全局 syslog 服务器
chroot /var/lib/haproxy # 锁定运行目录
pidfile /var/run/haproxy.pid # 指定 pid 文件
maxconn 100000 # 指定最大连接数
user haproxy # 运行用户
group haproxy # 运行组
daemon # 以守护进程方式运行
stats socket /var/lib/haproxy/stats # 指定套接字文件
3.4 多进程与多线程配置
nginx
global
nbproc 2 # 指定 work 进程数量
cpu-map 1 0 # 第一个 work 绑定第一个 CPU 核心
cpu-map 2 1 # 第二个 work 绑定第二个 CPU 核心
nbthread 2 # 指定每个进程的线程数量(与 nbproc 互斥)
maxsslconn 100000 # 每个进程 SSL 最大连接数
maxconnrate 100 # 每个客户端每秒建立连接的最大数量
3.5 proxies 配置详解
3.5.1 defaults 段
nginx
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
option http-keep-alive
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 120s
timeout client 600s
timeout server 600s
timeout http-keep-alive 60s
timeout check 10s
maxconn 3000
3.5.2 frontend 段
nginx
frontend lee-webserver-80
bind 172.25.254.100:80
mode http
use_backend lee-webserver-80-RS # 调用 backend 名称
3.5.3 backend 段
nginx
backend lee-webserver-80-RS
mode http
server web1 192.168.0.101:80 check inter 3s fall 3 rise 5
server web2 192.168.0.102:80 check inter 3s fall 3 rise 5
3.5.4 listen 段(简化配置)
nginx
listen webserver_80
bind 172.25.254.100:80
mode http
option forwardfor
server webserver1 192.168.0.101:80 check inter 3s fall 3 rise 5
server webserver2 192.168.0.102:80 check inter 3s fall 3 rise 5
3.6 socat 工具动态管理
Socat 是 Linux 下的多功能网络工具,可用于动态调整 HAProxy 后端服务器权重和状态。
bash
# 查看帮助
echo "help" | socat stdio /var/lib/haproxy/stats
查看集群状态
echo "show servers state" | socat stdio /var/lib/haproxy/stats
查看服务器权重
echo "get weight webcluster/web1" | socat stdio /var/lib/haproxy/stats
设置权重
echo "set weight webcluster/web1 1" | socat stdio /var/lib/haproxy/stats
下线服务器
echo "disable server webserver_80/webserver1" | socat stdio /var/lib/haproxy/stats
上线服务器
echo "enable server webserver_80/webserver1" | socat stdio /var/lib/haproxy/stats
四、HAProxy 调度算法
HAProxy 通过 balance 参数指定调度算法,可分为静态算法和动态算法两大类。
4.1 静态算法
静态算法在调度时不会考虑后端服务器的实时状态(如连接数、响应时间等),主要基于预设的规则或固定参数进行分配。
- static-rr :基于权重的轮询调度,不支持运行时动态调整权重(只支持 0 和 1)。
适用场景:后端服务器性能差异不大,且不需要动态调整权重的简单轮询场景。 - first :按服务器在配置中的顺序,选择第一个可用的服务器。
适用场景:简单的故障转移场景,当第一台服务器不可用时才使用第二台。
4.2 动态算法
动态算法会考虑后端服务器的实时状态(如连接数、响应时间等),根据当前负载情况智能分配请求。
- leastconn :最少连接数调度,将新连接分配给当前连接数最少的服务器。
适用场景:长连接场景(如数据库连接、WebSocket),确保连接数均衡。 - roundrobin :基于权重的轮询调度,支持动态调整权重,支持慢启动。
适用场景:最常用的算法,适用于大多数 HTTP 负载均衡场景,支持平滑的权重调整。
4.3 其他算法
除了静态和动态算法外,HAProxy 还提供了一些基于特定请求特征的调度算法,适用于更复杂的负载均衡场景。
4.3.1 source
source 算法根据客户端源 IP 地址进行哈希计算,将同一源 IP 的请求始终转发到同一台后端服务器。这能保证会话一致性,适用于需要保持会话状态的应用。
nginx
backend app_servers
mode http
balance source
server srv1 192.168.1.10:80 check
server srv2 192.168.1.11:80 check
4.3.2 uri
uri 算法根据请求的 URI(或 URI 的一部分)进行哈希计算,将相同 URI 的请求转发到同一台服务器。适用于缓存服务器或需要 URI 级会话保持的场景。
nginx
backend cache_servers
mode http
balance uri
server cache1 192.168.1.20:80 check
server cache2 192.168.1.21:80 check
4.3.3 url_param
url_param 算法根据 URL 查询参数的值进行哈希计算。可以指定参数名,将包含相同参数值的请求转发到同一台服务器。
nginx
backend api_servers
mode http
balance url_param user_id
server api1 192.168.1.30:80 check
server api2 192.168.1.31:80 check
4.3.4 hdr
hdr 算法根据 HTTP 请求头部的指定字段值进行哈希计算。例如,可以根据 X-Forwarded-For 或 Cookie 头部实现更精细的调度。
nginx
backend web_servers
mode http
balance hdr(X-Forwarded-For)
server web1 192.168.1.40:80 check
server web2 192.168.1.41:80 check
4.3.5 rdp-cookie
rdp-cookie 算法专门用于 RDP(远程桌面协议)会话的负载均衡,根据 RDP Cookie 来保持会话一致性。
nginx
backend rdp_servers
mode tcp
balance rdp-cookie
server rdp1 192.168.1.50:3389 check
server rdp2 192.168.1.51:3389 check
4.3.6 算法选择建议
- source:适用于需要基于客户端 IP 保持会话的场景,如状态应用。
- uri:适用于缓存服务器或需要 URI 级会话保持的场景。
- url_param:适用于需要根据 URL 参数进行调度的 API 服务。
- hdr:适用于需要根据 HTTP 头部进行精细调度的场景。
- rdp-cookie:专门用于 RDP 会话负载均衡。
五、HAProxy 高级功能
5.1 访问控制列表(ACL)
ACL 用于测试某些条件并根据测试结果执行操作(如选择后端服务器、拒绝请求等)。
5.1.1 ACL 匹配模式
- hdr:HTTP 头部匹配
- path:URL 路径匹配
- url:整个 URL 匹配
- dst / dst_port:目标 IP/端口匹配
- src / src_port:源 IP/端口匹配
5.1.2 ACL 示例
域名匹配:
nginx
frontend testacl
bind :80
mode http
acl web_host hdr_dom(host) www.timinglee.org
use_backend timinglee_host if web_host
default_backend default_webserver
基于源 IP 调度:
nginx
frontend testacl
bind :80
mode http
acl ip_test src 172.25.254.1 192.168.0.0/24
use_backend ip_test-host if ip_test
default_backend default_webserver
拒绝指定 User-Agent:
nginx
frontend testacl
bind :80
mode http
acl user_agent_block hdr_sub(User-Agent) -i curl wget
http-request deny if user_agent_block
动静分离(基于文件后缀):
nginx
frontend testacl
bind :80
mode http
acl url_static path_end -i .jpg .png .css .js .html
acl url_php path_end -i .php
use_backend static_host if url_static
use_backend php_host if url_php
default_backend default_webserver
5.2 自定义错误页面
使用 errorfile 或 errorloc 指令自定义错误页面。
5.2.1 基于文件
nginx
defaults
errorfile 503 /haproxy/errorpages/503page.http
5.2.2 基于 HTTP 重定向
nginx
defaults
errorloc 503 https://www.baidu.com
5.3 四层负载均衡配置
nginx
listen mysql_port
bind :3306
mode tcp
balance leastconn
server mysql1 192.168.0.101:3306 check
server mysql2 192.168.0.102:3306 check
5.4 HTTPS 配置
bash
# 生成证书
openssl req -newkey rsa:2048 -nodes -sha256 \
-keyout /etc/haproxy/certs/timinglee.org.key \
-x509 -days 365 -out /etc/haproxy/certs/timinglee.org.crt
合并证书和私钥
cat demo.key demo.crt > demo.pem
nginx
frontend webserver
bind *:80
redirect scheme https if !{ ssl_fc }
mode http
use_backend webcluster
frontend webserver-https
bind *:443 ssl crt /etc/haproxy/timinglee.org.pem
mode http
use_backend webcluster
backend webcluster
mode http
balance roundrobin
server web1 172.25.254.200:80 check inter 3s fall 3 rise 5
server web2 172.25.254.201:80 check inter 3s fall 3 rise 5
六、总结
HAProxy 作为一款成熟的开源负载均衡软件,在四层和七层负载均衡场景中都有出色的表现。通过本文的梳理,我们可以总结出 HAProxy 的核心优势和应用要点:
6.1 HAProxy 核心优势
- 高性能高并发:支持万级甚至数十万级并发连接,适合高流量场景。
- 配置灵活:支持丰富的调度算法、ACL 访问控制、健康检查等高级功能。
- 稳定性强:经过多年生产环境验证,具备良好的稳定性和可靠性。
- 社区活跃:拥有活跃的开源社区和持续的功能更新。
- 多协议支持:同时支持 TCP(四层)和 HTTP(七层)负载均衡。
6.2 适用场景
- Web 应用负载均衡:HTTP/HTTPS 流量分发,支持会话保持、动静分离。
- 数据库负载均衡:MySQL、Redis 等数据库服务的连接池管理。
- API 网关:微服务架构中的 API 路由和流量控制。
- 高可用集群:配合 Keepalived 等工具实现高可用架构。
- 安全防护:通过 ACL 实现访问控制,防御 DDoS 攻击。
6.3 最佳实践建议
- 配置优化:根据实际业务场景调整超时时间、连接数等参数。
- 健康检查:合理设置健康检查间隔和阈值,确保后端服务可用性。
- 日志监控:配置 syslog 或集中式日志收集,便于故障排查。
- 性能调优:根据 CPU 核心数合理配置多进程/多线程。
- 安全加固:启用 SSL/TLS 加密,配置适当的 ACL 规则。
HAProxy 的学习曲线相对平缓,通过掌握其核心配置和高级功能,可以构建出稳定、高效、可扩展的负载均衡架构。建议从简单的四层负载开始实践,逐步深入到七层负载、ACL 控制、HTTPS 等高级功能,最终形成适合自身业务的最佳实践方案。