Tomcat 通过 AJP 实现的 Apache 负载均衡器限制

Tomcat 通过 AJP 实现的 Apache 负载均衡器限制

我让 Apache 充当 3 个 Tomcat 服务器前面的负载平衡器。有时,Apache 会返回 503 响应,我想完全删除它。所有 4 个服务器在 CPU、内存或磁盘方面都没有承受很大的负载,所以我有点不确定是什么达到了它的极限或原因。当所有工作程序都处于错误状态时,就会返回 503 - 无论这意味着什么。以下是详细信息:

Apache 配置:

<IfModule mpm_prefork_module>
  StartServers           30
  MinSpareServers        30
  MaxSpareServers        60
  MaxClients            200
  MaxRequestsPerChild  1000
</IfModule>

...

<Proxy *>
  AddDefaultCharset Off
  Order deny,allow
  Allow from all
</Proxy>

# Tomcat HA cluster
<Proxy balancer://mycluster>
  BalancerMember ajp://10.176.201.9:8009 keepalive=On retry=1 timeout=1 ping=1
  BalancerMember ajp://10.176.201.10:8009 keepalive=On retry=1 timeout=1 ping=1
  BalancerMember ajp://10.176.219.168:8009 keepalive=On retry=1 timeout=1 ping=1
</Proxy>

# Passes thru track. or api.
ProxyPreserveHost On
ProxyStatus On

# Original tracker
ProxyPass /m  balancer://mycluster/m
ProxyPassReverse /m balancer://mycluster/m

Tomcat 配置:

<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JasperListener" />
  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />

  <Service name="Catalina">
    <Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" />

    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

    <Engine name="Catalina" defaultHost="localhost">
      <Host name="localhost"  appBase="webapps"
          unpackWARs="true" autoDeploy="true"
          xmlValidation="false" xmlNamespaceAware="false">
    </Engine>
  </Service>
</Server>

Apache 错误日志:

[2010 年 3 月 22 日星期一 18:39:47] [错误](70007)指定的超时已过期:代理:AJP:尝试连接到 10.176.201.10:8009(10.176.201.10)失败
[2010 年 3 月 22 日星期一 18:39:47] [错误] ap_proxy_connect_backend 禁用 (10.176.201.10) 的工作程序
[2010 年 3 月 22 日星期一 18:39:47] [错误] 代理:AJP:无法连接到后端:10.176.201.10
[2010 年 3 月 22 日星期一 18:39:47] [错误](70007)指定的超时已过期:代理:AJP:尝试连接到 10.176.201.9:8009(10.176.201.9)失败
[2010 年 3 月 22 日星期一 18:39:47] [错误] ap_proxy_connect_backend 禁用 (10.176.201.9) 的工作程序
[2010 年 3 月 22 日星期一 18:39:47] [错误] 代理:AJP:无法连接到后端:10.176.201.9
[2010 年 3 月 22 日星期一 18:39:47] [错误](70007)指定的超时已过期:代理:AJP:尝试连接到 10.176.219.168:8009(10.176.219.168)失败
[2010 年 3 月 22 日星期一 18:39:47] [错误] ap_proxy_connect_backend 禁用 (10.176.219.168) 的工作程序
[2010 年 3 月 22 日星期一 18:39:47] [错误] 代理:AJP:无法连接到后端:10.176.219.168
[2010 年 3 月 22 日星期一 18:39:47] [错误] 代理:BALANCER:(balancer://mycluster)。所有工作程序都处于错误状态
[2010 年 3 月 22 日星期一 18:39:47] [错误] 代理:BALANCER:(balancer://mycluster)。所有工作程序都处于错误状态
[2010 年 3 月 22 日星期一 18:39:47] [错误] 代理:BALANCER:(balancer://mycluster)。所有工作程序都处于错误状态
[2010 年 3 月 22 日星期一 18:39:47] [错误] 代理:BALANCER:(balancer://mycluster)。所有工作程序都处于错误状态
[2010 年 3 月 22 日星期一 18:39:47] [错误] 代理:BALANCER:(balancer://mycluster)。所有工作程序都处于错误状态
[2010 年 3 月 22 日星期一 18:39:47] [错误] 代理:BALANCER:(balancer://mycluster)。所有工作程序都处于错误状态

负载均衡器top信息:

顶部 - 23:44:11 启动 210 天,4:32,1 个用户,平均负载:0.10、0.11、0.09
任务:共 135 个,其中 2 个正在运行,133 个正在休眠,0 个已停止,0 个僵尸
CPU:0.1%us,0.2%sy,0.0%ni,99.2%id,0.1%wa,0.0%hi,0.1%si,0.3%st
内存:总计 524508k,已用 517132k,可用 7376k,缓冲区 9124k
交换:总计 1048568k,已使用 352k,可用 1048216k,缓存 334720k

Tomcattop信息:

顶部 - 23:47:12 启动 210 天,3:07,1 个用户,平均负载:0.02、0.04、0.00
任务:共 63 个,1 个正在运行,62 个正在休眠,0 个已停止,0 个僵尸
CPU:0.2%us,0.0%sy,0.0%ni,99.8%id,0.1%wa,0.0%hi,0.0%si,0.0%st
内存:总计 2097372k,已用 2080888k,可用 16484k,缓冲区 21464k
交换:总计 4194296k,已使用 380k,可用 4193916k,缓存 1520912k

Catalina.out 中没有任何错误消息。

根据 Apache 的服务器状态,它似乎最大处理量为 143 个请求/秒。我相信服务器可以处理比现在多得多的负载,因此,任何有关低默认限制或其他此设置将达到最大值的原因的提示都将不胜感激。

答案1

这个问题的解决方案非常简单:

添加到 Proxypass:

BalancerMember ajp://10.176.201.9:8009 keepalive=On生存时间=60

添加到 Tomcats Server.xml:

连接器端口=“8009”协议=“AJP/1.3”重定向端口=“8443连接超时=“60000”

经过这些改变后,一切都应该正常工作:-)

答案2

鉴于 Apache 日志表明它无法连接到 Tomcat(从您的错误日志来看),看起来似乎是 Tomcat 应用程序无法跟上。

当我担任大型 Tomcat 网站的系统管理员时,我注意到严重的性能限制,这不是由 CPU 引起的,而是由线程之间的同步问题或查询后端 Web 服务的延迟引起的。

后者是个大问题,因为流行的 Java HTTP 接口默认将同时连接到另一个 Web 服务器的数量限制为 2(当我发现这一点时,我大吃一惊)。参见http://hc.apache.org/httpclient-3.x/threading.html

您的网络应用是否调用任何其他网络服务?

答案3

Apache 似乎在连接池中的服务器时发生连接超时,这导致它无法处理请求。您的超时值看起来非常低,间歇性网络延迟,甚至需要一点额外时间才能生成的页面,都可能导致服务器退出池。我会尝试更高的超时和重试值,并可能使用更高的 ping 值。

您也可以考虑切换到工人或者事件mpm,prefork mpm一般性能最差。

专用代理/平衡器软件,例如乌贼,也可能是一个不错的选择。

答案4

伊斯兰党,

我没有在您粘贴的 Apache 日志中看到超时值。如果是 300,请尝试将其更改为 1200。我们遇到了同样的问题,将 Apache httpd.conf 文件中的超时从 300 更改为 1200 后问题就解决了。

相关内容