web-dev-qa-db-ja.com

Apacheロードバランサー:タイムアウトが長いヘルスチェック

いくつかのTomcatインスタンスのリバースプロキシとしてApache HTTP Serverを使用しています。次のように負荷分散を設定しました。

<Proxy "balancer://Tomcat-app">
    BalancerMember "http://10.0.0.1:8080" hcmethod=HEAD hcuri=/status
    BalancerMember "http://10.0.0.2:8080" hcmethod=HEAD hcuri=/status
</Proxy>
ProxyPass        "/app" "balancer://Tomcat-app"
ProxyPassReverse "/app" "balancer://Tomcat-app"

問題は、アプリの再デプロイに多くの時間がかかるため、Tomcatコンテナーが再起動するのにそれぞれ約15分かかることです。理想的には、この間にロードバランサーは、バックエンドサーバーの1つがオフラインであることを検出し、すべての着信要求を他の正常なバックエンドサーバーに一時的に送信します。残念ながら、httpd.confに別の行があります。

ProxyTimeout 600

アプリは一部のリクエストに応答するのに合法的に多くの時間を費やす可能性があるため、これは明らかに必要です。その結果、ロードバランサーは、アプリが10分以内に「準備ができていない」ことを検出できません。

質問:ヘルスチェックにプロキシされたリクエストとは異なるタイムアウトを設定する方法はありますか?

注:このシナリオへのより良いアプローチ方法についての提案は歓迎されます。

1
simlev

私の問題はタイムアウトについてではありませんProxyHCExprを設定すると、ヘルスチェックが希望どおりに機能し始めました。

バックエンドノードのステータスページに対して行われたリクエストを見て、これに気づきました。ProxyHCExprを定義した後でのみ、それらはほぼ毎秒定期的に到着しました。式を使用してhcexpr=23を追加する必要はありませんが、式を設定する必要があることに注意してくださいとにかくmod_proxy_hcheckがその仕事をするために。安全に省略できるか、apachectl -tがエラーまたは警告をスローすることを期待していました。

docs では、次のように述べています。

hcexpr ProxyHCExprを介して作成され、応答ヘッダーのヘルスをチェックするために使用される式の名前。使用しない場合、2xxから3xxのステータスコードは成功を意味します

これに基づいて、私はwronglyProxyHCExpr の設定もオプションであると想定しました。残念ながら、設定するまでは期待どおりに機能しませんでした。私の構成ファイルは次の場所にあります:

<Proxy "balancer://Tomcat">
    BalancerMember "http://10.0.0.1:8080" hcmethod=HEAD hcinterval=1 hcpasses=9 hcuri=/app/status
    BalancerMember "http://10.0.0.2:8080" hcmethod=HEAD hcinterval=1 hcpasses=9 hcuri=/app/status
</Proxy>

に:

ProxyHCExpr 23 {%{REQUEST_STATUS} =~ /^[23]/}
<Proxy "balancer://ifis-Tomcat-col">
    BalancerMember "http://10.0.0.1:8080" hcmethod=HEAD hcinterval=1 hcpasses=9 hcuri=/app/status
    BalancerMember "http://10.0.0.2:8080" hcmethod=HEAD hcinterval=1 hcpasses=9 hcuri=/app/status
</Proxy>

これは、バランサーマネージャーから見た構成です。

MaxMembers  StickySession   DisableFailover Timeout FailoverAttempts    Method      Path    Active
2 [2 Used]  (None)          Off             0       1                   bybusyness  /app    Yes

Worker URL          Route   RouteRedir  Factor  Set Status  Elected Busy    Load    To  From    HC Method   HC Interval Passes  Fails   HC uri      HC Expr
http://10.0.0.1:8080                    1.00    0   Init Ok 0       0       0       0   0       HEAD        1000ms      9 (0)   1 (0)   /app/status
http://10.0.0.2:8080                    1.00    0   Init Ok 0       0       0       0   0       HEAD        1000ms      9 (0)   1 (0)   /app/status

それからそれはなりました:

MaxMembers  StickySession   DisableFailover Timeout FailoverAttempts    Method      Path    Active
2 [2 Used]  (None)          Off             0       1                   bybusyness  /app    Yes

Worker URL          Route   RouteRedir  Factor  Set Status  Elected Busy    Load    To  From    HC Method   HC Interval Passes  Fails   HC uri      HC Expr
http://10.0.0.1:8080                    1.00    0   Init Ok 0       0       0       0   0       HEAD        1000ms      9 (0)   1 (0)   /app/status 
http://10.0.0.2:8080                    1.00    0   Init Ok 0       0       0       0   0       HEAD        1000ms      9 (0)   1 (0)   /app/status 

Health check cond. expressions:
Expr name   Expression
23          %{REQUEST_STATUS} =~ /^[23]/
0
simlev