Как я могу подключиться к облачной базе данных SQL через MSDTC?

Вопрос или проблема

Цель:

Я продолжаю разработку устаревшего приложения Windows Forms, работая локально на своем ноутбуке. Приложение полагается на MSDTC для подключения к базе данных SQL. Я хочу разместить базу данных SQL в облаке на Azure. VPN настроен для обеспечения связи между моим ноутбуком и виртуальной сетью Azure. Как я могу подключиться к базе данных SQL в облаке через MSDTC, чтобы разрабатывать локально?

Программное обеспечение:

  • Ноутбук: Windows 10, Visual Studio 2019
  • Виртуальный сервер баз данных: Windows 2012, SQL 2008 R2

Брандмауэр:

  • Брандмауэр Windows на ноутбуке: отключен
  • Брандмауэр Azure на сервере баз данных: разрешен трафик на портах 135, 5000-5099
  • Брандмауэр Windows на сервере баз данных: отключен

VPN:

  • SKU: Basic
  • Тип VPN: Маршрутизируемый

Домен Windows:

  • Ноутбук: Не присоединен к домену
  • Виртуальный сервер баз данных: Присоединен к домену Windows с отдельным выделенным контроллером домена

Безопасность DTC:

Сервер баз данных:

Сервер

Подтвержденная работа:

  • Записи в реестре были сделаны на сервере баз данных для настройки портов MSDTC как доступных из интернета. Команда netstat -an |find /i "listening" подтверждает, что эти порты прослушиваются.
  • Разрешение имен NetBIOS на виртуальный сервер баз данных с моего ноутбука работает (через запись файла хостов)

Ошибка:

Используя DTCPing для диагностики:

Вызов RPC-метода на sqlvm1 Проблема: не удалось вызвать удаленный метод RPC Ошибка (0x6D9) в dtcping.cpp @303 -->Исключение RPC ping -->1753 (нет доступных конечных точек от сопоставителя конечных точек.) Тест RPC не прошел

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

Azure SQL не поддерживает возможность MSDTC. Вам нужно использовать управляемый экземпляр Azure SQL или развернуть виртуальную машину Azure с сервером SQL. Убедитесь, что порт 135 доступен, так как это порт рукопожатия RPC, который MSDTC использует для подключения к удаленной службе MSDTC. Я бы протестировал установку виртуальной машины Azure с сервером SQL и открыл порт 1433, 135 + фиксированный порт для MSDTC (например, 30001), который вы настроите в реестре ServerTCPPort.

netsh advfirewall firewall set rule group="COM+ Network Access" new enable=Yes
netsh advfirewall firewall set rule group="Core Networking" new enable=Yes
netsh advfirewall firewall set rule group="Core Networking Diagnostics" new enable=Yes
netsh advfirewall firewall set rule group="Distributed Transaction Coordinator" new enable=Yes
reg add HKLM\SOFTWARE\Microsoft\COM3 /v RemoteAccessEnabled /t REG_DWORD /d 1 /f 
reg add HKLM\SOFTWARE\Microsoft\MSDTC /v ServerTcpPort /t REG_DWORD /d 30001 /f
powershell.exe Set-DtcNetworkSetting -DtcName "Local" -InboundTransactionsEnabled $True -OutboundTransactionsEnabled $True -RemoteClientAccessEnabled $True -RemoteAdministrationAccessEnabled $True -XATransactionsEnabled $True -LUTransactionsEnabled $True -AuthenticationLevel NoAuth -Confirm:$False
net stop MSDTC && net start MSDTC

Проверьте подключение к удаленному серверу SQL для SQL-порта, сопоставителя конечных точек RPC (135) и фиксированного порта MSDTC (ServerTCPPort):

$SQLServer="MYSQLSERVER.inazure.com"
Test-NetConnection -ComputerName $SQLServer -Port 1433 -InformationLevel Detailed -Verbose
Test-NetConnection -ComputerName $SQLServer -Port 135 -InformationLevel Detailed -Verbose
Test-NetConnection -ComputerName $SQLServer -Port 30001 -InformationLevel Detailed -Verbose

Некоторые полезные ссылки:

https://learn.microsoft.com/en-us/azure/azure-sql/managed-instance/distributed-transaction-coordinator-dtc?view=azuresql&tabs=azure-portal

