【发布时间】:2012-08-05 19:50:47
【问题描述】:
这是我的场景(由我的前任设计):
两台 Apache 服务器为多个混合后端 Web 服务器(Apache、IIS、Tomcat 等)提供反向代理服务。有些网站我们有多个后端网络服务器,在这些情况下,我们会执行以下操作:
<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_proxy 和 mod_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% 确保我可以在不影响生产站点的情况下关闭负载平衡的后端进行维护(当然,一次一个)。
【问题讨论】:
标签: apache load-balancing detection reverse-proxy failover