web-dev-qa-db-ja.com

Windowsフェールオーバークラスターの「メッセージキューサービスを利用できません」

メッセージキュー用のMSMQクラスターグループを備えた3ノードフェールオーバークラスターでアプリケーションを実行しているサイトでデバッグしています。システムはノードのいくつかの組み合わせで動作しますが、すべてではないため、フェイルオーバーのセキュリティは意図したほど良くありません。

問題は、クラスター化されたキューからのメッセージの受信にあります。

アプリケーションがクラスターノードBまたはCで実行されると、MSMQが実行されているノードに関係なく機能します(機能=アプリケーションはメッセージを受信します)。アプリケーションがノードAで実行されると、MSMQが実行されている場所に関係なく、メッセージキューサービスが利用できないために失敗します。

さらに混乱させるために、GUIクライアントを使用して小さなWCF-MQプロキシサービスを作成しました。これにより、サービスにコマンドを送信し、クライアントの指定に従ってメッセージキューとの間で送受信を行うことができます。その過程で可能な限り多くのフィードバックを提供します。パターンはこのアプリと同じですが、MSMQが実行されている場所に関係なく、失敗するノードがノードCである点が異なります。

これが私がチェックしたことのいくつかです:

  • サービス(アプリ)は、3つのノードすべてで同じドメインユーザーアカウントで実行されます。
  • アプリの設定ファイルには、メッセージキューへの同じパスが含まれています。
  • キューのアクセス権:誰もが完全に制御できます。
  • ローカルMSMQサービスはすべてのノードで実行されており、ローカルキューの名前がクラスター化されたキューと同じではないことを確認しました。
  • ファイアウォールはすべてのノードで無効になっています。
  • ノードAは、クラスターネットワークと同じサブネット上に追加のネットワーク接続があるという点でBおよびCとは異なります。そのため、ノードBからpingを実行すると、「間違った」インターフェイスで応答します。それが重要かどうかはわかりませんが、少し奇妙です。
  • サービスオプション「マシン名にネットワーク名を使用する」は何も変更されていないようです。私のプロキシサービスは、認識されたマシン名を報告します。ノードAの場合は常にクラスターグループ名を返し、ノードBとCの場合は常にノード名を返します。
  • MSMQクラスターグループは、ストレージに共有iscsiドライブを使用します。

私は単なる開発者であり、Microsoftインフラストラクチャの専門家ではないので、質問したいと思います。このようなクラスター化されたMSMQセットアップをデバッグするときに実行する推奨手順は何ですか。

2
Kenned

さて、これを自分で、そしてマイクロソフトのメッセージキューサポートチームと一緒に数週間デバッグした後、解決策が見つかりました。

TLDR;解決策は、レジストリキーを削除するか名前を変更することです

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

エラーの理由は、MQクライアントがローカルシステムでMQサービスを見つけることができないためです。これは、リモートMQと通信するために必要です。これは、リモートシステムに電子メールを転送するローカルSMTPサービスのようなものです。ただし、この場合、ローカルシステムはクラスターノードではなく、「クラスターグループ」であり、クラスターグループで実行されているMQサービスはありません(実際のシステムではなく、単なるエイリアスであるため)。 MQクライアントがクラスターグループでサービスを検索する理由は、クラスターサービス設定で[コンピューター名にネットワーク名を使用する]チェックボックスがオンになっているためです。これにより、クラスターノードのレジストリに新しい値が追加され、サービスの環境が設定されます。そして本当の問題は、このチェックボックスがオフになっていると、レジストリから値が削除されないため、一度設定すると(GUIから)設定を適切にクリアできなくなることです。したがって、修正は、regeditまたはregedtを使用して手動で値を削除することです。

3
Kenned