Apache代理负载平衡后端服务器故障检测

时间:2012-08-08 16:29:10

标签: apache load-balancing detection reverse-proxy failover

这是我的场景(由我的前任设计):

两台Apache服务器为许多混合后端Web服务器(Apache,IIS,Tomcat等)提供反向代理服务。有些网站我们有多个后端Web服务器,在这种情况下,我们会执行以下操作:

<Proxy balancer://www.example.com>
    BalancerMember http://192.168.1.40:80
    BalancerMember http://192.168.1.41:80
</Proxy>
<VirtualHost *:80>
    ServerName www.example.com:80
    CustomLog /var/log/apache2/www.example.com.log combined
    <Location />
        Order allow,deny
        Allow from all
        ProxyPass balancer://www.example.com/
        ProxyPassReverse balancer://www.example.com/
    </Location>
</VirtualHost>

所以在这个例子中,我在代理服务器的配置中有一个站点(www.example.com),并且该站点被代理到两个后端服务器中的一个或另一个,192.168.1.40和.41

我正在对此进行评估,以确保我们对所有Web服务都具有容错能力(出于这个原因,我已经将两个反向代理服务器放入共享IP群集中),我想确保负载平衡的后端服务器也具有容错能力。但是我无法确定是否在mod_proxy_balancer模块中内置了后端故障检测(以及避免故障后端服务器的逻辑)...

因此,如果192.168.202.40发生故障,Apache会检测到这个(我会理解它是否首先需要一个失败的请求)并自动将所有请求路由到另一个后端192.168.202.41?或者它会继续在失败的后端和运营后端之间平衡请求吗?

我在mod_proxymod_proxy_balancer的Apache文档中找到了一些线索,这些线索似乎表明可以检测到失败(“maxattempts =放弃之前的最大故障转移尝试次数。”,“ failonstatus = HTTP状态代码的单个或以逗号分隔的列表。如果设置,当后端返回列表中的任何状态代码时,这将强制工作人员进入错误状态。“),但经过几天的搜索,我发现没有确凿的说法,确定(或至少“应该”)检测到后端故障和恢复。

我会说大多数搜索结果都使用AJP协议将流量传递给后端服务器,这显然支持故障检测 - 但我的后端是Apache,IIS,Tomcat等的混合,我相当肯定他们中的许多人都不支持AJP。它们也是Windows 2k3 / 2k8和Linux(主要是Ubuntu Lucid)盒子的混合体,运行各种不同的应用程序,具有各种不同的要求,所以像Backhand和LVS这样的附加模块对我来说不是一个选择。

我还试图通过创建一个像这样的新测试网站来实验测试这个功能:

<Proxy balancer://test.example.com>
    BalancerMember http://192.168.1.40:80
    BalancerMember http://192.168.1.200:80
</Proxy>
<VirtualHost *:80>
    ServerName test.example.com:80
    CustomLog /var/log/apache2/test.example.com.log combined
    LogLevel debug
    <Location />
        Order allow,deny
        Allow from all
        ProxyPass balancer://test.example.com/
        ProxyPassReverse balancer://test.example.com/
    </Location>
</VirtualHost>

其中192.168.1.200是未运行任何Web服务器的伪造地址,用于模拟后端故障。对于一堆不同的客户端计算机,测试站点没有问题,但即使将LogLevel设置为调试,我也没有看到任何记录,表明它检测到其中一个后端服务器已关闭......我想100%确定我可以将负载均衡的后端用于维护(当然一次一个),而不会影响生产站点。

2 个答案:

答案 0 :(得分:12)

http://httpd.apache.org/docs/2.4/mod/mod_proxy.html“BalancerMember参数”部分,property = retry:

  

如果到后端服务器的连接池工作程序出错   状态,Apache httpd将不会转发任何请求到该服务器,直到   超时到期。这使[一]能够关闭后端   用于维护的服务器,稍后将其重新联机。值为0   表示始终在没有超时的情况下重试处于错误状态的工作程序。

但是还有其他失败条件无法使用mod_whatever捕获,例如,IIS后端运行已关闭的应用程序。 IIS已启动,因此可以建立连接并可以读取页面,只是页面始终是500内部服务器错误。在这里,您必须使用failonerror来捕获它并强制工作者进入错误状态。

在所有情况下,一旦工人处于错误状态,流量就不会被定向到它。我一直在尝试使用不同的方式来消耗第一次失败并重试它,但似乎总会出现错误页面将其返回给客户端的情况。

答案 1 :(得分:0)

有一个属性&#39; ping&#39;在&#39; BalancerMember参数&#39;

阅读文档听起来像是&#39; ping&#39;设置为500毫秒将在mod_proxy将您引导至BalancerMember之前发送请求。对于来自BalancerMember的响应,mod_proxy将等待500毫秒,如果mod_proxy没有得到响应,它将会使BalancerMember进入错误状态。

我厌倦了实施这个,但它似乎没有帮助指导一个现场的BalancerMember。

<Proxy balancer://APICluster>
    BalancerMember https://api01 route=qa-api1 ttl=5 ping=500ms
    BalancerMember https://api02 route=qa-api2 ttl=5 ping=500ms
    ProxySet lbmethod=bybusyness stickysession=ROUTEID
</Proxy>

http://httpd.apache.org/docs/2.4/mod/mod_proxy.html

  

Ping属性告诉网络服务器&#34; test&#34;转发请求之前与后端的连接。对于AJP,它会导致mod_proxy_ajp在ajp13连接上发送CPING请求(在Tomcat 3.3.2 +,4.1.28+和5.0.13+上实现)。对于HTTP,它会导致mod_proxy_http向后端发送100-Continue(仅对HTTP / 1.1有效 - 对于非HTTP / 1.1后端,此属性无效)。在这两种情况下,参数都是等待回复的延迟(以秒为单位)。添加此功能是为了避免挂起和忙碌后端出现问题。这将增加正常操作期间的网络流量,这可能是一个问题,但是如果某些群集节点关闭或忙碌,它将降低流量。通过添加ms的后缀,延迟也可以以毫秒为单位进行设置。