Я отлаживаю сайт, где наше приложение работает на 3-узловом отказоустойчивом кластере с группой кластеров MSMQ для очереди сообщений. Мы видим, что система работает на некоторых комбинациях узлов, но не на всех, поэтому безопасность отказоустойчивости не так хороша, как предполагалось.
Проблема связана с получением сообщений из кластеризованной очереди.
Когда наше приложение работает на узле кластера B или C, оно работает независимо от того, на каком узле запущен MSMQ (работает = наше приложение получает сообщения). Когда наше приложение работает на узле A, оно выходит из строя из-за недоступности службы очереди сообщений, независимо от того, где запущен MSMQ.
Чтобы еще больше все запутать, я создал небольшую службу WCF-MQ-proxy с клиентом GUI, которая позволяет мне отправлять команду службе, которая затем отправляет или получает сообщения из очереди, как указано клиентом, и дает как можно больше обратной связи в процессе. Шаблон тот же самый с этим приложением, за исключением того, что узел, где он дает сбой, это узел C, независимо от того, где запущен MSMQ.
Вот некоторые из вещей, которые я проверил:
- Сервис (наше приложение) работает под одними и теми же учетными записями пользователей домена на всех трех узлах.
- Файл конфигурации приложения содержит тот же путь к очереди сообщений.
- Права доступа к очереди: каждый имеет полный контроль.
- Локальная служба MSMQ запущена на всех узлах, и я убедился, что локальные очереди не имеют тех же имен, что и кластерные.
- Брандмауэр отключен на всех узлах.
- Узел A отличается от B и C тем, что у него есть дополнительное сетевое соединение в той же подсети, что и кластерная сеть. Поэтому, когда я пингую его с узла B, он отвечает на «неправильном» интерфейсе. Не уверен, имеет ли это значение, но это немного странно.
- Параметр службы "Использовать сетевое имя для имени машины" похоже ничего не меняет. Мой прокси-сервис сообщает свое воспринимаемое имя машины, и для узла A он всегда возвращает имя группы кластера, на узлах B и C он всегда возвращает имя узла.
- Группа кластера MSMQ использует для хранения общий диск iscsi.
Я всего лишь разработчик, а не эксперт по инфраструктуре Microsoft, поэтому хотел бы спросить: какие шаги рекомендуется предпринять при отладке кластерной конфигурации MSMQ, подобной этой?
решение1
Итак, после нескольких недель отладки этой проблемы мной самостоятельно и совместно с командой поддержки очереди сообщений Microsoft решение было найдено.
TLDR; решение — удалить или переименовать раздел реестра.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\<SERVICENAME>\Environment
Причина ошибки в том, что клиент MQ не может найти службу MQ в локальной системе, а это необходимо для связи с удаленным MQ, что-то вроде локальной службы SMTP, пересылающей ваши письма в удаленные системы. Однако в данном случае локальная система не является узлом кластера, а «группой кластера», и в группе кластера не запущена служба MQ (потому что это не настоящая система, а просто псевдоним). Причина, по которой клиент MQ ищет службу в группе кластера, заключается в том, что в настройках службы кластера был установлен флажок «Использовать сетевое имя для имени компьютера». Это добавляет новое значение в реестр узлов кластера, задавая среду для службы. И настоящая проблема в том, что когда этот флажок снят, он не удаляет значение из реестра, что фактически делает невозможным правильную очистку настройки (из графического интерфейса) после ее установки. Поэтому исправление заключается в том, чтобы вручную удалить значение с помощью regedit или regedt.