一、负载均衡基础
-
定义与价值
- 负载均衡(LB):将网络流量分配到多台服务器的技术,提升系统吞吐量、可用性和可扩展性。
- 七层代理:基于应用层协议(如HTTP/HTTPS)进行流量分发,支持URL解析、Cookie会话保持等高级功能。
-
四层 vs 七层对比
特性 四层负载均衡 七层负载均衡 工作层级 传输层(IP+端口) 应用层(解析HTTP请求) 典型设备/软件 LVS、Nginx(upstream模块) Nginx(proxy_pass)、HAProxy 优点 高性能、低延迟 精准流量控制、会话粘性 缺点 无法识别应用层特征 需解析报文,性能略低


二、HAProxy核心特性
-
架构设计
- 单进程多线程模型:主进程管理连接池,子线程处理请求,资源利用率高。
- 模块化设计:支持插件扩展(如统计页面、SSL加密)。
-
关键功能
- 会话保持:通过Cookie或源地址哈希实现用户粘性。
- 健康检查:主动探测后端服务状态(TCP连通性、HTTP响应码)。
- 动态权重调整 :实时根据服务器负载分配流量(如
roundrobin算法)。
三、安装与配置详解
-
环境准备
- 依赖项:GCC、OpenSSL(用于HTTPS)、Perl(ACL脚本支持)。
- 生产环境建议 :启用
daemon模式、限制最大连接数(maxconn=10000)。
-
配置文件结构
bash
# global段:全局参数
global
log /var/log/haproxy.log local0
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 100000
nbproc 2 # 多进程绑定CPU核心
cpu-map 1 0 # 进程1绑定CPU 0核
# defaults段:默认配置模板
defaults
mode http
log global
option httplog # 记录请求日志
timeout client 60s # 客户端超时时间
retries 3 # 失败重试次数
# frontend段:前端监听规则
frontend webserver_80
bind *:80
mode http
use_backend webcluster
# backend段:后端服务器组
backend webcluster
mode http
balance roundrobin # 动态轮询算法
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
高级配置示例
- HTTPS卸载:将SSL握手压力转移至后端
frontend https_term
bind *:443 ssl crt /path/to/cert.pem
mode http
use_backend webcluster
路径重写:动态修改请求路径
frontend rewrite_demo
acl path_api path_beg -i /api
use_backend api_server if path_api
use_backend static_server otherwise
四、调度算法深度解析
-
静态算法
static-rr:固定顺序分配请求,适合无状态服务(如静态文件缓存)。first:强制按服务器列表顺序分配,忽略权重(适用于简单场景)。
-
动态算法
roundrobin:加权轮询(权重范围0~256),新服务器可配置慢启动(逐步增加权重)。leastconn:优先选择当前连接数最少的服务器,适合数据库集群。source:基于客户端IP哈希分配(如CDN边缘节点负载均衡)。
-
混合算法
url_param:根据URL参数值分配流量(如电商订单追踪)。hdr:根据HTTP头信息(如User-Agent)分流不同浏览器类型。
五、高级功能实战
- 访问控制(ACL)
域名过滤:仅允许特定域名访问
acl allowed_domain hdr(host) -m sub .example.com
use_backend secure_server if allowed_domain
IP黑名单:阻止恶意IP访问
acl bad_ip src 192.168.1.0/24
http-request deny if bad_ip
路径匹配 :实现动静分离(如将/api请求路由至API服务器)
2. 会话管理
Cookie注入:生成唯一Session ID并持久化
cookie SESSID insert indirect nocache maxidle 300s
Sticky-Session:基于源地址或Cookie实现会话保持
3. 故障转移
备份服务器:当主服务器宕机时自动切换
server backup_web1 192.168.0.103:80 backup inter 5s fall 2 rise 3
优雅降级 :标记服务器为维护状态(disabled),避免流量冲击
六、性能优化与监控
-
调优参数
- 连接复用 :减少TCP三次握手开销(
option http-keep-alive)。 - 超时设置 :合理配置客户端/服务器超时时间(如
timeout connect 10s)。 - 内存优化 :通过
maxconn限制并发连接数,避免内存耗尽。
- 连接复用 :减少TCP三次握手开销(
-
监控工具
- Web仪表盘 :访问
http://<HAProxy IP>:8888/status查看实时指标4。 - Prometheus集成 :暴露metrics端点(
stats socket /var/lib/haproxy/stats)。 - 日志分析 :解析
/var/log/haproxy.log定位异常流量4。
- Web仪表盘 :访问
七、典型应用场景
- Web服务反向代理 :将
www.example.com流量分发至多个Tomcat实例。 - 微服务网关:根据请求路径路由至不同的Spring Cloud服务。
- 混合协议处理:同时支持HTTP(七层)与MySQL(四层)负载均衡。
- 安全防护 :通过ACL过滤恶意爬虫(如屏蔽
curl请求)。
haproxy的基本配置和实现

调度器配置
1.安装haproxy
root@haproxy \~\]# dnf install haproxy.x86_64 -y \[root@haproxy \~\]# systemctl enable haproxy.service --now
2.实现基本负载
root@haproxy \~\]# vim /etc/haproxy/haproxy.cfg backend webserver-80-web1 server web1 192.168.0.10:80 check inter 3s fall 3 rise 5 backend webserver-80-web2 server web2 192.168.0.20:80 check inter 3s fall 3 rise 5 \[root@haproxy \~\]# systemctl restart haproxy.service
服务器配置
1.安装httpd
root@webserver1 \~\]# yum install httpd -y \[root@webserver2 \~\]# yum install httpd -y
2.配置静态页面
root@webserver1 \~\]# echo webserver1 - 192.168.0.10 \> /var/www/html/index.html \[root@webserver2 \~\]# echo webserver2 - 192.168.0.20 \> /var/www/html/index.html 验证 \[root@webserver1 \~\]# curl 192.168.0.10 webserver1 - 192.168.0.10 \[root@webserver2 \~\]# curl 192.168.0.20 webserver2 - 192.168.0.20
调度器的负载均衡
root@haproxy \~\]# vim /etc/haproxy/haproxy.cfg frontend webcluster bind \*:80 mode http use_backend webserver-80 backend webserver-80 server web1 192.168.0.10:80 check inter 3s fall 3 rise 5 server web2 192.168.0.20:80 check inter 3s fall 3 rise 5 \[root@haproxy \~\]# systemctl restart haproxy.service 测试 \[root@haproxy \~\]# curl 172.25.254.100 webserver1 - 192.168.0.10 \[root@haproxy \~\]# curl 172.25.254.100 webserver2 - 192.168.0.20 \[root@haproxy \~\]# curl 172.25.254.100 webserver1 - 192.168.0.10 \[root@haproxy \~\]# curl 172.25.254.100 webserver2 - 192.168.0.20