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

16

这是我的情况(由我的前任设计):

有两个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?还是它将继续在故障的后端和运行的后端之间平衡请求?

我在Apache文档mod_proxymod_proxy_balancer中找到了一些线索,这些线索似乎表明可以检测到故障(“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设置为debug,我也没有看到任何日志记录表明它检测到其中一个后端服务器已经关闭...我想确保我可以百分之百地进行负载均衡后端服务器的维护(当然是一个接一个),而不会影响生产站点。

2个回答

13

http://httpd.apache.org/docs/2.4/mod/mod_proxy.html "BalancerMember parameters"章节,属性=retry:

如果连接池worker与后端服务器处于错误状态,Apache httpd将不会向该服务器转发任何请求,直到超时时间到期。这使得[一种]可以关闭后端服务器进行维护,并在稍后重新上线。值为0表示总是重试处于错误状态的workers,没有超时限制。

然而,还有其他故障条件无法使用mod_whatever捕获,例如,运行已关闭的应用程序的IIS后端。IIS正在运行,因此可以建立连接并读取页面,只是页面始终是500个内部服务器错误。在这种情况下,您将必须使用failonerror来捕获它并将worker强制置于错误状态。

在所有情况下,一旦worker处于错误状态,流量将不会被定向到它。我一直在尝试消耗第一个失败并重试它的不同方法,但似乎总有一些情况会使错误页面返回给客户端。


回复晚了,但这确实对我有帮助。因为正常的Lucid repos只有2.2.14版本,不支持"failonstatus"参数,所以我不得不强制升级到2.2.17版本。暂时添加了natty repos,更新到2.2.17版本,现在一切似乎都正常工作了。谢谢! - Jon Heese
1
@David Newcomb 我找到的唯一可行的解决方案(虽然不太美观)是使用 maxattempts(请参见 http://serverfault.com/questions/503531/apache2-proxy-tomcat6-prevent-503-error-while-starting/503539#503539)。 - Max Leske

1
在“BalancerMember参数”中有一个属性'ping'。阅读文档,如果将'ping'设置为500毫秒,则会在mod_proxy将您定向到BalancerMember之前发送请求。 mod_proxy将等待来自BalancerMember的响应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属性告诉Web服务器在转发请求之前“测试”与后端的连接。对于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”的后缀可以将延迟设置为毫秒。添加此功能是为了避免挂起和繁忙的后端问题。这将增加正常操作期间的网络流量,可能会成为一个问题,但在某些集群节点关闭或繁忙的情况下,它将降低流量。保留html标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接