簡體   English   中英

如何將Apache Httpd正確配置為Load Balancer,其中某些主機可能不可用

[英]How to properly configure Apache Httpd as Load Balancer where some hosts may be unavailable

我在多個Java Tomcat實例前面使用Apache Httpd實例作為代理。 Apache充當Tomcat實例的負載平衡器。

apache配置基本上如下所示

<Proxy balancer://mycluster>
    BalancerMember ajp://host1:8280 route=jvmRoute-8280
    BalancerMember ajp://host2:8280 route=jvmRoute-8280
    BalancerMember ajp://host3:8280 route=jvmRoute-8280
</Proxy>
<VirtualHost *:80>
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
</VirtualHost>

當在Tomcat實例中配置AJP端口時,這基本上有效。 請求將發送到其中一個主機,負載將分布在Tomcat實例中。

然而,我發現只要其中一個主機不可用,Httpd內部就會出現非常長的延遲,即似乎Apache不記得其中一個主機不可用並且反復嘗試將請求發送到丟失的主機而不是將其發送到其中一個可用主機並在稍后的某個時間嘗試發生故障的主機。

有沒有辦法配置mod_proxy et.al. 從Apache Httpd支持這樣的故障轉移場景,即擁有多個主機,並且當一個主機出現故障時不會造成巨大延遲? Apache應該定期檢查后台哪些主機已經消失,而不是任何請求。

我確實發現HAProxy似乎更適合這種事情,但我更願意堅持使用Apache,原因有很多。


更新

與此同時,我發現我的問題的一部分是由客戶端引起的,這些客戶端使連接保持無限開放,因此沒有更多的連接/線程可用。

因此,我將問題更改為:您將使用哪些配置選項來最小化此類效果? 即在這種情況下允許許多打開的連接或快速關閉它們? 否則這聽起來像我當前配置的一個非常容易的DOS攻擊?

客戶不會無休止地保持連接。 檢查Apache server-tuning.conf並查找KeepAliveTimeout設置。 把它降低到合理的程度。

您對connectiontimeout和重試的更改確實是您必須要做的。 我會降低連接時間。 10秒仍然是年齡。 如果后端位於同一位置,為什么不在幾毫秒內設置它? connectiontimeout = 200ms應該留出足夠的時間來建立連接。

我想我至少找到了一種解決方法或簡單的解決方案。 默認情況下,mod_proxy似乎有一個非常長的連接超時(300秒)。 如果不進行不同的設置,則需要很長時間才能檢測到脫機節點處於“錯誤”狀態。

通過設置一個短的連接超時並增加重試,我可以讓它對我更好:

BalancerMember ajp://host1:8280 route=jvmRoute-8280 connectiontimeout=10 retry=600

這將確保快速檢測到失敗的連接,並且Apache不會經常重試以訪問失敗的服務器。 不幸的是,似乎Apache使用實際請求來檢查余額成員,因此當嘗試訪問先前進入錯誤狀態的服務器時,單個請求可能會很慢。 似乎沒有心跳或看門狗功能。 對於類似的東西,其他負載平衡解決方案帶來了這些功能,特別是HAProxy

閱讀mod_proxymod_proxy_balancer以獲取更多詳細信息。

此外,通過mod_status和平衡管理器通過mod_balancer提供的頁面提供服務器狀態對診斷這一點非常有幫助!

你似乎忘記了ping標簽(實際上它叫做CPING - 100-Continue)

像這樣:

<Proxy "balancer://www">
    BalancerMember "http://192.168.0.100:80" max=128 ttl=300 retry=60 connectiontimeout=5 timeout=300 ping=2
    BalancerMember "http://192.168.0.101:80" max=128 ttl=300 retry=60 connectiontimeout=5 timeout=300 ping=2
    BalancerMember "http://192.168.0.102:80" max=128 ttl=300 retry=60 connectiontimeout=5 timeout=300 ping=2
    BalancerMember "http://192.168.0.103:80" max=128 ttl=300 retry=60 connectiontimeout=5 timeout=300 ping=2
    BalancerMember "http://192.168.0.104:80" max=128 ttl=300 retry=60 connectiontimeout=5 timeout=300 ping=2
    BalancerMember "http://192.168.0.105:80" max=128 ttl=300 retry=60 connectiontimeout=5 timeout=300 ping=2
    BalancerMember "http://192.168.0.106:80" max=128 ttl=300 retry=60 connectiontimeout=5 timeout=300 ping=2
    SetEnv proxy-nokeepalive 1
</Proxy>
ProxyPass "/www/" "balancer://www/"
ProxyPassReverse "/www/" "balancer://www/"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM