Windows 故障轉移群集中的“消息隊列服務不可用”
我正在一個站點上進行調試,我們的應用程序在一個 3 節點故障轉移集群上執行,該集群具有一個用於消息隊列的 MSMQ 集群組。我們看到系統在某些節點組合上工作,但不是全部,因此故障轉移安全性不如預期。
問題在於從集群隊列接收消息。
當我們的應用程序在集群節點 B 或 C 上執行時,無論 MSMQ 在哪個節點上執行,它都能正常工作(工作 = 我們的應用程序接收消息)。當我們的應用程序在節點 A 上執行時,由於消息隊列服務不可用而失敗,無論 MSMQ 在哪裡執行。
更令人困惑的是,我創建了一個帶有 GUI 客戶端的小型 WCF-MQ-proxy 服務,它允許我向服務發送命令,然後該服務將發送到客戶端指定的消息隊列或從其接收 - 和在此過程中提供盡可能多的回饋。這個應用程序的模式是相同的,除了它失敗的節點是節點 C - 無論 MSMQ 在哪裡執行。
以下是我檢查過的一些內容:
- 該服務(我們的應用程序)在所有 3 個節點上的相同域使用者帳戶下執行。
- 應用程序配置文件包含消息隊列的相同路徑。
- 隊列訪問權限:每個人都有完全控制權。
- 本地 MSMQ 服務在所有節點上執行,我確保本地隊列的名稱與集群隊列不同。
- 在所有節點上禁用防火牆。
- 節點 A 與 B 和 C 的不同之處在於它在與集群網路相同的子網上有一個額外的網路連接。因此,當我從節點 B 對其進行 ping 操作時,它會響應“錯誤”介面。不確定這是否重要,但這有點奇怪。
- 服務選項“使用網路名稱作為機器名稱”似乎沒有任何改變。我的代理服務報告它是感知的機器名稱,對於節點 A,它始終返回集群組名稱,在節點 B 和 C 上,它始終返回節點名稱。
- MSMQ 群集組使用共享 iSCSI 驅動器進行儲存。
我只是一名開發人員,無論如何都不是 Microsoft 基礎架構專家,所以我想問一下:在調試這樣的集群 MSMQ 設置時,建議採取哪些步驟?
好的,所以在我自己和微軟的消息隊列支持團隊一起調試了幾週之後,找到了解決方案。
TLDR;解決方案是刪除或重命名系統資料庫項
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\<SERVICENAME>\Environment
錯誤的原因是 MQ 客戶端在本地系統上找不到 MQ 服務 - 這是與遠端 MQ 通信所必需的 - 有點像本地 SMTP 服務將您的電子郵件轉發到遠端系統。但是,本例中本地系統不是集群節點,而是“集群組”,並且集群組上沒有執行MQ服務(因為它不是真正的系統,只是一個別名)。MQ 客戶端在集群組上查找服務的原因是在集群服務設置中選中了“使用網路名稱作為電腦名稱”複選框。這在集群節點的系統資料庫中添加了一個新值,為服務設置環境。真正的問題是,當這個複選框未被選中時,它不會從系統資料庫中刪除值,有效地使設置後無法正確清除設置(從 GUI 中)。因此解決方法是使用 regedit 或 regedt 手動刪除該值。