PHP程序员站--PHP编程开发平台
 当前位置:主页 >> 新闻咨询 >> 业内新闻 >> 

什么是HAProxy

什么是HAProxy

来源:phperz.com  作者:  发布时间:2010-04-06
HAProxy提供高可用性、负载均衡 以及基于TCP和HTTP应用的代理,

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

当前,您有两种主要的版本可以使用:

  • 版本 1.1 - 从2002年开始就服务于很多重要站点
    这是最稳定可靠的版本, 运行时间(uptime)已经长达几年了。该版本目前已经不接受新的特性,仅用于核心关键(mission-critical)的业务.
  • 版本 1.2 - 主要用于大流量的站点
    在1.1的基础上加入了一些新的特性, poll/epoll 的支持用以支持大量的会话(session), 客户端IPv6 应用程序cookie, hot-reconfiguration, 高级的动态流量管理, TCP keepalive, source hash, 加权负载均衡算法, 基于红黑树(rbtree)算法的调度器, 同时还有一个很好的Web状态页面. 尽管1.2还在不断的发展,但是从1.2.8开始已经趋于稳定。

另外, 版本1.3是处于活跃开发阶段的版本, 它支持如下新特性:

  • 内容交换 : 可以根据请求(request)的任何一部分来选择一组服务器, 比如请求的 URI, Host头(header), cookie, 以及其他任何东西. 当然,对那些静态分离的站点来说,对此特性还有更多的需求。
  • 全透明代理 : 可以用 客户端IP地址或者任何其他地址来连接后端服务器. 这个特性仅在Linux 2.4/2.6内核打了cttproxy补丁后才可以使用. 这个特性也使得为某特殊服务器处理部分流量同时又不修改服务器的地址成为可能。
  • 基于树的更快的调度器 : 1.2.16以上的版本要求所有的超时都设成同样的值以支持数以万计的全速连接. 这个特性已经移植到1.2.17.
  • 内核TCP拼接 : 避免了内核到用户然后用户到内核端的数据拷贝, 提高了吞吐量同时又降低了CPU使用率. Haproxy 1.3支持Linux L7SW 以满足在商用硬件上数Gbps的吞吐的需求。
  • 连接拒绝 : 因为维护一个连接的打开的开销是很低的,有时我们很需要限制攻击蠕虫(attack bots),也就是说限制它们的连接打开从而限制它们的危害。 这个已经为一个陷于小型DDoS攻击的网站开发了而且已经拯救了很多站点。
  • 细微的头部处理 : 使得编写基于header的规则更为简单,同时可以处理URI的某部分。
  • 快而可靠的头部处理 : 使用完全RFC2616兼容的完整性检查对一般的请求全部进行分析和索引仅仅需要不到2ms的时间。
  • 模块化设计 : 允许更多人加入进此项目,调试也非常简单. poller已经分离, 已经使得它们的开发简单了很多. HTTP已经从TCP分离出来了,这样增加新的七层特性变得非常简单. 其他子系统也会很快实现模块化
  • 投机I/O 处理 : 在一个套接字就绪前就尝试从它读取数据。poller仅推测哪个可能就绪哪个没有,尝试猜测,并且如果成功,一些开销很大的系统调用就可以省去了。如果失败,就会调用这些系统调用。已知的使用Linux epoll()已经净提升起码10%了。
  • ACLs : 使用任意规则的任意组合作为某动作的执行条件。
  • TCP 协议检查 : 结合ACL来对请求的任意部分进行检查,然后再进行转发。这就可以执行协议验证而不是盲目的进行转发。比如说允许SSL但拒绝SSH。
  • 更多的负载均衡算法 : 现在,动态加权轮循(Dynamic Round Robin),加权源地址哈希(Weighted Source Hash),加权URL哈希和加权参数哈希(Weighted Parameter Hash)已经实现。其他算法比如Weighted Measured Response Time也很快会实现。

