web-dev-qa-db-ja.com

高負荷で正常に失敗するようにmod_proxy_balancerを設定する方法

複数のtomcatの前に1つのApacheインスタンスがあるシステムがあります。これらのトムキャットは、さまざまなデータベースに接続します。 Mod_proxy_balancerを使用してTomcatへの負荷を分散します。

現在、1秒間に100件のリクエストを受信して​​おり、Apacheサーバーの負荷は非常に低いですが、tomcatでのデータベースの重い操作のため、負荷は約25%です(私が推定したものの約25%)。

数週間でイベントが発生し、リクエストが大幅に、おそらく10倍になると予測しています。

Tomcatの負荷を減らすためにできることはすべて実行していますが、容量が不足することはわかっているので、正常に失敗したいと思います。つまり、すべてがタイムアウトする多すぎる接続を処理する代わりに、Apacheで平均応答時間を何らかの方法で監視し、Tomcatへの応答時間がしきい値を超えたらすぐにエラーページを表示します表示されます。

つまり、運が良ければページはすぐにレンダリングされ、運が悪ければエラーページはすぐに表示されます。誰もが自分のページを待つのが長すぎて、最終的には全員がタイムアウトし、データベースが決して使用されないクエリでいっぱいになる代わりに。

うまくいけば、これが理にかなっているので、私はこれをどのように達成できるかについての提案を探していました。

ありがとう

6
bramp

私はこれを「申し訳ありませんがサーバー」と呼んでいます。 Apache 2.2を使用している場合、別のホストをホットスペアとしてLBプールに追加できます。実際のアプリサーバーが容量に達すると、アプリケーションサーバーが再び利用可能になるまで、バランサーはリクエストを「ソーリーサーバー」に転送します。大まかなアイデアは次のとおりです。

<Proxy balancer://yourapp>
    BalancerMember http://10.0.0.1:8080 retry=5 max=50
    BalancerMember http://10.0.0.2:8080 retry=5 max=50
    BalancerMember http://10.0.0.3:8080 retry=5 max=50
    BalancerMember http://10.0.0.4:8080 retry=5 max=50
    # the hot standby on server2
    BalancerMember http://10.0.0.5:80 status=+H
</Proxy>
<Location /app>
    ProxyPass           balancer://yourapp
</Location>

実際には、ロードバランサーマシンに追加の仮想ホストを設定して、「申し訳ありませんがサーバー」ページ自体にサービスを提供することもできます。それが役に立てば幸い:)

9
Bryan White

いくつかのメモ:

「max」パラメータは最大接続数を設定します子プロセスごと。これは、使用しているMPMに応じて、同時接続のハード最大値を作成しません。たとえば、プリフォークMPMは、そのためにはほとんどまったく役に立ちません。

代わりに、「timeout」パラメーターとカスタマイズされた503エラーページを使用して設定します。タイムアウトを適切な値に設定します。この値を超えると、ユーザーは待機しなくなり、意味のあるメッセージが503エラーページに表示されます。

そう:

ErrorDocument 503 /sitebusy.html

<Proxy balancer://yourapp>
    BalancerMember http://10.0.0.1:8080 timeout=15 retry=5
    BalancerMember http://10.0.0.2:8080 timeout=15 retry=5
    BalancerMember http://10.0.0.3:8080 timeout=15 retry=5
    BalancerMember http://10.0.0.4:8080 timeout=15 retry=5
</Proxy>

ProxyPass /app balancer://yourapp timeout=5

この設定では、応答が15秒を超えると、各ワーカーは失敗状態になり、5秒後にプールに戻されます。バランサーは5秒でフリーワーカーを待機します。

2
user65677