HAProxy简介
HAProxy是一款专业提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,HAProxy是完全免费的、借助HAProxy可以快速并且可靠的提供基于TCP和HTTP应用的代理解决方案。
HAProxy特别适用于那些负载特大的web站点, 这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。在以proxy反向代理方式实现WEB均衡负载上,这样的产品有很多。包括LVS四层代理,Nginx七层代理,ApacheProxy七层代理,ats七层代理等,但HAProxy在四层代理在这方面相比LVS,调度可能差很多,LVS毕竟是在内核中工作,减少了很多内核空间跟用户空间的切换,突破了socket限制,LVS创始人章文嵩曾经给出的数据LVS最高可支持400万并发,而专业硬件调度器F5也就支持700万左右。但HAProxy相比LVS它支持七层代理,能够理解应用层协议,所以能够支持很多LVS不支持的,比如基于URL重写、ACL限制、、基于URL的调度、基于cookie的调度等等功能,它就显得更加专业,扩展性更好,更强大。而HAProxy相比Nginx而言,二者都是轻量级高性能七层支持七层代理的工具,总而言之没有谁多好谁多烂,也不用做太多的比较,根据使用习惯及需求决定就好,萝卜白菜各有所爱。
HAProxy实现了一种事件驱动、单一进程模型(避免进程上下文切换),此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。
HAProxy大概的特点及功能如下介绍:
1)免费开源,稳定性也是非常好,这个可通过我做的一些小项目可以看出来,单Haproxy也跑得不错,稳定性可以与硬件级的F5相媲美;
2)根据官方文档,HAProxy可以跑满10Gbps-New benchmark of HAProxy at 10 Gbps using Myricom’s 10GbE NICs (Myri-10G PCI-Express),这个数值作为软件级负载均衡器是相当惊人的。
3)HAProxy支持连接拒绝 : 因为维护一个连接的打开的开销是很低的,有时我们很需要限制攻击蠕虫(attack bots),也就是说限制它们的连接打开从而限制它们的危害。 这个已经为一个陷于小型DDoS攻击的网站开发了而且已经拯救了很多站点,这个优点也是其它负载均衡器没有的。
4)HAProxy支持全透明代理(已具备硬件防火墙的典型特点): 可以用客户端IP地址或者任何其他地址来连接后端服务器,这个特性仅在Linux 2.4/2.6内核打了cttproxy补丁后才可以使用,这个特性也使得为某特殊服务器处理部分流量同时又不修改服务器的地址成为可能。
5)HAProxy也多于线上的MySQL集群环境代理,我们常用于它作为MySQL(读)负载均衡;
6)HAProxy也可以用于Redis、Memcached、MongoDB、TFS等软件的代理。
7)HAProxy支持虚拟主机,许多朋友说它不支持虚拟主机是错误的,通过测试我们知道,HAProxy是支持虚拟主机的。
8)自带强大的监控服务器状态的页面;
HAProxy目前主要版本:
HAProxy目前主要有三个版本: 1.3(衍生1.2版本) , 1.4(衍生1.2版本) ,1.5(衍生1.4版本),CentOS6.5自带的RPM包为1.4版本,CentOS6.6自带的RPM包为1.5版本。
1.4 version —— 提供较好的弹性:衍生于1.2版本,并提供了额外的新特性,其中大多数是期待已久的。
1)客户端侧的长连接(client-side keep-alive),虽然占用流量,但能够让客户端在一个连接上多次传输还是需要的;但HAProxy跟后端服务器建立练级还是默认的HTTP无状态连接,因为是本地所以足够快;
2)TCP加速(TCP speedups);
3)响应池(response buffering);
4)RDP远程桌面协议;
5)基于源的粘性(source-based stickiness),支持IP或cookie;
6)更好的统计数据接口(a much better stats i nterfaces);
7)更详细的健康状态检测机制(more verbose health checks);
8)基于流量的健康评估机制(traffic-based health);
9)支持HTTP认证;
10)服务器管理命令行接口(server management from the CLI);
11)基于ACL的调度及持久性(ACL-based persistence);
12)日志分析器;
1.5 Version —— 相对于1.4 版本来说,1.5 版本包括了许多新特性和性能改进:
1)支持 SNI/NPN/ALPN 和 OCSP stapling 的原生 SSL;
2)支持 IPv6 和 UNIX sockets;
3)full HTTP keep-alive for better support of NTLM and improved efficiency in static farms;
4)HTTP/1.1 compression (deflate, gzip) to save bandwidth;
5)PROXY protocol versions 1 and 2 on both sides;
6)data sampling on everything in request or response, including payload;
7)ACLs can use any matching method with any input sample maps and dynamic ACLsupdatable from the CLI stick-tables support counters to track activity on any input sample custom format for logs, unique-id, header rewriting, and redirects;
8)improved health checks (SSL, scripted TCP, check agent, …)
9)much more scalable configuration supports hundreds of thousands of backends and certificates without sweating.
HAProxy高性能提升的方法:
若要获得最高性能,需要在Linux 2.6或打了epoll补丁的Linux 2.4上运行haproxy 1.2.5以上的版本。haproxy 1.1l默认使用的polling系统为select(),其处理的文件数达数千个时性能便会急剧下降。1.2和1.3版本默认的为poll(),在有些操作系统上可会也会有性能方面的问题,但在Solaris上表现相当不错。HAProxy 1.3在Linux 2.6及打了epoll补丁的Linux 2.4上默认使用epoll,在FreeBSD上使用kqueue,这两种机制在任何负载上都能提供恒定的性能表现。在较新版本的Linux 2.6(>=2.6.27.19)上,HAProxy还能够使用splice()系统调用在接口间无复制(无需内核空间拷贝数据到用户空间)地转发任何数据,这甚至可以达到10Gbps的性能。
HAProxy借助于OS上几种常见的技术来实现性能的最大化。
1)单进程、事件驱动模型显著降低了上下文切换的开销及内存占用。
2)O(1)事件检查器(event checker)允许其在高并发连接中对任何连接的任何事件实现即时探测,0(N)是评判数据结构复杂度的标准。
3)在任何可用的情况下,单缓冲(single buffering)机制能以不复制任何数据的方式完成读写操作,这会节约大量的CPU时钟周期及内存带宽;
4)借助于Linux 2.6 (>= 2.6.27.19)上的splice()系统调用,HAProxy可以实现零复制转发(Zero-copy forwarding),在Linux 3.5及以上的OS中还可以实现零复制启动(zero-starting);
5)MRU内存分配器在固定大小的内存池中可实现即时内存分配,这能够显著减少创建一个会话的时长;
6)树型存储:侧重于使用作者多年前开发的弹性二叉树,实现了以O(log(N))的低开销来保持计时器命令、保持运行队列命令及管理轮询及最少连接队列;
7)优化的HTTP首部分析:优化的首部分析功能避免了在HTTP首部分析过程中重读任何内存区域;
8)精心地降低了昂贵的系统调用,大部分工作都在用户空间完成,如时间读取、缓冲聚合及文件描述符的启用和禁用等;
所有的这些细微之处的优化实现了在中等规模负载之上依然有着相当低的CPU负载,甚至于在非常高的负载场景中,5%的用户空间占用率和95%的系统空间占用率也是非常普遍的现象,这意味着HAProxy进程消耗比系统空间消耗低20倍以上。因此,对OS进行性能调优是非常重要的。即使用户空间的占用率提高一倍,其CPU占用率也仅为10%,这也解释了为何7层处理对性能影响有限这一现象。由此,在高端系统上HAProxy的7层性能可轻易超过硬件负载均衡设备。
在生产环境中,在7层处理上使用HAProxy作为昂贵的高端硬件负载均衡设备故障故障时的紧急解决方案也时长可见。硬件负载均衡设备在“报文”级别处理请求,这在支持跨报文请求(request across multiple packets)有着较高的难度,并且它们不缓冲任何数据,因此有着较长的响应时间。对应地,软件负载均衡设备使用TCP缓冲,可建立极长的请求,且有着较大的响应时间。
Haproxy工作模型
当用户并发请求达到一定的数量时,使用haproxy进行负载均衡有明显的优势;而且haproxy还可以根据用户的cookies,根据调度算法,将用户一直定向分配到以前访问过的后端服务器上;为了提高网站访问速度,一般在haproxy的后端都要配置缓存服务器,可以是静态页面内容的缓存,也可以是动态网页内容的缓存,生产环境中有必要添加mysql的缓存。
用户访问网站域名时,DNS解析到外网接口haproxy服务器上,haproxy将请求直接转发(tcp)至后方服务器,或者先分析用户请求,然后以客户端身份向后端服务器发出同样的请求(http),获得后方服务器返回的内容后重新封装,响应给客户端,此时haproxy实现一手端两家,中间翻译官的角色。