SQL Server Service Broker. Диагностика и решение сетевых проблем.

В прошлый раз мы с вами разобрались с тем, каким образом устроены внутренние механизмы SQL Server Service Broker-а (https://blogs.technet.com/b/sqlruteam/archive/2016/04/07/sqlserver_2d00_service_2d00_broker_2d00_troubleshooting_2d00_overview.aspx). С этого блога начинаем знакомство с проблемами, которые могут возникнуть с брокером и методами их решения.

Далее мы обратим свое внимание на сетевые проблемы, как наиболее часто встречающиеся при первоначальном развертывании и при эксплуатации системы.

Какие виды ошибок сетевого доступа, чаше всего возникают при эксплуатации сервис-брокера

1. Общие сетевые проблемы характерные для любой установки SQL Server. 

2. Отсутствие точек подключения (Endpoint).

3. Точки подключения переведены в режим останова (STOPPED) или неправильно настроены.

4. Доступ к точкам подключения закрыт межсетевым экраном.

Прежде чем приступить к решению специфических сетевых проблем необходимо убедиться, что общие сетевые проблемы отсутствуют. Общесетевые проблемы связаны с ошибками при настройке сетевой инфраструктуры и не относятся к тематике данного блога. Поэтому здесь даны лишь общие рекомендации 

1. Убедиться в доступности удаленного хоста командой ping host_name, а если ping host_name не проходит, то выполнить ping по IP-адресу, и далее разбираться с системой разрешения имен.

2. Убедиться в доступности удаленного SQL Server с помощью команды SQLCMD -E -Sserver. Если это подключение невозможно, то необходимо разбираться с сетевыми соединениями на SQL Server, доступностью портов и работой SQL Browser.

После решения общих сетевых проблем (если это не привело к положительному результату и сервис-брокер по прежнему не работает) можно переключиться на решение специфических проблем сервис-брокера.

Отсутствие точек подключения (Endpoint)

 Необходимо убедиться, что точки подключения для Service Broker-а созданы, для этого необходимо выполнить команды.

use InstInitiatorDB;
GO
select * from sys.service_broker_endpoints;
GO
select * from sys.endpoints where name = 'InstInitiatorEndpoint';

Обратите внимание, что первая команда выполняется в контексте базы, на которой настроен сервис брокер.

Точки подключения переведены в режим останова (STOPPED) или неправильно настроены 

Если одна из точек остановлена (или некорректно настроена), то при попытке соединения с ней возникнет ошибка как показано ниже.

Такая же ошибка отображается и в трассах SQL Profiler. Как видно из трасс, SQL Server (не смотря на наличие ошибки) продолжает свои попытки установить соединение на точку подключения удаленного сервера.

При наличии подобной ошибки рекомендуется убедиться в доступности порта удаленной точки подключения. Как видно в данном случае соединение к порту не возможно.

После этого можно проверить"слушает" ли удаленный сервер порт номер 4022 (в данном случае это номер порта для Service Broker-а). Здесь показано как мы выгружаем в файл ports.txt данные о том, какой из процессов "слушает" какой порт.

После решения данной сетевой проблемы и восстановления соединения, сообщения будут переданы автоматически (См. последние 5 строк трассы).

  

Справедливости ради необходимо сказать, что с помощью утилиты ssbdiagnose.exe мы бы добились того же результата значительно быстрее.

  

 Доступ к точкам подключения закрыт межсетевым экраном.

Еще одной наиболее вероятной проблемой может быть закрытие портов межсетевыми экранами. Это более чем возможно, и потому еще, что для сервис-брокера могут использоваться нестандартные номера портов.

Последовательность решения здесь принципиально не отличается от вышеописанной, и, более того, как и в предыдущем случае, утилита ssbdiagnose.exe оказывается на высоте, давая нужный результат сразу.

В следующих статьях мы продолжим рассмотрение возможных причин некорректной работы SQL Server Service Broker.

Александр Каленик, Senior Premier Field Engineer (PFE), MSFT (Russia)