和其他"免费"的负载均衡解决方案不同的是, HAproxy仅被几百或者几千的遍布全球的用户使用, 但是这些用户通常运行很大的站点, 每天有数百万的点击量和几Gbps甚至几万兆(terabytes)吞吐量。 他们需要7x24的可用性并且愿意承受免费软件解决方案的风险, 同时有这些使用技术. 通常, 这种解决方案仅配置为内部使用, 我仅在他们提供给我反馈或者需要新特性的时候才会知道.

设计选择和历史

新闻快报

2009年9月26日

 

    I found it was important to acknowledge some people and companies' efforts for the project. So I added a new page listing significant contributions, most often features but sometimes fixes, in the form of patches, code, time or even money. A minor bug on the stats page which remained in 1.4-dev3 has also been fixed and is available in the latest snapshot.

September 24th, 2009 : 1.4-dev3

 

    Most of the internal changes planned for version 1.4 have been completed, so it was time to release a new clean snapshot. The architecture is now ready to permit keep-alive, SSL or FastCGI developments. Some more changes are planned but the remaining ones should be a lot easier to perform without breaking everything.

    Compared to latest stable 1.3.20 version, 1.4-dev3 provides new features, among which support for the CLF log format, RDP protocol load-balancing and persistence, a new interactive CLI, an improved HTML stats page, support for inspecting HTTP contents in TCP frontends and switching to HTTP backends (allowing HTTP+SSL to coexist on the same port), support for forcing of the TCP MSS on frontends, smart network optimizations to reduce the number of TCP packets in a session, runtime-configurable buffer sizes, support for more than 64k concurrent connections, config parser support for "no option xxx" to disable options that were enabled by default, and correct 1xx status code processing. Developments to support keep-alive have already started, and if time permits, SSL integration will be attempted. The code looks amazingly stable for the amount of changes, and will probably not change much anymore, so any bug found in this version must be reported and fixed. Also, new feature submissions should be based on this version. It will be easier to implement for submitters and for me to merge.

    Several large sites are already running on 1.4-dev2 with great success. This one should be even better, but given the number of changes, it should be monitored more closely at the beginning.

    Last, I have a very good news that I hope will give ideas to others : Exceliance and Loadbalancer.org have both agreed to contribute some manpower and money to implement the complete persistence framework that everyone is dreaming about into haproxy. That's a tough work and I'm not certain it will be ready for 1.4 (though it might, depending if I'm as late on my releases as usual). I would personally like to thank them both for their contributions. When you have to put your money in commercial solutions, please never forget to consult first the guys who involve time and money in opensource projects, because they are the ones who help the projects evolve and live !

最近新闻...

 

最新版本

分支 说明 最后版本 Released 注意
1.3.x 开发 GIT 未发布 也许不稳定
1.3.16 1.3.16-rc 1.3.16-rc1 2009/03/09 Release Candidate (Beta)
1.3.15 1.3.15-maint 1.3.15.7 2008/12/04 推荐版本
1.3.14 1.3.14-maint 1.3.14.11 2008/12/04 之前版本
1.2.x 1.2-stable 1.2.18 2008/05/25 仅修复重要bug
1.1.x 1.1-stable 1.1.34 2006/01/29 仅修复致命bug
1.0.x 1.0-old 1.0.2 2001/12/30 无维护

描述

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

当前,您有两种主要的版本可以使用:

  • 版本 1.1 - 从2002年开始就服务于很多重要站点
    这是最稳定可靠的版本, 运行时间(uptime)已经长达几年了。该版本目前已经不接受新的特性,仅用于核心关键(mission-critical)的业务.
  • 版本 1.2 - 主要用于大流量的站点
    在1.1的基础上加入了一些新的特性, poll/epoll 的支持用以支持大量的会话(session), 客户端IPv6 应用程序cookie, hot-reconfiguration, 高级的动态流量管理, TCP keepalive, source hash, 加权负载均衡算法, 基于红黑树(rbtree)算法的调度器, 同时还有一个很好的Web状态页面. 尽管1.2还在不断的发展,但是从1.2.8开始已经趋于稳定。

另外, 版本1.3是处于活跃开发阶段的版本, 它支持如下新特性:

  • 内容交换 : 可以根据请求(request)的任何一部分来选择一组服务器, 比如请求的 URI, Host头(header), cookie, 以及其他任何东西. 当然,对那些静态分离的站点来说,对此特性还有更多的需求。
  • 全透明代理 : 可以用 客户端IP地址或者任何其他地址来连接后端服务器. 这个特性仅在Linux 2.4/2.6内核打了cttproxy补丁后才可以使用. 这个特性也使得为某特殊服务器处理部分流量同时又不修改服务器的地址成为可能。
  • 基于树的更快的调度器 : 1.2.16以上的版本要求所有的超时都设成同样的值以支持数以万计的全速连接. 这个特性已经移植到1.2.17.
  • 内核TCP拼接 : 避免了内核到用户然后用户到内核端的数据拷贝, 提高了吞吐量同时又降低了CPU使用率. Haproxy 1.3支持Linux L7SW 以满足在商用硬件上数Gbps的吞吐的需求。
  • 连接拒绝 : 因为维护一个连接的打开的开销是很低的,有时我们很需要限制攻击蠕虫(attack bots),也就是说限制它们的连接打开从而限制它们的危害。 这个已经为一个陷于小型DDoS攻击的网站开发了而且已经拯救了很多站点。
  • 细微的头部处理 : 使得编写基于header的规则更为简单,同时可以处理URI的某部分。
  • 快而可靠的头部处理 : 使用完全RFC2616兼容的完整性检查对一般的请求全部进行分析和索引仅仅需要不到2ms的时间。
  • 模块化设计 : 允许更多人加入进此项目,调试也非常简单. poller已经分离, 已经使得它们的开发简单了很多. HTTP已经从TCP分离出来了,这样增加新的七层特性变得非常简单. 其他子系统也会很快实现模块化
  • 投机I/O 处理 : 在一个套接字就绪前就尝试从它读取数据。poller仅推测哪个可能就绪哪个没有,尝试猜测,并且如果成功,一些开销很大的系统调用就可以省去了。如果失败,就会调用这些系统调用。已知的使用Linux epoll()已经净提升起码10%了。
  • ACLs : 使用任意规则的任意组合作为某动作的执行条件。
  • TCP 协议检查 : 结合ACL来对请求的任意部分进行检查,然后再进行转发。这就可以执行协议验证而不是盲目的进行转发。比如说允许SSL但拒绝SSH。
  • 更多的负载均衡算法 : 现在,动态加权轮循(Dynamic Round Robin),加权源地址哈希(Weighted Source Hash),加权URL哈希和加权参数哈希(Weighted Parameter Hash)已经实现。其他算法比如Weighted Measured Response Time也很快会实现。

和其他"免费"的负载均衡解决方案不同的是, HAproxy仅被几百或者几千的遍布全球的用户使用, 但是这些用户通常运行很大的站点, 每天有数百万的点击量和几Gbps甚至几万兆(terabytes)吞吐量。 他们需要7x24的可用性并且愿意承受免费软件解决方案的风险, 同时有这些使用技术. 通常, 这种解决方案仅配置为内部使用, 我仅在他们提供给我反馈或者需要新特性的时候才会知道.

设计选择和历史

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

我从1996当我写Webroute时开始写一个简单的HTTP代理,此代理能建立一个modem访问。 但它的多进程模型的使得它从性能上只能用于home access。两年后,1998年,我写了事件驱动 的ZProx, 用于压缩TCP流量以加速modem线路。 那时我开始理解事件驱动模型的困难。2000年,在对一个小的应用程序做基准测试时,我大幅的修改了 Zprox以加入HTTP头重写支持。HAProxy的原型由此诞生。第一个版本自身并不实现负载均衡, 但很快被证明那是很需要的。

现在到了2007年, HAproxy的核心引擎已经很可靠而且很健壮,尽管代码里有许多的注释。事件驱动程序是健壮同时又 易崩溃的: 它的代码需要很小心的修改,但结果是它能处理高负载且能够不被攻击打倒。这也是为什么HAProxy仅有限的一些 特性的原因。

需求 SSL 和 Keep-Alive支持的用户。这些特性会使代码变得非常复杂而且会导致多个版本易于崩溃。而且, 这两功能都对会使性能下降:

  • 在负载均衡器本身上实现SSL意味着它自己会成为瓶颈。当负载均衡器的CPU耗尽,响应时间会增大,唯一的解决办法是在这个负载均衡器前再增加其他负载均衡器。唯一可扩展的解决办法是在客户端和负载均衡器间增设一个SSL/Cache层。无论如何,这可以使小型站点能够插入SSL,这个目前还在研究中。
  • 在CPU比现在慢100倍的时候,Keep-alive被发明以用来降低CPU的使用率。保持的连接(persistent connections )会消耗很多内存 但除非客户端打开了keep-alive,否则没有任何作用。 2006的今天, CPU已经很便宜但是内存却因为架构或价格仍然限制在几GB内。如果某站点需要keep-alive, 这真是一个问题。 高负载的站点通常禁止keep-alive以支持最大的并发客户。不使用keep-alive的真正弊端是会轻微的增大获取网页对象(Object)的时延。浏览器会对无keep-alive的站点发起双倍的并发请求来弥补这个不足。

不过,我计划在未来的版本中实现这两个功能,因为似乎有些用户的可用性需求高于性能需求,而且对他们来说, 使用这两特性并不会影响他们的性能而且可以减少其他组件数目。

支持的平台

HAProxy目前可以可靠的运行于以下(OS)平台:

  • 运行于 x86, x86_64, Alpha, SPARC, MIPS, PARISC的Linux 2.4
  • 运行于 x86, ARM (ixp425), PPC64的Linux 2.6
  • 运行于UltraSPARC 2 and 3 的Solaris 8/9 on
  • 运行于Opteron的Solaris 10
  • 运行于x86的FreeBSD 4.10 - 6.2
  • 运行于i386, amd64, macppc, alpha, sparc64 和 VAX的OpenBSD 3.1 to -current on

运行于Linux 2.6或者打过epoll 补丁的 Linux 内核 2.4上,1.2.5以上版本的haproxy能达到最佳的性能。仅因为一项系统相关的优化:1.1版本默认的poll系统是 select(), 这在大多数操作系统上可用,但是在处理上千个文件描述符时会变得很慢。1.2 默认使用 poll() 替代之前的 select(), 但在某些系统上会比select更慢. 但是, 推荐在Solaris上使用,因为poll在它上面的实现是非常好的. Linux 2.6或打过补丁的Linux 2.4, HAProxy 1.2 默认使用epoll(), epoll在任何压力下都能达到 O(1) 性能, 所以比在其他系统上使用 poll()select() 都更快. FreeBSD因为使用kqueue机制,性能比这个稍强. HAProxy 1.3开始支持这种poller, 但目前并没做基准测试。

基于这些事实,寻找快速负载均衡器的人们可以考虑运行于下列x86或者x86_64硬件的选择:

  1. HAProxy 1.2.13.1+ on Linux 2.4 + epoll
  2. HAProxy 1.2.13.1+ on Linux 2.6.16 + scheduler starvation fixes
  3. HAProxy 1.2.8+ on FreeBSD
  4. HAProxy 1.2.8+ on Solaris 10

注意: 如果你在寻找一个飞速 的web负载均衡解决方案, 我测试过的第二快的平台是HP-DL145 (Dual Opteron-248 at 2.2 GHz)运行于打过 epoll patch的 Linux 内核 2.4 和 haproxy-1.2 上,达到了21000 hits/s 和2 Gbps.对这样一个廉价的系统来说,确实令人很震撼! 最快的是一台 Sun V40Z (Quad Opteron-848 at 2.2 GHz),它在2G的链路上跑到了30000 hits/s . 这比Dual-proc高了50%多, 所以我猜测我们已经到了系统的极限了。另外一方面,系统方面的性能优化也可以大大的提升性能。总之,Dual-Opteron仍然为最佳性价比.

下载HAProxy


延伸阅读:
Web负载均衡:HAproxy 1.4.3 发布
Tags: HAproxy   pr   Proxy  
最新文章
推荐阅读
月点击排行榜
PHP程序员站 Copyright © 2007-2010,PHPERZ.COM All Rights Reserved 粤ICP备07503606号