如何配置 mod_proxy_balancer 以在高负载下正常失败

如何配置 mod_proxy_balancer 以在高负载下正常失败

我们的系统在多个 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 秒后等待空闲的工作进程。

相关内容