Haproxy
目录
Haproxy基础概念
一、架构分层
二、流量处理流程
三、关键特性实现
四、典型部署模式
LVS、HAProxy&Nginx的调度算法类型
一、LVS调度算法(四层负载均衡)
二、HAProxy调度算法(四层/七层负载均衡)
三、Nginx调度算法(七层负载均衡)
对比总结
Haproxy部署
一、部署流程(以Ubuntu为例)
二、配置文件详解
PS:haproxy核心工作机制
一、流量处理全链路
二、会话保持技术
三、关键性能优化
四、高可用实现
Haproxy基础概念
一、架构分层
-
前端(Frontend)
监听客户端请求的虚拟服务,定义绑定IP/端口和ACL规则。支持多前端共存,每个前端独立配置监听策略(如HTTP/TCP模式)。 -
后端(Backend)
实际服务集群的抽象,包含服务器池和调度算法。支持动态服务器列表调整,通过server
指令定义节点地址、端口及权重。 -
流量转发引擎
基于事件驱动的多线程模型(支持单进程/多进程),采用非阻塞I/O处理连接,单个实例可处理10万+并发连接。
二、流量处理流程
-
连接接收阶段
-
TCP层完成三次握手后,内核将连接交给HAProxy
-
对HTTP模式会解析请求头,TCP模式仅处理原始字节流
-
-
规则匹配阶段
-
按顺序执行ACL(访问控制列表)规则检查
-
典型匹配项:源IP、URL路径、Cookie、HTTP头等
-
支持
use_backend
动态路由和default_backend
默认路由
-
-
负载均衡阶段
-
根据选定算法(如roundrobin/leastconn)选择后端服务器
-
记录会话状态(stick-table)实现会话保持
-
-
流量转发阶段
-
四层模式:直接转发TCP数据包
-
七层模式:重建HTTP请求头,支持X-Forwarded-For等头注入
-
三、关键特性实现
-
健康检查机制
-
主动检查:定期发送TCP SYN/HTTP GET请求
-
被动检查:监测连接超时/错误响应
-
慢启动(slowstart):新节点逐步增加流量
-
-
会话保持技术
-
源IP哈希:基于客户端IP的会话绑定
-
Cookie插入:动态生成JSESSIONID等Cookie
-
表持久化:stick-table存储会话映射关系
-
-
高性能优化
-
零拷贝技术:减少内核态-用户态数据复制
-
缓冲池管理:预分配内存避免频繁申请
-
SSL加速:支持OpenSSL硬件加速
-
四、典型部署模式
客户端 → HAProxy(主动/被动集群)├─→ Web服务器集群(HTTP模式)├─→ 数据库读写分离(TCP模式)└─→ 微服务网关(API路由)
LVS、HAProxy&Nginx的调度算法类型
一、LVS调度算法(四层负载均衡)
- 轮询(RR)
按顺序将请求均匀分配到后端服务器,不考虑服务器负载差异。 - 加权轮询(WRR)
根据服务器权重分配请求,性能高的服务器权重更高。 - 最少连接(LC)
将请求分配给当前连接数最少的服务器。 - 加权最少连接(WLC)
在LC基础上引入权重,优先选择(当前连接数/权重)最小的服务器。 - 源地址哈希(SH)
根据客户端IP哈希值固定分配到同一服务器,适用于会话保持场景。
二、HAProxy调度算法(四层/七层负载均衡)
- Round Robin(RR)
类似LVS的轮询,支持动态调整权重。 - Least Connections(LC)
优先选择连接数最少的后端。 - Source Hash(SH)
基于源IP哈希实现会话保持。 - URI Hash
根据请求URI哈希分配,适用于CDN场景。 - 动态算法(如Dynamic Round Robin)
根据服务器响应时间动态调整权重。
三、Nginx调度算法(七层负载均衡)
- 轮询(Round Robin)
默认算法,均匀分配请求。 - 加权轮询(Weighted Round Robin)
通过配置权重调整分配比例。 - IP Hash
基于客户端IP哈希固定分配,解决Session问题。 - Least Connections
类似HAProxy的LC算法。 - 一致性哈希(需第三方模块)
减少后端节点变动对哈希分布的影响。
对比总结
- LVS:专注四层,算法简单高效,适合高并发但无应用层逻辑。
- HAProxy:支持四/七层,算法丰富,适合复杂业务场景。
- Nginx:七层为主,算法灵活,集成Web服务能力。
Haproxy部署
一、部署流程(以Ubuntu为例)
- 安装
dnf -y install haproxy# 安装官方维护版本
- 目录结构
/etc/haproxy/
├── haproxy.cfg # 主配置文件
├── errors/ # 自定义错误页面
└── ssl/ # SSL证书存放目录
- 服务管理
sudo systemctl enable haproxy # 开机自启
sudo systemctl start haproxy # 启动服务
sudo haproxy -c -f /etc/haproxy/haproxy.cfg # 配置文件语法检查
二、配置文件详解
# 全局配置段
globallog /dev/log local0 info # 日志输出到syslog的local0设施maxconn 10000 # 单进程最大连接数user haproxy # 运行用户group haproxy # 运行组daemon # 以守护进程模式运行stats socket /run/haproxy/admin.sock mode 660 level admin # 管理接口# 默认参数段
defaultsmode http # 默认工作模式(http/tcp)timeout connect 5s # 连接后端超时时间timeout client 30s # 客户端空闲超时timeout server 30s # 服务端响应超时log global # 继承全局日志配置option httplog # 记录HTTP日志option dontlognull # 不记录空连接日志# 监控页面配置
frontend statsbind *:8404 # 监控页面监听端口stats enable # 启用统计页面stats uri /haproxy?stats # 访问路径stats refresh 10s # 自动刷新间隔stats admin if TRUE # 启用管理功能# 前端服务配置
frontend web_frontbind *:80 # 监听80端口bind *:443 ssl crt /etc/haproxy/ssl/example.com.pem # SSL配置acl is_static path_end -i .jpg .css .js # 定义静态文件ACL规则use_backend static_servers if is_static # 静态请求路由default_backend app_servers # 默认路由# 后端服务器池
backend app_serversbalance roundrobin # 使用轮询算法server app1 192.168.1.10:8080 check maxconn 100 # 节点1带健康检查server app2 192.168.1.11:8080 check backup # 备用节点backend static_serversbalance leastconn # 最少连接算法server static1 192.168.1.20:80 checkserver static2 192.168.1.21:80 check
PS:haproxy核心工作机制
一、流量处理全链路
-
TCP/UDP流量代理
四层模式下直接转发原始数据包,通过内核级TCP协议栈优化实现微秒级延迟。支持TCP连接复用(connection pooling)降低后端服务器压力。 -
HTTP协议解析
七层模式下完整解析HTTP/1.1和HTTP/2头部,支持:- 请求/响应重写(header manipulation)
- 基于ACL的内容路由(路径/域名/Cookie)
- 压缩/解压缩(gzip/deflate)
-
SSL/TLS卸载
支持TLS 1.3终止与透传,通过OpenSSL引擎实现:- 证书热加载(SIGUSR2信号触发)
- SNI多域名托管
- 会话票据复用(session ticket reuse)
二、会话保持技术
-
源IP哈希
对客户端IP进行一致性哈希计算,确保相同IP始终路由到固定后端。 -
Cookie注入
动态插入SRVID Cookie(如SERVERID=app1
),后端服务器需配合识别。 -
Stick-table持久化
内存表中存储五元组映射关系,支持:- 会话超时控制(stick-table timeout)
- 跨进程同步(peers协议)
- 分布式会话一致性
三、关键性能优化
-
零拷贝转发
使用Linux内核的splice()
系统调用避免数据拷贝。 -
事件驱动模型
单进程非阻塞I/O架构,通过epoll/kqueue实现C10K级别并发。 -
内存管理
预分配缓冲池(buffer pool)防止内存碎片,每个连接仅消耗约1KB内存。
四、高可用实现
客户端 → Keepalived VIP
├─→ HAProxy主节点(active)
└─→ HAProxy备节点(backup) ↓ 后端服务器集群(健康检查+自动熔断)