一、HAProxy概述
1.haproxy简介
HAProxy主要提供两个功能:http协议反向代理(不提供缓存功能)、基于tcp层的负载均衡(如https、mysql协议)。适用于需要会话保持或七层处理的且负载特别大的站点。可支持数以万计的并发连接。
代理作用:web缓存(加速)、反向代理、内容路由(根据流量及内容类型等将请求转发至特定服务器)、转码器;
HAProxy基于一种事件驱动(event-driven)、单一进程模型和ebtree弹性二叉树机制。
多进程或多线程模型受内存限制、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以并发响应能特别大。但在多核系统上此模型通常扩展性较差
2.性能优势
HAProxy借助于OS上几种常见的技术来实现性能的最大化。
单进程、事件驱动模型显著降低了上下文切换的开销及内存占用。
O(1)事件检查器(eventchecker)允许其在高并发连接中对任何连接的任何事件实现即时探测。
在任何可用的情况下,单缓冲(singlebuffering)机制能以不复制任何数据的方式完成读写操作,这会节约大量的CPU时钟周期及内存带宽;
借助于Linux 2.6 (>=2.6.27.19)上的splice()系统调用,HAProxy可以实现零复制转发(Zero-copy forwarding),在Linux3.5及以上的OS中还可以实现零复制启动(zero-starting);
内存分配器在固定大小的内存池中可实现即时内存分配,这能够显著减少创建一个会话的时长;
树型存储:侧重于使用作者多年前开发的弹性二叉树,实现了以O(log(N))的低开销来保持计时器命令、保持运行队列命令及管理轮询及最少连接队列;
优化的HTTP首部分析:优化的首部分析功能避免了在HTTP首部分析过程中重读任何内存区域;
精心地降低了昂贵的系统调用,大部分工作都在用户空间完成,如时间读取、缓冲聚合及文件描述符的启用和禁用等;
3.HAProxy目前主要版本
1.4版本――提供较好的弹性:衍生于1.2版本,并提供了额外的新特性,其中大多数是期待已久的。
客户端侧的长连接(client-side keep-alive)
TCP加速(TCP speedups)
响应池(response buffering)
RDP协议
基于源的粘性(source-based stickiness)
更好的统计数据接口(a much better stats interfaces)
更详细的健康状态检测机制(more verbose health checks)
基于流量的健康评估机制(traffic-based health)
支持HTTP认证
服务器管理命令行接口(server management from the CLI)
基于ACL的持久性(ACL-based persistence)
日志分析器
1.3版本――内容交换和超强负载:衍生于1.2版本,并提供了额外的新特性。
内容交换(content switching):基于任何请求标准挑选服务器池;
ACL:编写内容交换规则;
负载均衡算法(load-balancing algorithms):更多的算法支持;
内容探测(content inspection):阻止非授权协议;
透明代理(transparentproxy):在Linux系统上允许使用客户端IP直接连入服务器;
内核TCP拼接(kernel TCPsplicing):无copy方式在客户端和服务端之间转发数据以实现数G级别的数据速率;
分层设计(layereddesign):分别实现套接字、TCP、HTTP处理以提供更好的健壮性、更快的处理机制及便捷的演进能力;
快速、公平调度器(fast and fairscheduler):为某些任务指定优先级可实现理好的QoS;
会话速率限制(session rate limiting):适用于托管环境;
注意:
1)1.1、1.2、1.3的poll和epoll机制对性能影响
1.1l版本默认使用的polling系统为select(),其处理的文件数达数千个时性能便会急剧下降。
1.2和1.3版本默认的为poll(),在有些操作系统上可会也会有性能方面的问题,但在Solaris上表现相当不错。
HAProxy1.3在Linux 2.6及打了epoll补丁的Linux2.4上默认使用epoll,在FreeBSD上使用kqueue,这两种机制在任何负载上都能提供恒定的性能表现。
2) 高性能选型方案
Linux 2.6.32及之后版本上运行HAProxy 1.4;
打了epoll补丁的Linux2.4上运行HAProxy 1.4;
FreeBSD上运行HAProxy1.4;
Solaris10上运行HAProxy 1.4;
3)splice()调用机制
在较新版本的Linux2.6(>=2.6.27.19)上,HAProxy还能够使用splice()系统调用在接口间无复制地转发任何数据,甚至可以达到10Gbps的性能。
4.HAProxy 安装配置详解
代理服务器程序包的安装 yum install haproxy -y
配置文件的所在位置 /etc/haproxy/haproxy.cfg
4-1配置文件的格式
"global"配置段,用于设定全局配置参数
该配置段中的参数为进程级别的参数,且通常与其运行的os相关
5 HAProxy代理相关的参数
5-1 balance
定义负载均衡算法,可用于“defaults"、"listen" 和"backend"配置段
可用算法如下
注意:
(1)当使用uri算法时,第一次请求一个URL分发到一个主机,则之后再次请求相同URL则使用一台主机响应。当第一次请求之后,若响应该请求的主机服务出现故障,则haproxy或将其调度到其他主机,此主机修复后再次调度回来
(2)URI:统一资源标识符;格式如下:
<SCHEME>://<USER>:<PASSWORD>@<HOST>:<PORT>/<PATH>;<PARAMS>?<QUERY>#<FRAG>
方案://用户:密码@主机:端口/路径;参数(键值数据、可以多个参数字段)?查询语句#片段显示
2.hash-type
格式:hash-type <method>
定义用于将hash码映射至后端服务器的方法;不能用于frontend区段;可用方法有map-based和consistent
说明:
(1) map-based:hash表是一个包含了所有在线服务器的静态数组。其hash值将会非常平滑,会将权重考虑在列,但其为静态方法,对在线服务器的权重进行调整将不会生效,这意味着其不支持慢速启动。此外,挑选服务器是根据其在数组中的位置进行的,因此,当一台服务器宕机或添加了一台新的服务器时,大多数连接将会被重新派发至一个与此前不同的服务器上,对于缓存服务器的工作场景来说,此方法不甚适用。
(2) consistent:hash表是一个由各服务器填充而成的树状结构;基于hash键在hash树中查找相应的服务器时,最近的服务器将被选中。此方法是动态的,支持在运行时修改服务器权重,因此兼容慢速启动的特性。添加一个新的服务器时,仅会对一小部分请求产生影响,因此,尤其适用于后端服务器为cache的场景。不过,此算法不甚平滑,派发至各服务器的请求未必能达到理想的均衡效果,因此,可能需要不时的调整服务器的权重以获得更好的均衡性。
5-2
HAProxy 统计接口启用相关的参数;
stats enable
启用统计页;基于默认参数启用统计页;
stats url<prefix> 配置时候填写 stats uri / 改变访问地址
统计页的访问uri前缀,通常要加上?stats;
stats realm <realm>
设定认证时使用realm;
stats auth
认证的账号和密码;可以使用多次;
stats refresh 3s
定义测试页面刷新时间
stats admin {if \unless} <cond> stats admin if ture
在指定的条件下启用admin功能
示例配置如下所示;
状态页面,要求认证然后登陆
listen stats *:9001
stats enable
stats uri /haproxyadmin?stats 状态页面的配置
stats realm HAProxy\ Statistics 账户密码的配置方法
stats auth admin:admin
stats admin if true