2017-07-19 44 views
1

我们在一个Apache集群下运行多个Tomcat JVM。如果我们关闭除一个之外的所有JVM,则有时会得到503s。如果我们将 重试间隔增加到180(从重试= 10),问题就会消失。这使我想起 这个问题,Apache如何检测已停止的Tomcat JVM?如果我 有一个包含多个JVM的集群,并且其中一些JVM已关闭, Apache如何发现这个集群?在我阅读的某个地方,Apache使用真实的 请求来确定后端JVM的运行状况。在这种情况下,如果JVM停止,那么 请求会失败(使用5xx)吗?为什么更高的重试值是 有什么不同?你认为引入ping可能有帮助吗?Apache如何检测停止的Tomcat JVM?

如果有人可以解释一下或指向我一些文档,那将是非常棒的。

我们使用Apache 2.4.10,mod_proxy,通过请求LB算法,粘性会话, Keepalive处于开启状态,对于所有平衡器成员,ttl = 300。

谢谢!

回答

0

那么让我们来看看你的配置实际上在做什么,然后转移到可能有帮助的地方。

[docs]

retry - 在这里,要么你给自己定了它10180你指定是多少时间,Apache将考虑您的后端服务器下来,因而不会送他的请求。因此,价值越高,您就可以获得后端完全启动的时间,但您将更多负载加载到其他服务器上,因为您的服务器时间更长。

stickysession - 在这里,如果你失去了后端服务器,无论出于何种原因,所有会话都会出现错误。

现在好了,我们所描述的相关变量,您的具体情况让我们清楚地表明的Apache的mod_proxy没有一个健康检查装置的嵌入式,它更新后端的基于真实请求的响应状态。

所以,当前的配置工作过程如下:

  1. 请求到达阿帕奇
  2. 阿帕奇其发送到后端活着
  3. 如果请求得到一个错误的HTTP代码为响应或不获取响应,Apache将后端置于ERROR状态。
  4. 重试时间通过后,apache再次发送到后端服务器请求。

因此,阅读以上内容即可了解到第一个到达后端服务器的请求将会出现错误页面。

你可以做的事情之一的确是ping,根据文档将在发送任何请求之前检查后端。考虑当然会产生的开销。

虽然我建议你配置mod_proxy_ajp,它为tomcat后端故障转移检测提供额外的功能(和配置ofc)。

+0

:我尝试'ping'与'retry = 10',但没有任何区别。我仍然可以轻松地重现503错误。我在通过'error.log'时注意到的另一件事。如果我有10个Tomcat JVM,其中9个已关闭,而我的好JVM位于列表中的第7位;那么对于6个停止的JVM,Apache会打印出以下错误:“AH01114:HTTP:无法与后端:xxx'连接,直到达到良好的JVM。但请求没有失败。再说一次,如果我设置'retry = 180'或'retry = 60',这个工作很好。当'retry = 10'时,90%的时间失败。 – suv3ndu

+0

您进行测试多长时间?可以说900秒的请求吗?加上ping:'对于HTTP,它导致mod_proxy_http发送一个100-继续到后端(只对HTTP/1.1有效 - 对于非HTTP/1.1后端,这个属性没有作用)'这是来自文档,这就是我建议的ajp (我对你旁边的jvm后台一无所知)。 – zochamx

+0

@zochmax是的,我们使用的是mod_proxy_http,所以'ping'将起作用。我们运行了2-3个小时的所有测试。我打算在Apache中打开更多的日志记录来理解这种行为。 – suv3ndu