Apache 负载均衡器:长时间超时的健康检查

Apache 负载均衡器:长时间超时的健康检查

我正在使用 Apache HTTP Server 作为几个 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 分钟内检测到应用程序未“准备就绪”。

问题:有没有办法为健康检查设置与代理请求不同的超时时间?

笔记:欢迎任何关于如何更好地处理这种情况的建议。

答案1

我的问题是不是关于超时:一旦我设置了,健康检查就会开始按预期工作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]/

相关内容