Поделиться через


Сведения о настройке координатора распределенных транзакций (Майкрософт) (MSDTC) в Linux

Область применения: SQL Server — Linux

В этой статье описывается настройка координатора распределенных транзакций Майкрософт (MSDTC) в Linux.

MSDTC в Linux поддерживается в накопительном обновлении 16 и более поздних версиях SQL Server 2017 (14.x).

Обзор

Распределенные транзакции включены в SQL Server на Linux, введя функции сопоставления конечных точек MSDTC и удаленного вызова процедур (RPC) в SQL Server. По умолчанию процесс сопоставления конечных точек RPC прослушивает порт 135 на предмет входящих запросов RPC и предоставляет удаленным запросам сведения о зарегистрированных компонентах. Удаленные запросы могут использовать сведения, возвращенные сопоставителем конечных точек, для взаимодействия с зарегистрированными компонентами RPC, такими как службы MSDTC. Процессу требуются права суперпользователя для привязки к известным портам (номера портов меньше 1024) в Linux. Чтобы не запускать SQL Server с правами root для процесса сопоставителя конечных точек RPC, системные администраторы должны использовать iptables для создания преобразования сетевых адресов (NAT) для маршрутизации трафика через порт 135 в процесс сопоставления конечных точек RPC SQL Server.

MSDTC использует два параметра конфигурации для служебной программы mssql-conf :

Параметр mssql-conf Description
network.rpcport TCP-порт, к которому привязан процесс сопоставителя конечных точек RPC.
distributedtransaction.servertcpport Порт, который прослушивает сервер MSDTC. Если не задано, служба MSDTC использует случайный временный порт при перезапуске службы, а исключения брандмауэра необходимо перенастроить, чтобы служба MSDTC продолжала обмен данными.

Дополнительные сведения об этих параметрах и других параметрах, связанных с MSDTC, см. в статье Настройка SQL Server на Linux с помощью средства mssql-conf.

Поддерживаемые стандарты транзакций

Поддерживаются следующие конфигурации MSDTC.

Стандарт транзакции Источники данных Драйвер ODBC Драйвер JDBC
Транзакции OLE-TX SQL Server на Linux Да Нет
Распределенные транзакции XA SQL Server, другие источники данных ODBC и JDBC, которые поддерживают XA Да (требуется версия 17.3 или более поздняя) Да
Распределенные транзакции на связанном сервере SQL Server Да Нет

Дополнительные сведения см. в статье Основные сведения о транзакциях XA.

Шаги настройки MSDTC

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

  • Настройка network.rpcport и distributedtransaction.servertcpport использование mssql-conf.
  • Настройте брандмауэр, чтобы разрешить обмен данными через distributedtransaction.servertcpport порт 135.
  • Настройте маршрутизацию сервера Linux, чтобы связь RPC через порт 135 перенаправлялась в SQL Server network.rpcport.

Более подробные сведения по каждому шагу приведены в следующих разделах.

Настройка портов MSDTC и RPC

Сначала настройте network.rpcport и с помощью mssql-confdistributedtransaction.servertcpport. Этот шаг относится к SQL Server и является типичным для всех поддерживаемых дистрибутивов.

  1. Используйте mssql-conf для задания network.rpcport значения. В следующем примере задается значение 13500.

    sudo /opt/mssql/bin/mssql-conf set network.rpcport 13500
    
  2. distributedtransaction.servertcpport Задайте значение. В следующем примере задается значение 51999.

    sudo /opt/mssql/bin/mssql-conf set distributedtransaction.servertcpport 51999
    
  3. Перезапуск SQL Server.

    sudo systemctl restart mssql-server
    

Настройка брандмауэра

Второй шаг — настроить брандмауэр, чтобы разрешить обмен данными через servertcpport порт 135. Это позволяет процессу сопоставления конечных точек RPC и процессу MSDTC взаимодействовать во внешней среде с другими диспетчерами транзакций и координаторами. Фактические шаги для этого зависят от дистрибутива и брандмауэра Linux.

В следующем примере показано, как создать эти правила в Ubuntu.

sudo ufw allow from any to any port 51999 proto tcp
sudo ufw allow from any to any port 135 proto tcp
sudo ufw allow from any to any port 13500 proto tcp

В следующем примере показано, как это можно сделать в Red Hat Enterprise Linux (RHEL).

sudo firewall-cmd --zone=public --add-port=51999/tcp --permanent
sudo firewall-cmd --zone=public --add-port=135/tcp --permanent
sudo firewall-cmd --reload

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

Настройка маршрутизации портов

Настройте таблицу маршрутизации сервера Linux, чтобы связь RPC через порт 135 перенаправлялась в SQL Server network.rpcport. Механизм конфигурации для перенаправления портов в другом распределении может отличаться. В следующих разделах приведены рекомендации для Ubuntu, SUS Enterprise Linux (SLES) и Red Hat Enterprise Linux (RHEL).

