17611538698
webmaster@21cto.com

HAProxy负载均衡与最佳实践

资讯 0 3013 2017-03-18 12:00:46

8bbeb2ed9280551b8a845a530a690a8e.png


负载均衡设备是网站应用的神经系统,它负责接管所有客户端的请求,然后将它们公平的分发到不同的PHP应用程序服务器。
这里我们要谈的是一个被称为反向代理的服务器。


  这里我们讲一些其他人不会说到的技巧。
  当使用了负载衡设备,数据的输入输出就要经过负载均衡设备来分发。就不要再和用户直接通信,而只与负载均衡设备交互,根据用户的HTTP请求做响应。
  负载均衡设备包括软件和硬件设备。我不推荐大家使用硬件负载设备,主要原因如下:
  1、价格昂贵。超过几十万RMB,对创业预算不高的朋友来讲,完全可以使用开源软件,把它做为薪水多找一些好员工进来。
  2、硬件负载对我们来讲,是一个黑匣子。里面的算法完全不是透明的。
  因此,我们拥抱开源,使用自己的软件。
  如果条件允许,可以布署几个负载均衡,如果只有一个,也许会引发单点故障,当故障发生后,就需要有足够的备份和预案来处理流量。
  当流量已经把两个负载均衡设备,就需要有一个负载设备来做备份。否则,一旦有一个主负载故障,余下的流量全部压上第二个,也将无法承载流量。
  我们会在后面给你分享,怎么用DNS来做负载均衡设备做流量拆分。
  关于HAProxy
  HAProxy是软件负载均衡的一个优秀解决方案。
  它是用C语言开发的,基于事件来构建一个纯粹的反向代理服务器,因此,它相当快速和轻量。
  HAProxyCPU和内存占用极小,这意味着它可以媲美硬件。HAProxy网站上列出了2009年以来的一些基准测试。它每秒可以承载10,8000个HTTP请求,使用10G的网络完全饱合。
  此外,HAProxy拥有自2002年以后没有出现流量阻塞的记录。
  优于Nginx
  Nginx是一个非常好的Web服务器,包括它自己的反向代理模块。Nginx可以做一个很好的负载均衡设备。但是选择HAProxy是更好的选择,原因如下:
  1、HAProxy是一个纯粹的反向代理工具。它只做这一件,其它不做。
  这可以是个优点,对于你来说也可能是个缺点,取决你负载均衡的需求。
  2、对于大多数情况,HAProxy是一个非常合适的选择
  如果你需要更多的能力和灵活性,可以选择Nginx,虽然Nginx占用的内存和CPU略高一些。
  /uploads/fox/18084841_0.jpeg
  4层与7层
  HAProxy可以工作在两种模式:一个是TCP(第4层)和HTTP(第7层) 。在TCP模式下,HAProxy把原始TCP数据包转发到应用程序服务器,此模式是将HTTP头解析转发,这比HTTP(7层)械会节省CPU占用50%左右。
  而Nginx现在来看,它被设计成了一个Web Server,而且只支持HTTP(7层)负载均衡。
  说到这儿,你可能微微一笑,说没什么关系,HTTP是一个小小开销,除非是特别大的流量,这就是问题了。
  举个例子,使用TCP做为负载均衡,有时候会搞丢客户端的IP地址。比如客户端192.168.1.19命中了负载均衡器(IP地址10.0.9.1),此设备将请求转发到Nginx服务器。但是PHP端使用$_SERVER['REMOTE_ADDR']的内容是10.0.9.1,而不是192.168.1.19.
  你也许会说,很多负载均衡设备会把真实IP放在HTTP头的上面,类似于$_SERVER['X-Forwarded-For'],可以检查得到。但是事实挺遗憾的是『没有』。
  为什么呢?
  这是因为TCP数据包从负载均衡设备重新包装并发送,用了新的IP地址。所有的4层负载均衡都不会解析和重建HTTP头,所以我们的PHP就永远得不到它想要的X-Forwareded-For的值。
  有时我们要相信自己的选择,就像选择HAProxy是正确的一样。
  此话怎讲?这个叫HAProxy的家伙,他们自己创建一个『PROXY』协议,它让我们可以在TCP层增加一些代理信息,比如REMOTE_ADDR。当然,这个PROXY协议只适合运行在一些特定的软件上,幸运的是Nginx也支持PROXY协议。
  其实,事情是难以置信的简单了。我们只需要在Nginx配置中添加real_ip_header proxy_protocol一行就可以了。
  是不是很美好?我们下节见。


  作者:洛逸
  说明:转载本文请后台留言,允许后可转载。


评论