web-dev-qa-db-ja.com

AJPを介したTomcatでのApacheロードバランサーの制限

3つのTomcatサーバーの前で、Apacheがロードバランサーとして機能しています。時々、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)への接続の試行に失敗しました
 [Mon Mar 22 18:39:47 2010] [error] ap_proxy_connect_backend disableing worker for(10.176.201.10)
 [Mon Mar 22 18:39:47 2010] [error] proxy:AJP:failed toバックエンドへの接続を確立します:10.176.201.10 
 [Mon Mar 22 18:39:47 2010] [エラー](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 
 [Mon Mar 22 18:39:47 2010] [エラー](70007)指定されたタイムアウトの期限が切れました:プロキシ:AJP:試行10.176.219.168:8009(10.176.219.168)への接続に失敗しました
 [Mon Mar 22 18:39:47 2010] [error] ap_proxy_connect_backend disableing worker for(10.176.219.1 68)
 [2010年3月22日18:39:47] [エラー]プロキシ:AJP:バックエンドへの接続に失敗:10.176.219.168 
 [2010年3月22日18:39:47 ] [エラー]プロキシ:BALANCER:(balancer:// mycluster)。すべてのワーカーがエラー状態です。
 [Mon Mar 22 18:39:47 2010] [error]プロキシ:BALANCER:(balancer:// mycluster)。すべてのワーカーがエラー状態です。
 [Mon Mar 22 18:39:47 2010] [error]プロキシ:BALANCER:(balancer:// mycluster)。すべてのワーカーがエラー状態です。
 [Mon Mar 22 18:39:47 2010] [error]プロキシ:BALANCER:(balancer:// mycluster)。すべてのワーカーがエラー状態です。
 [Mon Mar 22 18:39:47 2010] [error]プロキシ:BALANCER:(balancer:// mycluster)。すべてのワーカーがエラー状態です。
 [Mon Mar 22 18:39:47 2010] [error]プロキシ:BALANCER:(balancer:// mycluster)。すべてのワーカーがエラー状態です

ロードバランサーtop info:

トップ-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 
 Mem:合計524508k、使用済み517132k、空き7376k、9124kバッファ
スワップ:合計1048568k、使用済み352k、空き1048216k、キャッシュ334720k 

Tomcat top info:

 top-23:47:12 up 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 
 Mem:合計2097372k、使用2080888k、空き16484k、バッファ21464k 
スワップ:合計4194296k、使用380k、空き4193916k、キャッシュ1520912k 

Catalina.outにはエラーメッセージがありません。

Apacheのサーバーステータスによると、143リクエスト/秒で最大に達しているようです。サーバーは実際よりもかなり多くの負荷を処理できると思います。そのため、デフォルトの下限や、この設定が最大になるその他の理由についてのヒントがあれば、大いに評価されます。

6

この問題の解決策は非常に簡単です。

proxypassに追加:

BalancerMember ajp://10.176.201.9:8009 keepalive = On ttl = 6

tomcats Server.xmlに追加します。

コネクタポート= "8009"プロトコル= "AJP/1.3" redirectPort = "8443 connectionTimeout =" 60000 "

これらの変更後、すべてが正常に動作するはずです:-)

7
beh

Apacheログが、(エラーログから)Tomcatに接続できないことを示している場合、それを維持できないのはTomcatアプリケーションであると思われます。

大規模なTomcat Webサイトのシステム管理者として働いていたとき、パフォーマンスの厳しい制限に気づきました。それらはCPUの問題ではなく、スレッド間の同期の問題またはバックエンドWebサービスのクエリの遅延にありました。

後者は大きな問題でした。人気のあるJava HTTPインターフェースが、別のWebサーバーへの同時接続数をデフォルトで2に制限しているためです(これが私の顎が落ちたことを発見したとき)。参照 http://hc.Apache.org/httpclient-3.x/threading.html

Webアプリは他のWebサービスを呼び出しますか?

1
PP.

Apacheがプール内のサーバーへの接続タイムアウトを取得しているため、リクエストを処理できません。タイムアウト値が非常に低く、断続的なネットワーク遅延に見えるか、ページの生成に少し時間がかかる場合でも、サーバーがプールから削除される可能性があります。私はより高いタイムアウトと再試行の値、そしておそらくより高いping値を試します。

worker または event mpmへの切り替えを検討することもできます。一般的に、prefork mpmのパフォーマンスは最悪です。

squid などの専用のプロキシ/バランサソフトウェアも良いオプションかもしれません。

1
Eric

Tomcatインスタンスはデッドロックしていますか?私は2つの大規模な企業(異なる企業)のTomcatプロジェクトがデッドロックに苦しんでいるのを目撃しました。

ローカルでTomcatインスタンスに直接接続できますか?あれは:

telnet localhost 8080

次に、次のように入力します。

GET / HTTP/1.0\n
\n

(どこ \nは<Enter>キーを指します)。

そうでない場合、Tomcatインスタンスが停止またはデッドロックしているように見えます。デッドロックが発生した場合は、jstackプログラムを使用してTomcat Javaインスタンスのスタックダンプ(TomcatのPID Javaプログラム)。

0
PP.

PAS、

貼り付けたApacheログにタイムアウト値が表示されませんでした。 300の場合は、1200に変更してみてください。同じ問題があり、Apache httpd.confファイルのタイムアウトを300から1200に変更すると修正されました。

0
Innocent Geek

この質問に答えましょう、6年後= D

retry=1 timeout=1 

それが問題です。 timeoutretryが短すぎます。

タイムアウトでは、サーバーが1秒以内に応答しない場合、サーバーは停止していると見なされます。一部のリクエストを処理するには短すぎます(特に500リクエスト/秒で負荷テストを行っている場合)。

サーバーがダウンすると、残りの2台のサーバーは+ 50%のリクエストを受信し、応答時間が大幅に増加することに注意してください。典型的なカスケード障害。

タイムアウトが短すぎるため、負荷がかかっても十分な速度で応答しないため、Apacheによってすべてのサーバーが停止していると見なされるため、503「サービスを利用できません」が表示されます。

両方の設定を削除します。一般的に、タイムアウトは5秒未満に設定しないでください。

0
user5994461

私はまったく同じ問題に直面しました。問題が発生したときにスレッドダンプを取得すると、どのスレッドがブロックされ、それ以降他のスレッドもブロックされているかがわかります。その間、すべてのAJPポートが使用され、最終的にApacheが停止します。ただし、この問題はApacheの設定とは関係ありません。問題はアプリケーション(Tomcatレベル)にあります。

0