我们的系统在多个 tomcat 前面有一个 Apache 实例。然后这些 tomcat 连接到各种数据库。我们使用 mod_proxy_balancer 将负载平衡到 tomcat。
目前我们每秒收到 100 个请求,Apache 服务器上的负载很低,但由于 tomcat 上的数据库操作繁重,那里的负载大约为 25%(我估计它们可以处理的负载)。
几周后就会发生一件大事,我们估计我们的请求量会大幅增加,可能达到 10 倍。
我正在尽一切努力减少 Tomcat 的负载,但我知道我们的容量即将耗尽,所以我希望能优雅地失败。我的意思是,我希望 Apache 能够以某种方式监控平均响应时间,而不是尝试处理过多的连接,而这些连接全部超时,一旦 Tomcat 的响应时间超过某个阈值,我就希望显示一个错误页面。
这意味着幸运的用户仍能快速获得页面,不幸的用户则能快速获得错误页面。而不是每个人都等待太长时间才能获得页面,最终导致每个人都超时,数据库被从未使用过的查询淹没。
希望这是有意义的,所以我正在寻找有关如何实现这一目标的建议。
谢谢
答案1
我将其称为“抱歉服务器”。如果您使用的是 Apache 2.2,则可以将另一台主机作为热备用添加到您的 LB 池中,当实际应用服务器达到容量上限时,您的平衡器会将请求定向到“抱歉服务器”,直到应用服务器再次可用。这是一个粗略的想法:
<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>
实际上,您也可以在负载均衡器机器上设置一个额外的虚拟主机,让它自己提供“抱歉服务器”页面。希望这能有所帮助 :)
答案2
几点说明:
“max”参数设置最大连接数每个子进程,这取决于您使用的 MPM,不会创建并发连接数的硬性最大值。例如,prefork MPM 对此几乎完全无用。
相反,我会使用“超时”参数和自定义的 503 错误页面进行设置。将超时设置为合理的值,超过该值您就不希望用户等待,并在 503 错误页面中放置一些有意义的消息。
所以:
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 秒后等待空闲的工作进程。