Я использую HTTP-сервер Apache в качестве обратного прокси для пары экземпляров Tomcat. Я настроил балансировку нагрузки следующим образом:
<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 минут, так как приложение требует повторного развертывания столько же. В идеале в это время балансировщик нагрузки должен обнаруживать, что один из внутренних серверов находится в автономном режиме, и временно отправлять все входящие запросы на другой, работоспособный внутренний сервер. К сожалению, в моем httpd.conf
:
ProxyTimeout 600
Очевидно, это необходимо, потому что приложение может законно принимать столько же, чтобы ответить на некоторые запросы. В результате балансировщик нагрузки не может обнаружить, что приложение не «готово» менее чем за 10 минут.
Вопрос: Есть ли способ установить другой тайм-аут для проверки работоспособности, чем для прокси-запросов?
Примечание: Любые предложения о том, как лучше подойти к этому сценарию, будут приветствоваться.
Моя проблема была не про тайм-аут: проверка работоспособности начала работать должным образом, как только я установил ProxyHCExpr
.
Я заметил это, посмотрев на запросы, сделанные к странице состояния на внутренних узлах: только после того, как я определил ProxyHCExpr
приходили ли они более или менее регулярно каждую секунду. Обратите внимание, что мне не нужно использовать выражение, добавив hcexpr=23
, но необходимо задать выражение в любом случае, чтобы mod_proxy_hcheck выполнял свою работу. Я ожидал, что либо его можно будет опустить, либо apachectl -t
выдаст ошибку или предупреждение.
в документы, он говорит:
hcexpr
Имя выражения, созданного с помощью ProxyHCExpr, которое используется для проверки заголовков ответов на работоспособность. Если не используется, коды состояния от 2xx до 3xx означают успех.
На основании этого у меня было неправильно предположил, что установка 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]/