HAProxy 学习总结 工具介绍HAProxyHigh Availability Proxy是一个高性能、高可用的代理与负载均衡软件。它本质上就是一个高性能的“流量调度中心”通过代理技术接收客户端请求再利用负载均衡算法把流量分配到多台后端服务器从而实现高并发、高可用与高扩展性。注Nginx 虽然也提供四/七层的负载均衡能力但在性能和灵活度上HAProxy 都比 Nginx 更强。2、配置结构HAProxy 默认的配置文件是/etc/haproxy/haproxy.cfg它的语法结构如下global # 针对 HAProxy 程序的配置 defaults # 默认配置frontend/backend/listen 的公共配置区域 frontend http-in # 前端入口用于接收客户端请求 backend servers-out # 后端服务器池用于处理客户端请求 listen http-in # frontend backend 的合体写法注1frontend 与 backend 通常都是配合出现的不像 listen 是可以单独存在的。2可以放在 defaults 处的指令也可以放在 frontend/backend/listen 处一条指令可以在这四个地方重复出现但在优先级上default frontend backend。3、调度算法HAProxy 支持的调度算法非常丰富完全可以满足各种场景中的需求如下roundrobin轮询按顺序一个个分配保证任务能被均匀分配。同样也可以结合 weight 参数进行权重分配。【适合 HTTP 请求均匀场景】static-rr静态轮询和 roundrobin 类似但不会动态调整权重影响分配。【注后端服务器增加/减少不会立刻重新平衡而 roundrobin 则对此比较敏感。】leastconn最少连接谁连接少就给谁优先选择“最闲”的服务器。【适合长连接的 TCP 请求如 SSH、MYSQL 等】first顺序优先从上往下用满了才换下一个不太关心均衡。sticky永远优先第一台直到它挂掉再切换下一台。【适合日志系统的场景】hash通用哈希对某个“字段”做 hash让同 hash 的请求尽量使用同一台服务器去处理不频繁变动。【适合缓存命中优化】source源 IP 哈希针对源 IP 的 hash让来自同一个客户端 IP 的请求都由同一台服务器处理。uri按 URL hash针对 URI 的 hash让同一个 URL 的请求都由同一台服务器处理。【适合缓存命中优化】url_param按 URL 参数针对URI参数的 hash让同一个链接的请求都由同一台服务器处理。【适合用户登录优化】hdr(name)针对 HTTP 请求头中的某个参数进行的 hash。【适合用户登录优化】random随机选服务器。rdp-cookie基于远程桌面 cookie。【适合 Windows RDP 场景】log-hash专门用于日志 backend。【适合日志系统的场景】4、应用场景以下关于 HAProxy 各种使用场景的配置示例中 global 和 defaults 的配置并非重点我们只需把关注点集中在 frontend 和 backend 即可。4.1、七层代理 - HTTPglobal log 127.0.0.1 local2 ...... defaults mode http log global ...... frontend webser bind *:80 default_backend app backend app balance roundrobin server app1 192.168.1.1:80 check server app2 192.168.1.2:80 check4.2、四层代理 - TCP/UDPglobal log 127.0.0.1 local2 ...... defaults mode tcp log global ...... frontend mysql bind *:3306 default_backend mysqlservers backend mysqlservers balance leastconn server dbsrv1 192.168.1.1:3306 check port 3306 intval 2 rise 1 fall 2 maxconn 300 server dbsrv2 192.168.1.2:3306 check port 3306 intval 2 rise 1 fall 2 maxconn 300注意TCP 模式下的roundrobin并不是“每个数据包轮询一次”而是“每个连接轮询一次”。4.3、转发规则 - ACLglobal log 127.0.0.1 local2 ...... defaults mode http log global ...... frontend webservs bind *:80 acl url_static path_beg -i /static /images /javascript /stylesheets acl url_static path_end -i .jpg .gif .png .css .js .html acl url_php path_end -i .php acl host_static hdr_beg(host) -i img. imgs. video. videos. ftp. image. download. use_backend static if url_static or host_static use_backend dynamic if url_php default_backend dynamic backend static balance roundrobin server node1 192.168.1.1:80 check maxconn 3000 backend dynamic balance roundrobin server node2 192.168.1.2:80 check maxconn 10004.4、状态管理 - Statsglobal log 127.0.0.1 local2 ...... defaults mode http log global ...... listen statistics bind *:8080 # 自定义监听端口 stats enable # 启用基于程序编译时默认设置的统计报告 stats auth admin:admin # 统计页面用户名和密码设置 stats uri /admin?stats # 自定义统计页面的 URL默认为/haproxy?stats stats hide-version # 隐藏统计页面上 HAProxy 的版本信息 stats refresh 30s # 统计页面自动刷新时间 stats admin if TRUE # 如果认证通过就做管理功能可以管理后端的服务器 stats realm Hapadmin # 统计页面密码框上提示文本默认为 Haproxy\StatisticsStats 管理页支持的动作Set state to READY正常模式。若后端服务正常则此操作后后端