一、HAProxy简介 HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。 HAProxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。 HAProxy是免费、极速且可靠的用于为TCP和基于HTTP应用程序提供高可用、负载均衡和代理服务的解决方案,尤其适用于高负载且需要持久连接或7层处理机制的web站点。 二、HAProxy版本介绍 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):阻止非授权协议; ◆ 透明代理(transparent proxy):在Linux系统上允许使用客户端IP直接连入服务器; ◆ 内核TCP拼接(kernel TCP splicing):无copy方式在客户端和服务端之间转发数据以实现数G级别的数据速率; ◆ 分层设计(layered design):分别实现套接字、TCP、HTTP处理以提供更好的健壮性、更快的处理机制及便捷的演进能力; ◆ 快速、公平调度器(fast and fair scheduler):为某些任务指定优先级可实现理好的QoS; ◆ 会话速率限制(session rate limiting):适用于托管环境; 三、HAProxy支持的平台及OS ◆ x86、x86_64、Alpha、SPARC、MIPS及PARISC平台上的Linux 2.4; ◆ x86、x86_64、ARM (ixp425)及PPC64平台上的Linux2.6; ◆ UltraSPARC 2和3上的Sloaris 8/9; ◆ Opteron和UltraSPARC平台上的Solaris 10; ◆ x86平台上的FreeBSD 4.1-8; ◆ i386, amd64, macppc, alpha, sparc64和VAX平台上的OpenBSD 3.1-current; 若要获得最高性能,需要在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的性能。 基于以上事实,在x86或x86_64平台上,要获取最好性能的负载均衡器,建议按顺序考虑以下方案。 Linux 2.6.32及之后版本上运行HAProxy 1.4; 打了epoll补丁的Linux 2.4上运行HAProxy 1.4; FreeBSD上运行HAProxy 1.4; Solaris 10上运行HAProxy 1.4; 四、HAProxy性能优势 HAProxy借助于OS上几种常见的技术来实现性能的最大化。 ◆ 单进程、事件驱动模型显著降低了上下文切换的开销及内存占用。 ◆ O(1)事件检查器(event checker)允许其在高并发连接中对任何连接的任何事件实现即时探测。 ◆ 在任何可用的情况下,单缓冲(single buffering)机制能以不复制任何数据的方式完成读写操作,这会节约大量的CPU时钟周期及内存带宽; ◆ 借助于Linux 2.6 (>= 2.6.27.19)上的splice()系统调用,HAProxy可以实现零复制转发(Zero-copy forwarding),在Linux 3.5及以上的OS中还可以实现零复制启动(zero-starting); ◆ MRU内存分配器在固定大小的内存池中可实现即时内存分配,这能够显著减少创建一个会话的时长; ◆ 树型存储:侧重于使用作者多年前开发的弹性二叉树,实现了以O(log(N))的低开销来保持计时器命令、保持运行队列命令及管理轮询及最少连接队列; ◆ 优化的HTTP首部分析:优化的首部分析功能避免了在HTTP首部分析过程中重读任何内存区域; ◆ 精心地降低了昂贵的系统调用,大部分工作都在用户空间完成,如时间读取、缓冲聚合及文件描述符的启用和禁用等; 所有的这些细微之处的优化实现了在中等规模负载之上依然有着相当低的CPU负载,甚至于在非常高的负载场景中,5%的用户空间占用率和95%的系统空间占用率也是非常普遍的现象,这意味着HAProxy进程消耗比系统空间消耗低20倍以上。因此,对OS进行性能调优是非常重要的。即使用户空间的占用率提高一倍,其CPU占用率也仅为10%,这也解释了为何7层处理对性能影响有限这一现象。由此,在高端系统上HAProxy的7层性能可轻易超过硬件负载均衡设备。 在生产环境中,在7层处理上使用HAProxy作为昂贵的高端硬件负载均衡设备故障故障时的紧急解决方案也时长可见。硬件负载均衡设备在“报文”级别处理请求,这在支持跨报文请求(request across multiple packets)有着较高的难度,并且它们不缓冲任何数据,因此有着较长的响应时间。对应地,软件负载均衡设备使用TCP缓冲,可建立极长的请求,且有着较大的响应时间。 五、HAProxy均衡负载算法 ◆ roundrobin:基于权重进行轮叫,在服务器的处理时间保持均匀分布时,这是最平衡、最公平的算法。此算法是动态的,这表示其权重可以在运行时进行调整,不过,在设计上,每个后端服务器仅能最多接受4128个连接; ◆ static-rr:基于权重进行轮叫,与roundrobin类似,但是为静态方法,在运行时调整其服务器权重不会生效;不过,其在后端服务器连接数上没有限制; ◆ leastconn:新的连接请求被派发至具有最少连接数目的后端服务器;在有着较长时间会话的场景中推荐使用此算法,如LDAP、SQL等,其并不太适用于较短会话的应用层协议,如HTTP;此算法是动态的,可以在运行时调整其权重; ◆ source:将请求的源地址进行hash运算,并由后端服务器的权重总数相除后派发至某匹配的服务器;这可以使得同一个客户端IP的请求始终被派发至某特定的服务器;不过,当服务器权重总数发生变化时,如某服务器宕机或添加了新的服务器,许多客户端的请求可能会被派发至与此前请求不同的服务器;常用于负载均衡无cookie功能的基于TCP的协议;其默认为静态,不过也可以使用hash-type修改此特性; ◆ uri:对URI的左半部分(“问题”标记之前的部分)或整个URI进行hash运算,并由服务器的总权重相除后派发至某匹配的服务器;这可以使得对同一个URI的请求总是被派发至某特定的服务器,除非服务器的权重总数发生了变化;此算法常用于代理缓存或反病毒代理以提高缓存的命中率;需要注意的是,此算法仅应用于HTTP后端服务器场景;其默认为静态算法,不过也可以使用hash-type修改此特性; ◆ url_param:通过<argument>为URL指定的参数在每个HTTP GET请求中将会被检索;如果找到了指定的参数且其通过等于号“=”被赋予了一个值,那么此值将被执行hash运算并被服务器的总权重相除后派发至某匹配的服务器;此算法可以通过追踪请求中的用户标识进而确保同一个用户ID的请求将被送往同一个特定的服务器,除非服务器的总权重发生了变化;如果某请求中没有出现指定的参数或其没有有效值,则使用轮叫算法对相应请求进行调度;此算法默认为静态的,不过其也可以使用hash-type修改此特性; ◆ hdr(<name>):对于每个HTTP请求,通过<name>指定的HTTP首部将会被检索;如果相应的首部没有出现或其没有有效值,则使用轮叫算法对相应请求进行调度;其有一个可选选项“use_domain_only”,可在指定检索类似Host类的首部时仅计算域名部分(比如通过www.magedu.com来说,仅计算magedu字符串的hash值)以降低hash算法的运算量;此算法默认为静态的,不过其也可以使用hash-type修改此特性; ◆ rdp-cookie(name):表示根据cookie(name)来锁定,并哈希每一次TCP请求。 五、HAProxy的安装 HAProxy的安装可以进行源码编译,也可以使用base源中的rpm包,我这边建议如果没有特殊需求,还是使用yum源中的软件包进行安装,简单方便。 # yum install haproxy -y (责任编辑:IT) |