Windows 故障转移群集中的“消息队列服务不可用”

Windows 故障转移群集中的“消息队列服务不可用”

我正在一个站点上进行调试,我们的应用程序运行在 3 节点故障转移群集上,该群集带有一个用于消息排队的 MSMQ 群集组。我们发现系统在某些节点组合上运行正常,但不是全部,因此故障转移安全性不如预期。

问题在于从集群队列接收消息。

当我们的应用程序在群集节点 B 或 C 上运行时,无论 MSMQ 在哪个节点上运行,它都可以正常工作(正常工作 = 我们的应用程序接收消息)。当我们的应用程序在节点 A 上运行时,无论 MSMQ 在何处运行,它都会因消息队列服务不可用而失败。

更令人困惑的是,我创建了一个带有 GUI 客户端的小型 WCF-MQ 代理服务,该服务允许我向服务发送命令,然后该服务将根据客户端的指定向消息队列发送或从消息队列接收消息 - 并在此过程中提供尽可能多的反馈。该应用程序的模式相同,只是失败的节点是节点 C - 无论 MSMQ 在哪里运行。

以下是我检查过的一些内容:

  • 该服务(我们的应用程序)在所有 3 个节点上的同一域用户帐户下运行。
  • 应用程序配置文件包含与消息队列相同的路径。
  • 队列访问权限:每个人都有完全控制权。
  • 本地 MSMQ 服务在所有节点上运行,并且我确保本地队列的名称与集群队列的名称不同。
  • 所有节点上的防火墙均已禁用。
  • 节点 A 与节点 B 和节点 C 的不同之处在于,它在与集群网络相同的子网上有一个额外的网络连接。因此,当我从节点 B ping 它时,它会在“错误”的接口上响应。不确定这是否重要,但这有点奇怪。
  • 服务选项“使用网络名称作为计算机名称”似乎没有改变任何东西。我的代理服务报告它感知到的计算机名称,对于节点 A,它始终返回群集组名称,对于节点 B 和 C,它始终返回节点名称。
  • MSMQ 集群组使用共享 iscsi 驱动器进行存储。

我只是一名开发人员,绝不是微软基础设施专家,所以我想问:在调试这样的集群 MSMQ 设置时,建议采取哪些步骤?

答案1

好的,经过几周的自行调试以及与 Microsofts Message Queue 支持团队的合作,我们找到了解决方案。

TLDR;解决方案是删除或重命名注册表项

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\<SERVICENAME>\Environment

错误的原因在于 MQ 客户端无法在本地系统上找到 MQ 服务 - 而这对于与远程 MQ 通信是必需的 - 有点像本地 SMTP 服务将您的电子邮件转发到远程系统。但是,在这种情况下,本地系统不是群集节点,而是“群集组”,并且群集组上没有运行 MQ 服务(因为它不是真正的系统,只是一个别名)。MQ 客户端在群集组上查找服务的原因是,群集服务设置中已选中“使用网络名称作为计算机名称”复选框。这会在群集节点的注册表中添加一个新值,为服务设置环境。真正的问题是,当取消选中此复选框时,它不会从注册表中删除该值,实际上使得一旦设置了设置就无法正确清除设置(从 GUI)。因此,解决方法是使用 regedit 或 regedt 手动删除该值。

相关内容