Apache-2.4
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 分鐘的時間內檢測到應用程序沒有“準備好”。
**問題:**有沒有辦法為健康檢查設置與代理請求不同的超時?
**注意:**任何關於如何更好地處理這種情況的建議都將受到歡迎。
我的問題與超時無關:一旦我設置了
ProxyHCExpr
.我通過查看對後端節點上的狀態頁面發出的請求注意到了這一點:只有在我定義 a
ProxyHCExpr
之後,它們才會或多或少地每秒定期到達。請注意,我不需要使用表達式 addhcexpr=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]/