複数のJava Tomcatインスタンスの前でプロキシとしてApacheHttpdインスタンスを使用しています。ApacheはTomcatインスタンスのロードバランサーとして機能します。
Apacheの設定は基本的に次のようになります
<Proxy balancer://mycluster>
BalancerMember ajp://Host1:8280 route=jvmRoute-8280
BalancerMember ajp://Host2:8280 route=jvmRoute-8280
BalancerMember ajp://Host3:8280 route=jvmRoute-8280
</Proxy>
<VirtualHost *:80>
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
</VirtualHost>
これは基本的に、TomcatインスタンスでAJPポートが構成されている場合に機能します。要求はホストの1つに送信され、負荷はTomcatインスタンス全体に分散されます。
ただし、ホストの1つが利用できない場合は常に、Httpd内で非常に長い遅延が発生しているようです。つまり、Apacheは、ホストの1つが利用できないことを認識しておらず、代わりに不足しているホストにもリクエストを繰り返し送信しようとしているようです。使用可能なホストの1つに送信し、しばらくしてから障害のあるホストを試します。
Mod_proxyet.alを設定する方法はありますか?このようなフェイルオーバーシナリオをサポートするためのApacheHttpdから、つまり、複数のホストがあり、1つのホストに障害が発生したときに大きな遅延が発生しないのですか?できれば、Apacheは、どのホストがなくなったかをバックグラウンドで定期的にチェックする必要があります。
私は HAProxy を見つけました。これはこの種のことにより適しているようですが、いくつかの無関係な理由からApacheを使い続けたいと思います。
その間に、私の問題の一部は、接続を際限なく開いたままにしていたクライアントが原因であることがわかりました。そのため、これ以上接続/スレッドを使用できませんでした。
したがって、質問を次のように変更します。このようなものの影響を最小限に抑えるために、どの構成オプションを使用しますか?つまりこの場合、多くの開いている接続を許可しますか、それともすばやく閉じますか?そうでなければ、これは私の現在の設定で非常に簡単なDOS攻撃のように聞こえますか?
クライアントは、接続を際限なく開いたままにすることはありません。 Apache server-tuning.confを確認し、KeepAliveTimeout設定を探します。賢明なものに下げてください。
Connectiontimeoutとretryへの変更は、実際に行う必要があることです。ただし、接続タイムアウトは低くします。 10秒はまだ古くなっています。バックエンドが同じ場所にある場合は、ミリ秒単位で設定してみませんか? connectiontimeout = 200msは、接続をセットアップするために十分な時間を残す必要があります。
少なくともある種の回避策または簡単な解決策を見つけたと思います。 mod_proxyは、デフォルトで非常に長い接続タイムアウト(300秒)を持っているようです。別の方法で設定しないと、オフラインノードが「エラー」状態であると検出されるまでに長い時間がかかります。
短い接続タイムアウトを設定し、再試行回数を増やすことで、次のようにうまく機能させることができます。
BalancerMember ajp://Host1:8280 route=jvmRoute-8280 connectiontimeout=10 retry=600
これにより、失敗した接続がかなり迅速に検出され、Apacheが失敗したサーバーに到達するために頻繁に再試行することがなくなります。残念ながら、Apacheは実際のリクエストを使用してバランスメンバーをチェックしているようです。そのため、以前にerr-stateに設定されたサーバーに到達しようとすると、単一のリクエストが遅くなることがあります。ハートビートやウォッチドッグ機能がないようです。このようなものの場合、他の負荷分散ソリューションはそのような機能をもたらします。特に HAProxy
詳細については、 mod_proxy および mod_proxy_balancer を参照してください。
さらに、 mod_status を介したサーバーステータスと mod_balancerによって提供されるページ を介したバランスマネージャーは、これを診断するのに非常に役立ちました!
pingタグを忘れたようです(実際にはCPINGと呼ばれています-100-続行)
そのようです:
<Proxy "balancer://www">
BalancerMember "http://192.168.0.100:80" max=128 ttl=300 retry=60 connectiontimeout=5 timeout=300 ping=2
BalancerMember "http://192.168.0.101:80" max=128 ttl=300 retry=60 connectiontimeout=5 timeout=300 ping=2
BalancerMember "http://192.168.0.102:80" max=128 ttl=300 retry=60 connectiontimeout=5 timeout=300 ping=2
BalancerMember "http://192.168.0.103:80" max=128 ttl=300 retry=60 connectiontimeout=5 timeout=300 ping=2
BalancerMember "http://192.168.0.104:80" max=128 ttl=300 retry=60 connectiontimeout=5 timeout=300 ping=2
BalancerMember "http://192.168.0.105:80" max=128 ttl=300 retry=60 connectiontimeout=5 timeout=300 ping=2
BalancerMember "http://192.168.0.106:80" max=128 ttl=300 retry=60 connectiontimeout=5 timeout=300 ping=2
SetEnv proxy-nokeepalive 1
</Proxy>
ProxyPass "/www/" "balancer://www/"
ProxyPassReverse "/www/" "balancer://www/"