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

我正在debugging我们的应用程序运行在3节点故障转移群集与MSMQ群集组的消息队列的网站上。 我们看到,该系统在一些节点组合上工作,但不是全部,因此故障安全性不如预期。

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

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

为了更加混淆事物,我创build了一个带有GUI客户端的小型WCF-MQ代理服务,允许我向服务发送一个命令,然后服务将发送到客户端指定的消息队列或从消息队列接收 – 在这个过程中尽可能多地给予反馈。 该模式与此应用程序相同,除了失败的节点是节点C – 无论MSMQ在哪里运行。

以下是我检查的一些事情:

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

我只是一个开发人员,而不是任何方式的微软基础架构专家,所以我想问一下在debugging这样的集群式MSMQ安装时,build议采取什么措施?

好吧,经过几个星期的debugging,我自己和微软的Message Queue支持团队一起,find了一个解决scheme。

TLDR; 解决方法是删除或重命名registry项

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

错误的原因是MQ客户端无法在本地系统上findMQ服务 – 这是与远程MQ进行通信所必需的 – 有点类似于将您的电子邮件转发到远程系统的本地SMTP服务。 但是,本地系统不是本例中的集群节点,而是“集群组”,并且在集群组上没有运行MQ服务(因为它不是真正的系统,只是一个别名)。 MQ客户端在群集组上查找服务的原因是在群集服务设置中已选中“使用计算机名称的networking名称”checkbox。 这在群集节点的registry中增加了一个新的值,为服务设置了环境。 而真正的问题是,当这个checkbox被打开时,它不会从registry中删除这个值,从而无法在设置好之后从GUI中正确地清除设置。 所以修正是用regedit或regedt手动删除这个值。