当其中一个 Tomcat 服务器发生故障时,我们在 Apache 上的循环负载平衡中遇到了一些意外行为。
我们的设置:我们在前端有 2 个 Apache Web 服务器,使用 mod_jk 模块进行负载平衡和循环负载分配。我们已启用会话粘性。负载在运行应用程序的 4 个 Tomcat 服务器之间平衡。
有时在高负载下,如果我们的数据库层速度缓慢,最终其中一个 Tomcat 服务器会进入挂起状态,需要重新启动。当我们重新启动 Tomcat 服务器时,我们会看到另一个 Tomcat 服务器中的请求激增,然后该服务器也会进入挂起状态并需要重新启动。
最终,所有 Tomcat 服务器都以类似的方式挂起。
为什么Apache将整个负载转移到一台服务器上而不是分散负载?
我们正在尝试worker.balancer.method=B
看看这是否有助于解决我们的问题。
在下面的图片中,我们可以看到服务线程激增,
- 当服务器 4 在 11.50 左右宕机时,服务器 1 中
- 当服务器 1 在 11.55 左右宕机时,服务器 2 中
答案1
(发布答案而不是评论,因为可能太长):
我并不是说“F5 可以解决这个问题更好的方式”,但是:
- 我更喜欢通过负载平衡器来完成负载平衡任务:F5 big ip 以及其他产品都是为完成这项工作而设计的。
- 由于您的设置很小(4 个 tomcat),我认为目前没有理由进行 2 级负载平衡。仅使用 F5 检查自定义 jsp 页面是否返回 200 在我看来要简单得多。
- 我记得最糟糕的缺点是:当一个节点关闭时,一些流量仍然会定向到该节点,直到下一次健康检查(默认情况下约 5 秒)。如果节点关闭,会话将丢失(也许 tomcat 提供了解决方法,例如数据库中的会话...)。
我认为要找到有关实现负载平衡的更好设备/软件的“中立”公共基准测试/测试并不容易。如果您有备用的 f5 进行分期,我只能建议您自己做。
作为一般规则,我会让 f5 做尽可能多的事情:负载平衡、ssl 证书、url 重写、asm……不是因为 f5 更好,而是因为将所有东西放在同一个地方很方便。不幸的是,当 http 流量开始增长到几百 MB 以上时,您必须开始让 apache 而不是 f5 来完成一些工作。