在循环模式下,Apache负载平衡无法正常工作

当一个Tomcat服务器出现故障时,我们正面临一些在Apache上进行循环负载平衡的意外行为。

我们的设置:我们在前端使用mod_jk模块,在循环负载分配中使用2个Apache Web服务器进行负载平衡。 我们已经启用会话粘性。 运行应用程序的4个Tomcat服务器之间的负载是平衡的。

有时在负载较重的情况下,如果我们的数据库层出现缓慢的现象,最终Tomcat服务器会进入挂起状态,需要重新启动。 当我们反弹Tomcat服务器的时候,我们看到其他Tomcat服务器中的请求数量猛增,这些服务器也会进入挂起状态,需要重新启动。

最终所有的Tomcat服务器都以类似的方式挂起。

为什么Apache将整个负载转移到一台服务器而不是分配负载?

我们现在正在尝试worker.balancer.method=B ,看看这是否有助于解决我们的问题。

在下面的图片中,我们看到服务线程爆炸,

  • 在服务器1中,当服务器4在大约11.50下降时
  • 在服务器2中,当服务器1在大约11.55下降

在这里输入图像说明在这里输入图像说明在这里输入图像说明

(发表一个答案,而不是评论,因为它可能太长):

我不是说“F5可以更好地处理这个问题”,但是:

  • 我更喜欢通过负载平衡器来执行负载平衡任务:F5 big ip,以及其他devise用于完成这项工作的产品。
  • 由于你有一个小的设置(4个tomcat),我没有理由现在有2个级别的负载平衡。 只有F5检查自定义jsp页面返回200是imho更简单。
  • 我记得的最糟糕的缺点是:当一个节点closures时,一些stream量仍然被引导到它,直到下一次健康检查(默认约5秒iirc)。 会话丢失,如果一个节点是closures的(也许tomcat提供了解决方法,例如数据库中的会话…)。

我不认为find“中立”的公共基准testing/testing关于更好的设备/软件来做负载平衡并不容易。 我只能build议你自己做,如果你有空闲的f5。

一般来说,我会让f5尽可能地做到这一点:负载均衡,ssl证书,url重写,asm,…不是因为f5更好,而是因为在同一地点拥有一切都很方便。 不幸的是,当httpstream量开始增长超过几百MB时,您必须开始通过apache而不是f5完成一些工作。