我们有一个在多个tomcat中有一个Apache实例的系统。 这些tomcats然后连接到各种数据库。 我们用mod_proxy_balancer来平衡tomcat的负载。
目前我们每秒收到100个请求,Apache服务器的负载很低,但是由于数据库对tomcats的操作非常繁重,所以负载大约有25%(我估计他们可以处理)。
在几个星期之内发生了一件事情,我们估计我们的请求会跳得很厉害,可能是10倍。
我正在尽我所能减轻我们的雄猫的负担,但我知道我们将用尽能力,所以我想优雅地失败。 通过这个我的意思是,而不是试图处理太多的连接,所有的超时,我希望Apache以某种方式监测平均响应时间,只要响应时间到Tomcat超过某个阈值,我想要一个错误页面显示。
这意味着幸运的用户仍然可以快速获得页面,而不幸的用户可以快速获取错误页面。 而不是每个人都等待太久的页面,最终每个人都会超时,而数据库被淹没在从未使用的查询中。
希望这是有道理的,所以我正在寻找如何实现这一目标的build议。
谢谢
我把这个称为“Sorry Server”。 如果您使用的是Apache 2.2,则可以将另一台主机添加到您的LB池作为热备用,而当实际的应用服务器达到容量时,您的平衡器会将请求发送到“Sorry Server”,直到应用程序服务器再次可用。 这里有一个大概的想法:
<Proxy balancer://yourapp> BalancerMember http://10.0.0.1:8080 retry=5 max=50 BalancerMember http://10.0.0.2:8080 retry=5 max=50 BalancerMember http://10.0.0.3:8080 retry=5 max=50 BalancerMember http://10.0.0.4:8080 retry=5 max=50 # the hot standby on server2 BalancerMember http://10.0.0.5:80 status=+H </Proxy> <Location /app> ProxyPass balancer://yourapp </Location>
其实你也可以在你的负载均衡器上设置一个额外的虚拟主机,让它服务于“Sorry Server”页面。 希望帮助:)
几个注意事项:
“max”参数设置每个subprocess的最大连接数 ,这取决于您正在使用的MPM,不会创build最大并发连接数。 例如,prefork MPM将几乎完全无用。
相反,我会设置它使用“超时”参数和自定义的503错误页面。 将超时值设置为一个理智的值,超过这个值你不希望用户等待,并在503错误页面中input一些有意义的消息。
所以:
ErrorDocument 503 /sitebusy.html <Proxy balancer://yourapp> BalancerMember http://10.0.0.1:8080 timeout=15 retry=5 BalancerMember http://10.0.0.2:8080 timeout=15 retry=5 BalancerMember http://10.0.0.3:8080 timeout=15 retry=5 BalancerMember http://10.0.0.4:8080 timeout=15 retry=5 </Proxy> ProxyPass /app balancer://yourapp timeout=5
使用这种设置,如果每个工作人员的响应时间超过15秒,则每个工人都将进入失败状态,并在5秒钟之后将其放回池中。 平衡器将在5秒钟等待一名自由工人。