2012-08-08 137 views
13

這裏是我的情況(我的前任設計):Apache代理負載均衡後端服務器故障檢測

服務反向代理稅,一些混合後端Web服務器(Apache的,IIS,Tomcat的,等等)兩個Apache服務器。有一些網站對此我們有多個後端Web服務器,並在這些情況下,我們做這樣的事情:

<Proxy balancer://www.example.com> 
    BalancerMember http://192.168.1.40:80 
    BalancerMember http://192.168.1.41:80 
</Proxy> 
<VirtualHost *:80> 
    ServerName www.example.com:80 
    CustomLog /var/log/apache2/www.example.com.log combined 
    <Location /> 
     Order allow,deny 
     Allow from all 
     ProxyPass balancer://www.example.com/ 
     ProxyPassReverse balancer://www.example.com/ 
    </Location> 
</VirtualHost> 

因此,在這個例子中,我有一個網站(www.example.com)在代理服務器的配置,並且該站點代理到兩個後端服務器192.168.1.40和.41中的一個或另一個。

我正在對此進行評估以確保我們對所有Web服務都具有容錯能力(因爲這個原因,我已將兩臺反向代理服務器放入共享IP羣集中),並且我想確保負載平衡的後端服務器也是容錯的。但我無法搞清楚,如果後端故障檢測(並避免失敗的後端服務器的邏輯)內置於mod_proxy_balancer的模塊...

所以如果192.168.202.40下降,將Apache的檢測它(我會理解它是否首先發送失敗的請求)並自動將所有請求路由到另一個後端192.168.202.41?還是會繼續平衡失敗的後端和運營後端之間的請求?

我發現Apache的文檔mod_proxymod_proxy_balancer一些線索,似乎表明發生故障的檢測(「maxattempts =放棄之前的故障切換嘗試的最大數量。」,「failonstatus =單個或逗號分開的HTTP狀態代碼列表,如果設置這將強制工作者在後臺返回列表中的任何狀態代碼時出現錯誤狀態「),但經過幾天的搜索後,我沒有發現任何確鑿的說法, (或至少「應該」)檢測後端失敗和恢復。

我會說大多數搜索結果使用AJP協議將流量傳遞到後端服務器,這顯然確實支持故障檢測 - 但我的後端是Apache,IIS,Tomcat和其他服務器的混合體,我相當肯定他們中的許多人不支持AJP。它們也是Windows 2k3/2k8和Linux(主要是Ubuntu Lucid)盒子的混合體,它們運行各種不同的應用程序以滿足各種不同的需求,所以像Backhand和LVS這樣的附加模塊不適合我。

我也試着經驗測試這一功能,通過創建一個新的測試網站是這樣的:

<Proxy balancer://test.example.com> 
    BalancerMember http://192.168.1.40:80 
    BalancerMember http://192.168.1.200:80 
</Proxy> 
<VirtualHost *:80> 
    ServerName test.example.com:80 
    CustomLog /var/log/apache2/test.example.com.log combined 
    LogLevel debug 
    <Location /> 
     Order allow,deny 
     Allow from all 
     ProxyPass balancer://test.example.com/ 
     ProxyPassReverse balancer://test.example.com/ 
    </Location> 
</VirtualHost> 

其中192.168.1.200是沒有運行任何Web服務器一個假地址,以模擬後端失敗。測試站點對於一堆不同的客戶端計算機來說沒有問題,但即使將LogLevel設置爲調試,我也沒有看到任何記錄的內容,表明它檢測到後端服務器之一已關閉。我希望百分之百地確保我可以將我們的負載均衡後端用於維護(當然是一次一個),而不會影響生產站點。

回答

11

http://httpd.apache.org/docs/2.4/mod/mod_proxy.html節「BalancerMember參數」,屬性=重試:

如果連接池工作到後端服務器是錯誤 狀態,阿帕奇的httpd將不會對服務器進行任何請求轉發到 的超時到期。這使得[一個]可以關閉後臺服務器以進行維護,並在稍後恢復聯機。值爲0 表示始終重試工作人員處於錯誤狀態,沒有超時。

但是還有其他故障情況不會使用mod_whatever捕獲,例如,IIS後端運行的應用程序已關閉。 IIS已啓動,因此可以建立連接並且可以讀取頁面,只是該頁面始終是500內部服務器錯誤。在這裏,您將不得不使用failonerror來捕獲它並強制工作人員進入錯誤狀態。

在所有情況下,一旦工作人員處於錯誤狀態,流量將不會被引導至該流量。我一直在嘗試使用不同的方式來消費第一次失敗並重試它,但似乎總是有錯誤頁面將其返回給客戶端的情況。

+0

在這裏遲到的回覆,但這確實幫了我。 我不得不強制升級到2.2.17,因爲普通的Lucid repos只有2.2.14,不支持「failonstatus」參數。暫時添加了natty回購協議,更新至2.2.17,現在一切似乎都奏效了。 謝謝! – 2013-03-26 20:33:42

+1

@David Newcomb我發現的唯一解決方案實際上可行(儘管它很醜)是使用'maxattempts'(請參閱http://serverfault.com/questions/503531/apache2-proxy-tomcat6-prevent-503-error -while起動/ 503539#503539)。 – 2013-04-29 13:15:00

0

有一個在「BalancerMember參數」

屬性「平」讀這聽起來像設置爲500ms的mod_proxy的引導你到一個BalancerMember之前會發送一個請求「平」的文檔。 mod_proxy將等待500ms來處理來自BalancerMember的響應,並且如果mod_proxy不會得到響應,它將會使BalancerMember進入錯誤狀態。

我厭倦了這個,但它似乎沒有幫助指導一個活的BalancerMember。

<Proxy balancer://APICluster> 
    BalancerMember https://api01 route=qa-api1 ttl=5 ping=500ms 
    BalancerMember https://api02 route=qa-api2 ttl=5 ping=500ms 
    ProxySet lbmethod=bybusyness stickysession=ROUTEID 
</Proxy> 

http://httpd.apache.org/docs/2.4/mod/mod_proxy.html

平屬性告訴web服務器「測試」轉發請求之前的連接到後端。對於AJP,它會導致mod_proxy_ajp在ajp13連接上發送CPING請求(在Tomcat 3.3.2+,4.1.28+和5.0.13+上實現)。對於HTTP,它會導致mod_proxy_http向後端發送100-Continue(僅對HTTP/1.1有效 - 對於非HTTP/1.1後端,此屬性不起作用)。在這兩種情況下,該參數都是等待回覆的延遲時間(秒)。添加此功能是爲了避免掛起和繁忙後端出現問題。這會增加正常操作期間的網絡流量,這可能是一個問題,但會降低流量,以防某些羣集節點關閉或忙碌。通過添加ms的後綴,延遲也可以以毫秒爲單位進行設置。