Apache代理负载均衡后端服务器故障检测
这里是我的情况(我的前任设计):Apache代理负载均衡后端服务器故障检测
服务反向代理税,一些混合后端Web服务器(Apache的,IIS,Tomcat的,等等)两个Apache服务器。有一些网站对此我们有多个后端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_proxy和mod_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设置为调试,我也没有看到任何记录的内容,表明它检测到后端服务器之一已关闭。我希望百分之百地确保我可以将我们的负载均衡后端用于维护(当然是一次一个),而不会影响生产站点。
http://httpd.apache.org/docs/2.4/mod/mod_proxy.html节“BalancerMember参数”,属性=重试:
如果连接池工作到后端服务器是错误 状态,阿帕奇的httpd将不会对服务器进行任何请求转发到 的超时到期。这使得[一个]可以关闭后台服务器以进行维护,并在稍后恢复联机。值为0 表示始终重试工作人员处于错误状态,没有超时。
但是还有其他故障情况不会使用mod_whatever捕获,例如,IIS后端运行的应用程序已关闭。 IIS已启动,因此可以建立连接并且可以读取页面,只是该页面始终是500内部服务器错误。在这里,您将不得不使用failonerror来捕获它并强制工作人员进入错误状态。
在所有情况下,一旦工作人员处于错误状态,流量将不会被引导至该流量。我一直在尝试使用不同的方式来消费第一次失败并重试它,但似乎总是有错误页面将其返回给客户端的情况。
有一个在“BalancerMember参数”
属性“平”读这听起来像设置为500ms的mod_proxy的引导你到一个BalancerMember之前会发送一个请求“平”的文档。 mod_proxy将等待500ms来处理来自BalancerMember的响应,并且如果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
平属性告诉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的后缀,延迟也可以以毫秒为单位进行设置。
在这里迟到的回复,但这确实帮了我。 我不得不强制升级到2.2.17,因为普通的Lucid repos只有2.2.14,不支持“failonstatus”参数。暂时添加了natty回购协议,更新至2.2.17,现在一切似乎都奏效了。 谢谢! – 2013-03-26 20:33:42
@David Newcomb我发现的唯一解决方案实际上可行(尽管它很丑)是使用'maxattempts'(请参阅http://serverfault.com/questions/503531/apache2-proxy-tomcat6-prevent-503-error -while起动/ 503539#503539)。 – 2013-04-29 13:15:00