メッセージキュー用のMSMQクラスターグループを備えた3ノードフェールオーバークラスターでアプリケーションを実行しているサイトでデバッグしています。システムはノードのいくつかの組み合わせで動作しますが、すべてではないため、フェイルオーバーのセキュリティは意図したほど良くありません。
問題は、クラスター化されたキューからのメッセージの受信にあります。
アプリケーションがクラスターノードBまたはCで実行されると、MSMQが実行されているノードに関係なく機能します(機能=アプリケーションはメッセージを受信します)。アプリケーションがノードAで実行されると、MSMQが実行されている場所に関係なく、メッセージキューサービスが利用できないために失敗します。
さらに混乱させるために、GUIクライアントを使用して小さなWCF-MQプロキシサービスを作成しました。これにより、サービスにコマンドを送信し、クライアントの指定に従ってメッセージキューとの間で送受信を行うことができます。その過程で可能な限り多くのフィードバックを提供します。パターンはこのアプリと同じですが、MSMQが実行されている場所に関係なく、失敗するノードがノードCである点が異なります。
これが私がチェックしたことのいくつかです:
私は単なる開発者であり、Microsoftインフラストラクチャの専門家ではないので、質問したいと思います。このようなクラスター化されたMSMQセットアップをデバッグするときに実行する推奨手順は何ですか。
さて、これを自分で、そしてマイクロソフトのメッセージキューサポートチームと一緒に数週間デバッグした後、解決策が見つかりました。
TLDR;解決策は、レジストリキーを削除するか名前を変更することです
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\<SERVICENAME>\Environment
エラーの理由は、MQクライアントがローカルシステムでMQサービスを見つけることができないためです。これは、リモートMQと通信するために必要です。これは、リモートシステムに電子メールを転送するローカルSMTPサービスのようなものです。ただし、この場合、ローカルシステムはクラスターノードではなく、「クラスターグループ」であり、クラスターグループで実行されているMQサービスはありません(実際のシステムではなく、単なるエイリアスであるため)。 MQクライアントがクラスターグループでサービスを検索する理由は、クラスターサービス設定で[コンピューター名にネットワーク名を使用する]チェックボックスがオンになっているためです。これにより、クラスターノードのレジストリに新しい値が追加され、サービスの環境が設定されます。そして本当の問題は、このチェックボックスがオフになっていると、レジストリから値が削除されないため、一度設定すると(GUIから)設定を適切にクリアできなくなることです。したがって、修正は、regeditまたはregedtを使用して手動で値を削除することです。