2010-10-06 54 views
7

我們爲一組NServiceBus服務集羣了MSMQ,並且一切都運行良好,直到沒有爲止。一臺服務器上的外出隊列開始填滿,很快整個系統就被掛起。綁定到羣集MSMQ實例的MSMQ郵件被阻塞在傳出隊列中

更多細節:

我們有服務器N1和N2之間的羣集MSMQ。其他集羣資源只是作爲本地,即NServiceBus分發器直接在集羣隊列上運行的服務。

所有工作進程都位於不同的服務器,服務3和服務4上。

對於那些不熟悉NServiceBus的人來說,工作會進入由分銷商管理的集羣工作隊列。 Service3和Services4上的工作人員應用程序將「我準備好工作」消息發送到由同一分銷商管理的集羣控制隊列,分銷商通過向工作進程的輸入隊列發送一個工作單元作出響應。

在某個時候,這個過程可能會完全掛起。這裏是羣集MSMQ實例傳出隊列的照片時,系統掛起:

Clustered MSMQ Outgoing Queues in Hung State

如果我失敗羣集到另一個節點上,它就像整個系統被在褲子踢。這裏是相同的羣集MSMQ實例的故障轉移後不久,一個畫面:

Clustered MSMQ Outgoing Queues After Failover

誰能解釋這種行爲,並且我能做些什麼來避免它,以保持系統順暢運行?

+0

輔助節點最終是否掛起?工人如何行事?他們正在積極處理消息嗎? – 2010-10-07 00:12:48

+0

它不會經常發生,我可以權威地說它只發生在一個節點上,或者兩者都發生。工作人員表現出來 - 當本地輸入隊列中有消息要處理時,他們正在積極處理消息。 – 2010-10-07 14:17:30

+0

奇怪。它多久發生一次?每個節點有多少個NIC卡?我想知道MSMQ是否對使用哪張卡感到困惑,因此偶爾不能完成ACK。應該有一個註冊表設置來鎖定它。 – 2010-10-08 13:54:33

回答

2

過了一年之後,似乎我們的問題已經得到解決。關鍵看起來是:

  • 確保您有一個穩定的DNS系統,因此當MSMQ需要解析主機時,它可以。
  • 僅在Windows故障轉移羣集上創建MSMQ的一個羣集實例。

當我們建立了我們的Windows故障轉移羣集,我們的假設,這將是不好的「廢物」資源的非活動節點上,因此,當時有兩個準相關NServiceBus集羣,我們做了Project1的羣集MSMQ實例和Project2的另一個羣集MSMQ實例。大多數時候,我們認爲,我們會在單獨的節點上運行它們,並且在維護窗口期間它們將共同位於同一節點上。畢竟,這是我們爲SQL Server 2008的主要和開發實例所做的設置,並且一直運行良好。

在某些時候,我開始懷疑這種方法,尤其是因爲每個MSMQ實例一次或兩次故障轉移似乎總是讓消息再次移動。

我問Udi Dahan(NServiceBus的作者)關於這個集羣託管策略,他給了我一個困惑的表達,並問:「爲什麼你會想要做這樣的事情?實際上,分銷商的重量非常輕,所以沒有太多理由將它們均勻分配到可用節點中。

之後,我們決定把我們學到的一切和recreate a new Failover Cluster with only one MSMQ instance。自那以後我們還沒有看到這個問題。當然,確保這個問題得到解決將會被證明是一種消極的,因此是不可能的。至少6個月沒有問題,但誰知道呢,我想它明天可能會失敗!我們希望不要。

1

您的終端配置如何保持其訂閱?

如果您的服務中的一個(或多個)服務遇到錯誤並且由Failoverclustermanager重新啓動,該怎麼辦?在這種情況下,該服務將再也不會收到來自其他服務的「我準備好工作」消息之一。

當你故障轉移到另一個節點時,我想你的所有服務都會再次發送這些消息,因此一切都會恢復正常。

要測試此行爲,請執行以下操作。

  1. 停止並重新啓動您的所有服務。
  2. 只停止其中一項服務。
  3. 重新啓動停止的服務。
  4. 如果您的系統沒有掛起,請對每項服務重複此操作。

如果您的系統現在再次掛起,請檢查您的配置。在這種情況下,至少有一個(如果不是全部)服務會在重新啓動之間丟失訂閱。如果您尚未這樣做,請將訂閱保留在數據庫中。

+0

訂閱已經保存在共享數據庫中。羣集分發服務器將其狀態存儲在羣集MSMQ隊列中。如果工作人員由故障轉移羣集管理器重新啓動,則它(在任何啓動時)所做的第一件事情之一是發送ReadyMessage。 – 2010-10-13 19:22:33

+0

確實,工作人員在開始時發送ReadyMessage。我要求持續的訂閱,因爲我有類似的問題。其中一個訂閱沒有正確保存在數據庫中,所以在重新啓動後,雖然它發送了它的消息,但是其他人完全忽略了它,因爲他們只檢查了數據庫。唯一的例外是當所有的服務都重新啓動時,那麼服務的消息再次被接收。在服務重啓時:郵件再次失敗。 – 2010-10-15 11:15:30

2

也許你的服務器被克隆,因此共享相同的隊列管理器ID(QMId)。

MSMQ將QMId用作緩存遠程機器地址的散列。如果網絡中有多臺計算機具有相同的QMId,則可能會收到卡住或丟失的消息。

閱讀本博客文章的解釋和解決方案:http://blogs.msdn.com/b/johnbreakwell/archive/2007/02/06/msmq-prefers-to-be-unique.aspx

+0

這不是我的情況,但非常好的信息。而且,似乎與MSMQ的課程不相上下,非常好。希望它能幫助別人。另一方面,我會繼續搜索...... – 2010-11-10 15:56:40

+0

祝你好運...... :-) – 2010-11-11 01:54:15