Маршрутизация портов в Ubuntu и SLES

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

  1. Создайте правила маршрутизации для порта 135. В следующем примере порт 135 направляется на порт RPC 13500, определенный в предыдущем разделе. Замените <ipaddress> IP-адресом вашего сервера.

    sudo iptables -t nat -A PREROUTING -d <ip> -p tcp --dport 135 -m addrtype --dst-type LOCAL  \
       -j DNAT --to-destination <ip>:13500 -m comment --comment RpcEndPointMapper
    sudo iptables -t nat -A OUTPUT -d <ip> -p tcp --dport 135 -m addrtype --dst-type LOCAL \
       -j DNAT --to-destination <ip>:13500 -m comment --comment RpcEndPointMapper
    

    Параметр --comment RpcEndPointMapper в предыдущих командах помогает управлять этими правилами в последующих командах.

  2. Просмотрите созданные правила маршрутизации с помощью следующей команды.

    sudo iptables -S -t nat | grep "RpcEndPointMapper"
    
  3. Сохраните правила маршрутизации в файл на компьютере.

    sudo iptables-save > /etc/iptables.conf
    
  4. Чтобы перезагрузить правила после перезапуска, добавьте следующую команду /etc/rc.local в (для Ubuntu) или /etc/init.d/after.local (для SLES):

    iptables-restore < /etc/iptables.conf
    

    Примечание.

    Для редактирования rc.local файлов или after.local файлов необходимо иметь права суперпользоваемого пользователя (sudo).

Команды iptables-save и iptables-restore вместе с конфигурацией запуска rc.local/after.local предоставляют базовый механизм сохранения и восстановления записей iptables. В зависимости от дистрибутива Linux могут быть доступны расширенные или автоматизированные варианты. Например, альтернативой iptables-persistent Ubuntu является пакет для сохранения записей.

При выполнении предыдущих действий предполагается использование фиксированного IP-адреса. Если IP-адрес для вашего экземпляра SQL Server изменяется (из-за ручного вмешательства или DHCP), нужно удалить и повторно создать правила маршрутизации, если они были созданы с помощью iptables. Если нужно повторно создать или удалить существующие правила маршрутизации, можно использовать следующую команду для удаления старых правил RpcEndPointMapper.

sudo iptables -S -t nat | grep "RpcEndPointMapper" | sed 's/^-A //' | while read rule; do iptables -t nat -D $rule; done

Маршрутизация портов в RHEL

В дистрибутивах, использующих службу firewalld, например Red Hat Enterprise Linux, одну службу можно использовать как для открытия порта на сервере, так и для внутреннего перенаправления портов. Например, в Red Hat Enterprise Linux для создания сохраняемых правил перенаправления портов и управления ими нужно использовать службу firewalld (через служебную программу firewall-cmd с -add-forward-port или аналогичными параметрами), а не iptables.

sudo firewall-cmd --permanent --add-forward-port=port=135:proto=tcp:toport=13500
sudo firewall-cmd --reload

Проверка

На этом этапе SQL Server должен иметь возможность участвовать в распределенных транзакциях. Чтобы убедиться, что SQL Server прослушивает, выполните команду netstat (если вы используете RHEL, вам может потребоваться сначала установить пакет net-tools ):

sudo netstat -tulpn | grep sqlservr

Выходные данные должны соответствовать следующему примеру.

tcp 0 0 0.0.0.0:1433 0.0.0.0:* LISTEN 13911/sqlservr
tcp 0 0 127.0.0.1:1434 0.0.0.0:* LISTEN 13911/sqlservr
tcp 0 0 0.0.0.0:13500 0.0.0.0:* LISTEN 13911/sqlservr
tcp 0 0 0.0.0.0:51999 0.0.0.0:* LISTEN 13911/sqlservr
tcp6 0 0 :::1433 :::* LISTEN 13911/sqlservr
tcp6 0 0 ::1:1434 :::* LISTEN 13911/sqlservr
tcp6 0 0 :::13500 :::* LISTEN 13911/sqlservr
tcp6 0 0 :::51999 :::* LISTEN 13911/sqlservr

Однако после перезапуска SQL Server не начинает прослушивать servertcpport до первой распределенной транзакции. В этом примере sql Server не будет прослушивать порт 51999 в этом примере до первой распределенной транзакции.

Настройка проверки подлинности при RPC-взаимодействии для MSDTC

MSDTC для SQL Server на Linux по умолчанию не использует проверку подлинности для связи RPC. Однако при присоединении хост-компьютера к домену Active Directory можно настроить MSDTC для использования проверки подлинности связи RPC с помощью следующих параметров mssql-conf :

Параметр Description
distributedtransaction.allowonlysecurerpccalls Настройка только безопасных удаленных вызовов процедур (RPC) для распределенных транзакций. Значение по умолчанию равно 0.
distributedtransaction.fallbacktounsecurerpcifnecessary Настройка только безопасных удаленных вызовов процедур (RPC) для распределенных транзакций. Значение по умолчанию равно 0.
distributedtransaction.turnoffrpcsecurity Включение или отключение безопасности RPC для распределенных транзакций. Значение по умолчанию равно 0.

Дополнительные рекомендации

Active Directory

Корпорация Майкрософт рекомендует использовать MSDTC с поддержкой RPC, если SQL Server зарегистрирован в конфигурации Active Directory. Если SQL Server настроено на использование проверки подлинности Active Directory, MSDTC по умолчанию использует взаимную проверку подлинности RPC.

Windows и Linux.

Если клиент с операционной системой Windows необходимо включить в распределенную транзакцию с SQL Server на Linux, он должен иметь следующую минимальную версию операционной системы Windows.

Операционная система Минимальная версия Сборка ОС
Windows Server 1903 18362.30.190401-1528
Windows 10 1903 18362.267