Apache-2.4

Apache 負載均衡器:長時間超時的健康檢查

  • November 15, 2018

我使用 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 分鐘的時間內檢測到應用程序沒有“準備好”。

**問題:**有沒有辦法為健康檢查設置與代理請求不同的超時?

**注意:**任何關於如何更好地處理這種情況的建議都將受到歡迎。

我的問題與超時無關:一旦我設置了ProxyHCExpr.

我通過查看對後端節點上的狀態頁面發出的請求注意到了這一點:只有在我定義 aProxyHCExpr之後,它們才會或多或少地每秒定期到達。請注意,我不需要使用表達式 add 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]/

引用自:https://serverfault.com/questions/934793