Balanceador de carga do Apache: verificação de integridade com tempo limite longo

1

Estou usando o Apache HTTP Server como um proxy reverso para algumas instâncias do Tomcat. Eu configurei o balanceamento de carga da seguinte forma:

<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"

O problema é que os contêineres do tomcat demoram cerca de 15 minutos para reiniciar, devido ao fato de o aplicativo precisar ser reimplantado. Idealmente, durante esse tempo, o balanceador de carga detectaria que um dos servidores de back-end está off-line e enviará temporariamente todas as solicitações de entrada para o outro servidor de back-end saudável. Infelizmente, tenho outra linha no meu httpd.conf :

ProxyTimeout 600

Aparentemente, isso é necessário porque o aplicativo pode legitimamente aceitar o máximo para responder a algumas solicitações. A consequência é que o balanceador de carga não consegue detectar que o aplicativo não está "pronto" em menos de 10 minutos.

Pergunta: Existe uma maneira de definir um tempo limite diferente para a verificação de saúde do que para as solicitações com proxy?

Nota: Qualquer sugestão sobre como abordar melhor este cenário será bem-vinda.

    
por simlev 10.10.2018 / 10:35

1 resposta

0

Meu problema era não sobre o tempo limite : a verificação de integridade começou a funcionar conforme desejado depois que eu defini um ProxyHCExpr .

Eu observei isso observando as solicitações feitas à página de status nos nós de back-end: somente depois que eu defini um ProxyHCExpr eles chegaram mais ou menos regularmente a cada segundo. Note que eu não preciso usar a expressão, adicionando hcexpr=23 , mas uma expressão precisa ser definida de qualquer maneira para que o mod_proxy_hcheck faça seu trabalho. Eu teria esperado que ou poderia ser omitido com segurança ou que apachectl -t lançaria um erro ou aviso.

Nos documentos , diz:

hcexpr Name of expression, created via ProxyHCExpr, used to check response headers for health. If not used, 2xx thru 3xx status codes imply success

Com base nisso, eu supus que essa configuração ProxyHCExpr também seria opcional. Infelizmente, não estava funcionando como desejado até eu configurá-lo. Meu arquivo de configuração foi de:

<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>

Para:

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>

Esta foi a configuração vista do gerenciador de balanceamento:

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

Então ficou:

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]/
    
por 15.11.2018 / 13:05