首页 > 代码库 > haproxy笔记之二:HAProxy简介

haproxy笔记之二:HAProxy简介

HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

 

HAProxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。 

 

HAProxy是免费、极速且可靠的用于为TCP和基于HTTP应用程序提供高可用、负载均衡和代理服务的解决方案,尤其适用于高负载且需要持久连接或7层处理机制的web站点。

 

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):适用于托管环境;

 

 

支持的平台及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借助于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笔记之二:HAProxy简介