首页 > 代码库 > 负载均衡软件之HAProxy

负载均衡软件之HAProxy

岁月就像海边的风,几乎都对社会现状不满,几乎都对事业随遇而安,几乎都为下一代瞎操心,几乎都将未来交给习惯。

    一段很有意思,也富有哲学的话,当我们对事业随遇而安的话,我们就会被时代拉下。

    虽然我们不用HAProxy,但是我们不能固步自封,还是需要不断的学习。

 

    本文很多内容没有经过具体考证,请酌情参考。

   

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

 

    据说HAProxy可能是使用最广泛的的软件负载工具。

 

    根据官方文档,HAProxy可以跑满10Gbps-New benchmark of HAProxy at 10 Gbps using Myricom‘s 10GbENICs (Myri-10G PCI-Express),这个数值作为软件级负载均衡器是相当惊人的;

    查看了官方相关的文档,没有提到测试文件具体的背景,我们都知道,处理静态文件和动态文件差异很大,因此这个数值,我们知道就可以了。

HAProxy 支持全透明代理(已具备硬件防火墙的典型特点):可以用客户端IP地址或者任何其他地址来连接后端服务器. 这个特性仅在Linux 2.4/2.6内核打了cttproxy补丁后才可以使用. 这个特性也使得为某特殊服务器处理部分流量同时又不修改服务器的地址成为可能。

HAProxy现多于线上的Mysql集群环境,我们常用于它作为MySQL(读)负载均衡;

HAProxy自带强大的监控服务器状态的页面,实际环境中我们可以进行邮件或短信报警;

HAProxy支持虚拟主机;

HAProxy特别适用于那些负载特大的web站点, 这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上。

在功能上,能以proxy反向代理方式实现WEB均衡负载,这样的产品有很多。包括lvs,Nginx,ApacheProxy,lighttpd等。

 

 

一些重要参数和使用

mode   http

option httplog

log 127.0.0.1 local0 info

这两个选项打开了HAProxy的大多数功能,如果你让HAProxy承载HTTP流量的话你一定也有这个设置。mode http表示HAProxy将检查传入的HTTP请求,如果请求无效便拒绝它。

这个模式允许你记录HTTP请求

这些日志给我们展示了请求的丰富细节——从请求的URL到连接花费的时间、下载耗时、应答流的并发连接总数等许多信息。

如果要了解这些日志信息的详细解释的话,看一下HAProxy文档的日志部分

第三行

log 127.0.0.1 local0 info

开启haproxy记录日志到syslog。local0有一个指定的守护进程监听请求,并将收到的haproxy日志记录到一个日志文件中。

注意,启用info级的日志级别意味着HAProxy将记录每一个传入的请求。对于长时间运行的服务器来说,这意味着日志文件早晚会占满硬盘。有一个数据整理策略很重要——定时将日志压缩后放到备份服务器上或者删除。

option http-server-close

假设你有一台HAProxy前端与十个不同的后端通信,且这十个后端不支持HTTPkeep-alive。这个设置让HAProxy在客户端和前端之间保持一个持久的连接,并在所有后端服务器之间轮询HTTP请求。当然,要发挥这个设置的功效的话需要客户端同样启用keep-alive。

timeout client 30s

timeout server 30s

这两个设置一起用来设置 HAProxy发送请求的超时时长。实际上,HAProxy等待服务器返回信息给客户端需要多久呢?大多数应用都有某种最大延迟时间,因此你需要添加超时时长。对我们来说,API等待响应的最长时间是30秒,所以每个内部服务根据自身的服务级等级协议(SLA)都应该设置低于30秒的超时时长。注意:如果服务器缓慢地以流的方式传输一个字节,也就是每29秒传输一个字节的话,你将不能触发读超时,所以你可能需要有一个单独的线程监控这样的请求,以保证在适当的时间内完成传输。你还应当把客户端和服务端的超时时长设置为相同的值-即套接口上所期望的读超时时长。

默认情况下,HAProxy将试图进行3次连接请求。因此30秒的连接超时实际上是120秒的连接超时。

 

timeout connect 3000

这是一个不同于客户端和服务端超时时长的超时时长!它是HAProxy应当用来试图连接主机所花费的时长。可以设置为与服务器超时时长30秒相同的值,因此如果主机宕机的话,HAProxy将试图连接同一个主机30秒。当服务器和客户端主机位于同一个机器上或者在同一个局域网内(或者AZ主机的附近)的时候,这样的连接通常发生在毫秒级。我们允许在进一步处理默认的重传窗口时等待3秒,并且允许有小量的缓冲。

不像服务器超时时长,连接超时时长隐含着客户端的重新连接请求是安全的这层意思。

retries 2

option redispatch

如果第一台主机关机了,那么通常假设HAProxy自动给第二台主机发送请求。不过这仅仅在HAProxy对这个主机进行健康检查后并标记这台主机已经关机的情况下才是这样的。如果一台主机关机了而且对它的健康检查花费了20秒,那么这时你正在对这台主机进行可能的20秒的无效请求。重新分发选项让最终的连接请求发送给另一台下游主机上,因此不同主机发送各自的请求在某种程度上保护了已经不健康的主机。

这两个设置混合在一起缩减重试次数到2,并且这也意味着在放弃这个连接并对另一台主机进行连接之前,我们试图对这台主机进行连接的最大超时时长只有8秒。

option httpchk GET /healthcheck

默认情况下,HAProxy只是对主机打开了一个TCP连接来检查这台主机是否启动。这种ping只能检测这台主机是否关机,不过不能确定它是不健康的(磁盘损坏,网络连接不正常)。httpchk选项将给位于后端的终端节点发送HTTP请求。后端可以进行自检,并回答自身是否健康。健康检查未通过将使HAProxy给这台主机不发送任何包。

 

据说淘宝网有个别内容在使用HAProxy,没有经过核实,仅供参考。

技术分享

LVS是一种四层负载设备,把用户的请求进行了“转移”;

HaProxy在这里是作为7层负载设备使用,把用户的HTTP请求进行了“转发”。

Squid是一种代理服务器组件,在这里承担代理服务器和WEB加速器的功能。

 

一些资料:

利用Haproxy实现http和TCP反向代理和负载均衡(入门和技术验证)

http://www.cnblogs.com/firewing/archive/2012/11/06/2756553.html

 


负载均衡软件之HAProxy