2017-07-19 73 views
1

我們在一個Apache集羣下運行多個Tomcat JVM。如果我們關閉除一個之外的所有JVM,則有時會得到503s。如果我們將 重試間隔增加到180(從重試= 10),問題就會消失。這使我想起 這個問題,Apache如何檢測已停止的Tomcat JVM?如果我 有一個包含多個JVM的集羣,並且其中一些JVM已關閉, Apache如何發現這個集羣?在我閱讀的某個地方,Apache使用真實的 請求來確定後端JVM的運行狀況。在這種情況下,如果JVM停止,那麼 請求會失敗(使用5xx)嗎?爲什麼更高的重試值是 有什麼不同?你認爲引入ping可能有幫助嗎?Apache如何檢測停止的Tomcat JVM?

如果有人可以解釋一下或指向我一些文檔,那將是非常棒的。

我們使用Apache 2.4.10,mod_proxy,通過請求LB算法,粘性會話, Keepalive處於開啓狀態,對於所有平衡器成員,ttl = 300。

謝謝!

回答

0

那麼讓我們來看看你的配置實際上在做什麼,然後轉移到可能有幫助的地方。

[docs]

retry - 在這裏,要麼你給自己定了它10180你指定是多少時間,Apache將考慮您的後端服務器下來,因而不會送他的請求。因此,價值越高,您就可以獲得後端完全啓動的時間,但您將更多負載加載到其他服務器上,因爲您的服務器時間更長。

stickysession - 在這裏,如果你失去了後端服務器,無論出於何種原因,所有會話都會出現錯誤。

現在好了,我們所描述的相關變量,您的具體情況讓我們清楚地表明的Apache的mod_proxy沒有一個健康檢查裝置的嵌入式,它更新後端的基於真實請求的響應狀態。

所以,當前的配置工作過程如下:

  1. 請求到達阿帕奇
  2. 阿帕奇其發送到後端活着
  3. 如果請求得到一個錯誤的HTTP代碼爲響應或不獲取響應,Apache將後端置於ERROR狀態。
  4. 重試時間通過後,apache再次發送到後端服務器請求。

因此,閱讀以上內容即可瞭解到第一個到達後端服務器的請求將會出現錯誤頁面。

你可以做的事情之一的確是ping,根據文檔將在發送任何請求之前檢查後端。考慮當然會產生的開銷。

雖然我建議你配置mod_proxy_ajp,它爲tomcat後端故障轉移檢測提供額外的功能(和配置ofc)。

+0

:我嘗試'ping'與'retry = 10',但沒有任何區別。我仍然可以輕鬆地重現503錯誤。我在通過'error.log'時注意到的另一件事。如果我有10個Tomcat JVM,其中9個已關閉,而我的好JVM位於列表中的第7位;那麼對於6個停止的JVM,Apache會打印出以下錯誤:「AH01114:HTTP:無法與後端:xxx'連接,直到達到良好的JVM。但請求沒有失敗。再說一次,如果我設置'retry = 180'或'retry = 60',這個工作很好。當'retry = 10'時,90%的時間失敗。 – suv3ndu

+0

您進行測試多長時間?可以說900秒的請求嗎?加上ping:'對於HTTP,它導致mod_proxy_http發送一個100-繼續到後端(只對HTTP/1.1有效 - 對於非HTTP/1.1後端,這個屬性沒有作用)'這是來自文檔,這就是我建議的ajp (我對你旁邊的jvm後臺一無所知)。 – zochamx

+0

@zochmax是的,我們使用的是mod_proxy_http,所以'ping'將起作用。我們運行了2-3個小時的所有測試。我打算在Apache中打開更多的日誌記錄來理解這種行爲。 – suv3ndu