https://techcommunity.microsoft.com/blog/azuresqlblog/ga-of-dtc-for-azure-sql-managed-instance/3983472

https://learn.microsoft.com/en-us/azure/azure-sql/database/elastic-transactions-overview?view=azuresql

Ответ или решение

Для успешного подключения к базе данных SQL в облаке через Microsoft Distributed Transaction Coordinator (MSDTC), важно правильно сконфигурировать все элементы системы от вашей локальной машины до облачных сервисов Azure. Давайте подробно разберем этот процесс, опираясь на предоставленную информацию.

Теория:

MSDTC – это сервис Windows, который координирует распределённые транзакции между различными источниками данных и обеспечивает их целостность. Этот механизм критически важен, когда разные базы данных участвуют в единой транзакции. Ваша текущая цель — подключиться из локального приложения на Windows Forms к SQL Server, размещенному на виртуальной машине в Azure, используя MSDTC.

Из проблемного описания видно, что вы уже настроили VPN-соединение между вашей машиной и виртуальной сетью в Azure, что является необходимым шагом для обеспечения безопасности и доступности. Однако возникла ошибка, связанная с невозможностью инициирования удалённого вызова (RPC). Эта ошибка часто возникает из-за проблем с доступом к портам или конфигурацией сетевого взаимодействия.

Пример:

Ваша текущая конфигурация предусматривает:

  • Открытие необходимых портов на межсетевых экранах Azure и отключение Windows Firewall.
  • Использование соединения VPN типа Route-based со SKU ‘Basic’.
  • Отсутствие доменной принадлежности вашей локальной машины, в то время как сервер базы данных находится в домене.

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

Применение:

Для решения возникшей проблемы следуйте нижеприведённым шагам:

  1. Конфигурация MSDTC на сервере SQL:

    • Убедитесь, что MSDTC правильно настроен для работы в сетевой среде. На сервере SQL выполните следующую команду PowerShell для конфигурации MSDTC:

      Set-DtcNetworkSetting -DtcName "Local" -InboundTransactionsEnabled $True -OutboundTransactionsEnabled $True -RemoteClientAccessEnabled $True -RemoteAdministrationAccessEnabled $True -XATransactionsEnabled $True -LUTransactionsEnabled $True -AuthenticationLevel NoAuth -Confirm:$False
    • Установите фиксированный порт для MSDTC, чтобы иметь возможность его открыть на межсетевом экране:

      reg add HKLM\SOFTWARE\Microsoft\MSDTC /v ServerTcpPort /t REG_DWORD /d 30001 /f
  2. Проверка портов и сетевых правил:

    • Проверьте доступность необходимых портов (135 для RPC, 30001 для MSDTC) на Azure Firewall и убедитесь, что они открыты на межсетевом экране виртуальной машины.

    • Используйте команды Test-NetConnection для проверки доступности вышеуказанных портов:

      Test-NetConnection -ComputerName <SQLServer_IP> -Port 135 -InformationLevel Detailed -Verbose
      Test-NetConnection -ComputerName <SQLServer_IP> -Port 30001 -InformationLevel Detailed -Verbose
  3. Обеспечение стабильности VPN соединения:

    • Убедитесь, что VPN исправно функционирует и поддерживает стабильное соединение для RPC вызовов.

    • Рассмотрите возможность обновления SKU VPN до более высокого уровня, например Standard, для повышения производительности и стабильности.

  4. Дополнительные меры безопасности и диагностика:

    • Проверьте конфигурацию DNS и сетевые маршруты, чтобы убедиться, что все запросы правильно маршрутизируются и разрешаются.

    • В случае продолжения проблем с RPC, изучите возможность включения Log Level в MSDTC для более детализированной диагностики возможных проблем.

Следуя этим рекомендациям, вы сможете обеспечить успешное подключение вашего приложения к облачному SQL Server через MSDTC и продолжить разработку, сохраняя целостность распределённых транзакций. Если проблемы продолжаются, рекомендуется провести дополнительные проверки конфигурации сети и VPN-соединения совместно с системным администратором или сетевым инженером.

Оцените материал
Добавить комментарий

Капча загружается...