HAProxy简介
HAProxy是法国开发者 威利塔罗(Willy Tarreau) 在2000年使用C语言开发的一个开源软件 是一款具备高并发(万级以上)、高性能的TCP和HTTP负载均衡器 支持基于cookie的持久性,自动故障切换,支持正则表达式及web状态统计
LVS 与 HAProxy 的核心区别及优劣势
工作层级与本质
LVS(Linux Virtual Server) :是 Linux 内核级别的负载均衡器,仅工作在四层(传输层,如 TCP/UDP),基于 IP 和端口进行流量转发,不解析应用层协议(如 HTTP)。
HAProxy :是用户态的软件负载均衡器,支持四层(传输层)和七层(应用层,如 HTTP/HTTPS),可解析应用层协议内容(如 HTTP 头部、URL),实现更精细的转发。
性能与适用场景
LVS 优势 :
作为内核级工具,转发效率极高(几乎接近硬件负载均衡器),能承载百万级并发连接 ,适合超大规模流量场景 (如电商秒杀、大型分布式服务入口)。
缺点:功能简单,不支持七层逻辑,配置和维护成本高(需结合其他工具完善功能)。
HAProxy 优势 :
功能丰富,支持七层精细化转发,健康检查能力强,配置灵活,适合中高流量且需要应用层逻辑的场景 (如 Web 服务、API 网关)。
缺点:用户态软件,转发效率略低于 LVS(承载几十万并发无压力,超大规模场景可能成为瓶颈)。
总结:LVS转发效率更高但是没有后端检查需要其它工具完善功能,HAProxy转发效率略低于LVS但有后端检测,配置简单。
HAProxy 的四层与七层负载详解
四层负载(TCP 模式)
工作原理:基于传输层协议(TCP/UDP)转发,仅关注 "源 IP: 端口" 和 "目标 IP: 端口",不解析数据包内容(如 HTTP 请求的 URL、头部)。
转发逻辑 :类似 LVS,通过预设的 IP + 端口规则将流量转发到后端服务器(如将访问10.0.0.1:80
的流量转发到后端192.168.1.10:8080
和192.168.1.11:8080
)。
适用场景:对性能要求高、无需应用层逻辑的服务,如数据库(MySQL)、SSH、邮件服务(SMTP)等。
七层负载(HTTP/HTTPS 模式)
工作原理:基于应用层协议(HTTP/HTTPS)转发,会解析数据包的应用层内容(如 HTTP 的 Host、URI、Cookie、请求方法等),实现更智能的路由。
转发逻辑 :可根据应用层信息定制规则,例如:将访问/static
的静态资源请求转发到 CDN 或静态服务器;将访问/api
的动态请求转发到应用服务器;根据 HTTP 头部的Host
字段区分不同域名(如a.example.com
转发到集群 A,b.example.com
转发到集群 B)。
额外能力:支持 SSL 卸载(前端解密 HTTPS,后端用 HTTP 通信,减轻后端服务器压力)、会话保持(通过 Cookie 或 IP 绑定固定用户到某台服务器)、请求改写(Rewrite URL 或头部)等。
适用场景:Web 服务、API 网关等需要应用层逻辑的场景,如电商网站的动静分离、多域名路由等。
HAProxy的使用方法
HAProxy 的配置文件
haproxy.cfg由两大部分组成,分别是:
global:全局配置段 进程及安全配置相关的参数 性能调整相关参数 Debug参数
proxies:代理配置段 defaults:为frontend, backend, listen提供默认配置
frontend:前端,相当于nginx中的server {}
backend:后端,相当于nginx中的upstream {}
listen:同时拥有前端和后端配置,配置简单,生产推荐使用
使用listen替换 frontend和backend的配置方式,可以简化设置,通常只用于TCP协议的应用 listen
我们每次修改完配置文件之后要重启服务,影响比较大。我们可以借用一个工具来实现动态更新
socat 工具
对服务器动态权重和其它状态可以利用 socat工具进行调整,Socat 是 Linux 下的一个多功能的网络工 具,名字来由是Socket CAT,相当于netCAT的增强版.Socat 的主要特点就是在两个数据流之间建立双向 通道,且支持众多协议和链接方式。如 IP、TCP、 UDP、IPv6、Socket文件等
范例:利用工具socat 对服务器动态权重调整
#修改配置文件
root@haproxy \~\]# vim /etc/haproxy/haproxy.cfg stats socket /var/lib/haproxy/stats mode 600 level admin #查看haproxy状态 \[root@haproxy \~\]# echo "show info" \| socat stdio /var/lib/haproxy/stats #查看集群状态 \[root@haproxy \~\]# echo "show servers state" \| socat stdio /var/lib/haproxy/stats #查看集群权重 \[root@haproxy \~\]# echo get weight webcluster/web1 \| socat stdio /var/lib/haproxy/stat #设置权重 \[root@haproxy \~\]# echo "set weight webcluster/web1 1 " \| socat stdio /var/lib/haproxy/stats #下线后端服务器 \[root@haproxy \~\]# echo "disable server webcluster/web1 " \| socat stdio /var/lib/haproxy/stats #上线后端服务器 \[root@haproxy \~\]# echo "enable server webcluster/web1 " \| socat stdio /var/lib/haproxy/stats ### 针对多进程处理方法 如果开启多进程那么我们在对进程的sock文件进行操作时其对进程的操作时随机的 如果需要指定操作进程那么需要用多soct文件方式来完成  这样每个进程就会有单独的sock文件来进行单独管理 ## haproxy的算法 HAProxy通过固定参数 balance 指明对后端服务器的调度算法 balance参数可以配置在listen或backend选项中 HAProxy的调度算法分为静态和动态调度算法 有些算法可以根据参数在静态和动态算法中相互转换。 ### 静态算法 静态算法:按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、连接数和响应速度 等,且无法实时修改权重(只能为0和1,不支持其它值),只能靠重启HAProxy生效。 **static-rr**:基于权重的轮询调度 不支持运行时利用socat进行权重的动态调整(只支持0和1,不支持其它值) 不支持端服务器慢启动 其后端主机数量没有限制,相当于LVS中的 wrr 慢启动是指在服务器刚刚启动上不会把他所应该承担的访问压力全部给它,而是先给一部分,当没 问题后在给一部分 **first:** 根据服务器在列表中的位置,自上而下进行调度 其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务 其会忽略服务器的权重设置 不支持用socat进行动态修改权重,可以设置0和1,可以设置其它值但无效 ### 动态算法 基于后端服务器状态进行调度适当调整, 新请求将优先调度至当前负载较低的服务器 权重可以在haproxy运行时动态调整无需重启 **roundrobin:** 1. 基于权重的轮询动态调度算法, 2. 支持权重的运行时调整,不同于lvs中的rr轮训模式, 3. HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数), 4. 其每个后端backend中最多支持4095个real server, 5. 支持对real server权重动态调整, 6. roundrobin为默认调度算法,此算法使用广泛 动态调整权重 \[root@haproxy \~\]# echo "set weight webserver_80/webserver1 2" \| socat stdio /var/lib/haproxy/haproxy.sock **leastconn:** leastconn加权的最少连接的动态 支持权重的运行时调整和慢启动,即:根据当前连接最少的后端服务器而非权重进行优先调度(新客户 端连接) 比较适合长连接的场景使用,比如:MySQL等场景。 **各算法使用场景** first static-rr roundrobin leastconn source #使用较少 #做了session共享的web集群 #数据库 #基于客户端公网IP的会话保持 Uri---------------\>http url_param---------\>http hdr 五.高级功能及配置 介绍HAProxy高级配置及实用案例 #缓存服务器,CDN服务商,蓝汛、百度、阿里云、腾讯 #可以实现session保持 #基于客户端请求报文头部做下一步处理