いくつかの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分以内に「準備ができていない」ことを検出できません。
質問:ヘルスチェックにプロキシされたリクエストとは異なるタイムアウトを設定する方法はありますか?
注:このシナリオへのより良いアプローチ方法についての提案は歓迎されます。
私の問題はタイムアウトについてではありません:ProxyHCExpr
を設定すると、ヘルスチェックが希望どおりに機能し始めました。
バックエンドノードのステータスページに対して行われたリクエストを見て、これに気づきました。ProxyHCExpr
を定義した後でのみ、それらはほぼ毎秒定期的に到着しました。式を使用してhcexpr=23
を追加する必要はありませんが、式を設定する必要があることに注意してくださいとにかくmod_proxy_hcheckがその仕事をするために。安全に省略できるか、apachectl -t
がエラーまたは警告をスローすることを期待していました。
docs では、次のように述べています。
hcexpr
ProxyHCExprを介して作成され、応答ヘッダーのヘルスをチェックするために使用される式の名前。使用しない場合、2xxから3xxのステータスコードは成功を意味します
これに基づいて、私はwronglyに ProxyHCExpr
の設定もオプションであると想定しました。残念ながら、設定するまでは期待どおりに機能しませんでした。私の構成ファイルは次の場所にあります:
<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]/