Назад | Перейти на главную страницу

Балансировщик нагрузки Apache: проверка работоспособности с длительным таймаутом

Я использую 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]/