Сведения о настройке координатора распределенных транзакций (Майкрософт) (MSDTC) в LinuxHow to configure the Microsoft Distributed Transaction Coordinator (MSDTC) on Linux

Область применения:  ДаSQL Server (только в Linux) НетБаза данных SQL Azure НетХранилище данных SQL AzureНетParallel Data Warehouse APPLIES TO: yesSQL Server (Linux only) noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

В этой статье описывается настройка координатора распределенных транзакций Майкрософт (MSDTC) в Linux.This article describes how to configure the Microsoft Distributed Transaction Coordinator (MSDTC) on Linux.

Примечание

MSDTC в Linux поддерживается в SQL Server 2017 начиная с накопительного пакета обновления 16.MSDTC on Linux is supported on SQL Server 2017 starting with cumulative update 16.

ОбзорOverview

Чтобы включить распределенные транзакции в SQL Server на Linux, в SQL Server вводится MSDTC и функция сопоставителя конечных точек RPC.Distributed transactions are enabled on SQL Server on Linux by introducing MSDTC and RPC endpoint mapper functionality within SQL Server. По умолчанию процесс сопоставления конечных точек RPC прослушивает порт 135 на предмет входящих запросов RPC и предоставляет удаленным запросам сведения о зарегистрированных компонентах.By default, an RPC endpoint-mapping process listens on port 135 for incoming RPC requests and provides registered components information to remote requests. Удаленные запросы могут использовать сведения, возвращенные сопоставителем конечных точек, для взаимодействия с зарегистрированными компонентами RPC, такими как службы MSDTC.Remote requests can use the information returned by endpoint mapper to communicate with registered RPC components, such as MSDTC services. Процессу требуются права суперпользователя для привязки к известным портам (номера портов меньше 1024) в Linux.A process requires super user privileges to bind to well-known ports (port numbers less than 1024) on Linux. Чтобы не запускать SQL Server с правами root для процесса сопоставителя конечных точек RPC, системные администраторы должны использовать iptables для создания преобразования сетевых адресов (NAT) для маршрутизации трафика через порт 135 в процесс сопоставления конечных точек RPC SQL Server.To avoid starting SQL Server with root privileges for the RPC endpoint mapper process, system administrators must use iptables to create Network Address Translation to route traffic on port 135 to SQL Server's RPC endpoint-mapping process.

Координатор распределенных транзакций использует два параметра конфигурации для служебной программы mssql-conf.MSDTC uses two configuration parameters for the mssql-conf utility:

Параметр mssql-confmssql-conf setting ОписаниеDescription
network.rpcportnetwork.rpcport TCP-порт, к которому привязан процесс сопоставителя конечных точек RPC.The TCP port that the RPC endpoint mapper process binds to.
distributedtransaction.servertcpportdistributedtransaction.servertcpport Порт, который прослушивает сервер MSDTC.The port that the MSDTC server listens to. Если параметр не задан, служба MSDTC использует случайный временный порт при перезапуске службы и потребуется перенастроить исключения брандмауэра, чтобы служба MSDTC могла продолжить взаимодействие.If not set, the MSDTC service uses a random ephemeral port on service restarts, and firewall exceptions will need to be reconfigured to ensure that MSDTC service can continue communication.

Дополнительные сведения об этих параметрах и других параметрах, связанных с MSDTC, см. в статье Настройка SQL Server на Linux с помощью средства mssql-conf.For more information about these settings and other related MSDTC settings, see Configure SQL Server on Linux with the mssql-conf tool.

Поддерживаемые конфигурации MSDTCSupported MSDTC configurations

Поддерживаются следующие конфигурации MSDTC.The following MSDTC configurations are supported:

  • Распределенные транзакции OLE-TX относительно SQL Server на базе Linux для поставщиков ODBC.OLE-TX Distributed transactions against SQL Server on Linux for ODBC providers.

  • Распределенные транзакции XA относительно SQL Server на базе Linux с использованием поставщиков ODBC и JDBC.XA Distributed transactions against SQL Server on Linux using JDBC and ODBC providers. Для транзакций XA, выполняемых с помощью поставщика ODBC, нужно использовать Microsoft ODBC Driver for SQL Server версии 17.3 или более поздней.For XA transactions to be performed using ODBC provider, you need to use Microsoft ODBC Driver for SQL Server version 17.3 or higher. Дополнительные сведения см. в статье Основные сведения о транзакциях XA.For more information, see Understanding XA Transactions.

  • Распределенные транзакции на связанном сервере.Distributed transactions on Linked server.

Шаги настройки MSDTCMSDTC configuration steps

Настройка взаимодействия и функциональности MSDTC состоит из трех шагов.There are three steps to configure MSDTC communication and functionality. Если необходимые действия по настройке не выполнены, SQL Server не включит функции MSDTC.If the necessary configuration steps are not done, SQL Server will not enable MSDTC functionality.

  • Настройте network.rpcport и distributedtransaction.servertcpport с помощью mssql-conf.Configure network.rpcport and distributedtransaction.servertcpport using mssql-conf.
  • Настройте брандмауэр, чтобы разрешить обмен данными через distributedtransaction.servertcpport и порт 135.Configure the firewall to allow communication on distributedtransaction.servertcpport and port 135.
  • Настройте маршрутизацию сервера Linux таким образом, чтобы RPC-взаимодействие через порт 135 перенаправлялось на network.rpcport SQL Server.Configure Linux server routing so that RPC communication on port 135 is redirected to SQL Server's network.rpcport.

Более подробные сведения по каждому шагу приведены в следующих разделах.The following sections provide detailed instructions for each step.

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

Сначала настройте network.rpcport и distributedtransaction.servertcpport с помощью mssql-conf.First, configure network.rpcport and distributedtransaction.servertcpport using mssql-conf. Этот шаг относится к SQL Server и является типичным для всех поддерживаемых дистрибутивов.This step if specific to SQL Server and common across all supported distributions.

  1. Используйте mssql-conf, чтобы задать значение network.rpcport.Use mssql-conf to set the network.rpcport value. В следующем примере задается значение 13500.The following example sets it to 13500.

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

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

    sudo systemctl restart mssql-server
    

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

В качестве второго шага настройте брандмауэр, чтобы разрешить обмен данными через servertcpport и порт 135.The second step is to configure the firewall to allow communication on servertcpport and port 135. Это позволяет процессу сопоставления конечных точек RPC и процессу MSDTC взаимодействовать во внешней среде с другими диспетчерами транзакций и координаторами.This enables the RPC endpoint-mapping process and MSDTC process to communicate externally to other transaction managers and coordinators. Фактические шаги будут зависеть от дистрибутива Linux и брандмауэра.The actual steps for this will vary depending on your Linux distribution and firewall.

В следующем примере показано, как создать эти правила в Ubuntu.The following example shows how to create these rules on Ubuntu.

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

В следующем примере показано, как это можно сделать в Red Hat Enterprise Linux (RHEL) .The following example shows how this could be done on 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

Перед настройкой маршрутизации портов в следующем разделе нужно настроить брандмауэр.It is important to configure the firewall before configuring port routing in the next section. В некоторых случаях обновление брандмауэра может очистить правила маршрутизации портов.Refreshing the firewall can clear the port routing rules in some cases.

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

Настройте таблицу маршрутизации сервера Linux таким образом, чтобы RPC-взаимодействие через порт 135 перенаправлялось на network.rpcport SQL Server.Configure the Linux server routing table so that RPC communication on port 135 is redirected to SQL Server's network.rpcport. Механизм настройки перенаправления портов в разных дистрибутивах может отличаться.Configuration mechanism for port forwarding on different distribution may differ. В следующих разделах приведены рекомендации для Ubuntu, SUS Enterprise Linux (SLES) и Red Hat Enterprise Linux (RHEL).The following sections provide guidance for Ubuntu, SUS Enterprise Linux (SLES), and Red Hat Enterprise Linux (RHEL).

Маршрутизация портов в Ubuntu и SLESPort routing in Ubuntu and SLES

Ubuntu и SLES не используют службу firewalld, поэтому правила iptable являются эффективным механизмом для обеспечения маршрутизации портов.Ubuntu and SLES do not use the firewalld service, so iptable rules are an efficient mechanism to achieve port routing. Правила iptable могут не сохраняться во время перезагрузки, поэтому описание следующих команд также содержит инструкции по восстановлению правил после перезагрузки.The iptable rules may not persist during reboots, so the following commands also provide instructions for restoring the rules after a reboot.

  1. Создайте правила маршрутизации для порта 135.Create routing rules for port 135. В следующем примере порт 135 направляется на порт RPC 13500, определенный в предыдущем разделе.In the following example, port 135 is directed to the RPC port, 13500, defined in the previous section. Замените <ipaddress> IP-адресом вашего сервера.Replace <ipaddress> with the IP address of your server.

    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 в предыдущих командах помогает управлять этими правилами в последующих командах.The --comment RpcEndPointMapper parameter in the previous commands assists with managing these rules in later commands.

  2. Просмотрите созданные правила маршрутизации с помощью следующей команды.View the routing rules you created with the following command:

    sudo iptables -S -t nat | grep "RpcEndPointMapper"
    
  3. Сохраните правила маршрутизации в файл на компьютере.Save the routing rules to a file on your machine.

    sudo iptables-save > /etc/iptables.conf
    
  4. Чтобы перезагрузить правила после перезагрузки, добавьте следующую команду в /etc/rc.local (для Ubuntu) или в /etc/init.d/after.local (для SLES).To reload the rules after a reboot, add the following command to /etc/rc.local (for Ubuntu) or to /etc/init.d/after.local (for SLES):

    iptables-restore < /etc/iptables.conf
    

    Примечание

    Для изменения файлов rc.local или after.local нужны права суперпользователя (sudo).You must have super user (sudo) privileges to edit the rc.local or after.local files.

Команды iptables-save и iptables-restore вместе с конфигурацией запуска rc.local/after.local предоставляют базовый механизм сохранения и восстановления записей iptables.The iptables-save and iptables-restore commands, along with rc.local/after.local startup configuration, provide a basic mechanism to save and restore iptables entries. В зависимости от дистрибутива Linux могут быть доступны расширенные или автоматизированные варианты.Depending on your Linux distribution, there might be more advanced or automated options available. Например, в Ubuntu альтернативой является пакет iptables-persistent для обеспечения сохраняемости записей.For example, an Ubuntu alternative is the iptables-persistent package to make entries persistent.

Важно!

При выполнении предыдущих действий предполагается использование фиксированного IP-адреса.The previous steps assume a fixed IP address. Если IP-адрес для вашего экземпляра SQL Server изменяется (из-за ручного вмешательства или DHCP), нужно удалить и повторно создать правила маршрутизации, если они были созданы с помощью iptables.If the IP address for your SQL Server instance changes (due to manual intervention or DHCP), you must remove and recreate the routing rules if they were created with iptables. Если нужно повторно создать или удалить существующие правила маршрутизации, можно использовать следующую команду для удаления старых правил RpcEndPointMapper.If you need to recreate or delete existing routing rules, you can use the following command to remove old RpcEndPointMapper rules:

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

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

В дистрибутивах, использующих службу firewalld, например Red Hat Enterprise Linux, одну службу можно использовать как для открытия порта на сервере, так и для внутреннего перенаправления портов.On distributions that use firewalld service, such as Red Hat Enterprise Linux, the same service can be used for both opening the port on the server and internal port forwarding. Например, в Red Hat Enterprise Linux для создания сохраняемых правил перенаправления портов и управления ими нужно использовать службу firewalld (через служебную программу firewall-cmd с -add-forward-port или аналогичными параметрами), а не iptables.For example, on Red Hat Enterprise Linux, you should use firewalld service (via firewall-cmd configuration utility with -add-forward-port or similar options) to create and manage persistent port forwarding rules instead of using iptables.

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

ПроверкаVerify

На этом этапе SQL Server должен иметь возможность участвовать в распределенных транзакциях.At this point, SQL Server should be able to participate in distributed transactions. Чтобы убедиться, что SQL Server ожидает передачи данных, выполните команду netstat (если используется RHEL, вам может потребоваться сначала установить пакет net-tools).To verify that SQL Server is listening, run the netstat command (if you are using RHEL, you might have to first install the net-tools package):

sudo netstat -tulpn | grep sqlservr

Выходные данные должны иметь следующий вид.You should see output similar to the following:

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 до первой распределенной транзакции.However, after a restart, SQL Server does not start listening on the servertcpport until the first distributed transaction. В этом случае вы не увидите, как SQL Server прослушивает порт 51999 в этом примере, до первой распределенной транзакции.In this case, you would not see SQL Server listening on port 51999 in this example until the first distributed transaction.

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

По умолчанию MSDTC для SQL Server на Linux не использует проверку подлинности для RPC-взаимодействия.MSDTC for SQL Server on Linux does not use authentication on RPC communication by default. Однако если хост-компьютер присоединен к домену Active Directory (AD), можно настроить MSDTC для использования RPC-взаимодействия с проверкой подлинности, используя следующие параметры mssql-conf.However, when the host machine is joined to an Active Directory (AD) domain, it is possible to configure MSDTC to use authenticated RPC communication using following mssql-conf settings:

НастройкаSetting ОписаниеDescription
distributedtransaction.allowonlysecurerpccallsdistributedtransaction.allowonlysecurerpccalls Настройка только безопасных удаленных вызовов процедур (RPC) для распределенных транзакций.Configure secure only RPC calls for distributed transactions. Значение по умолчанию — 0.Default value is 0.
distributedtransaction.fallbacktounsecurerpcifnecessarydistributedtransaction.fallbacktounsecurerpcifnecessary Настройка только безопасных удаленных вызовов процедур (RPC) для распределенных транзакций.Configure security only RPC calls for distributed transactions. Значение по умолчанию — 0.Default value is 0.
distributedtransaction.turnoffrpcsecuritydistributedtransaction.turnoffrpcsecurity Включение или отключение безопасности RPC для распределенных транзакций.Enable or disable RPC security for distributed transactions. Значение по умолчанию — 0.Default value is 0.

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

Active DirectoryActive directory

Корпорация Майкрософт рекомендует использовать координатор распределенных транзакций с включенным RPC, если сервер SQL Server зарегистрирован в конфигурации Active Directory (AD).Microsoft recommends using MSDTC with RPC enabled if SQL Server is enrolled into an Active Directory (AD) configuration. Если в SQL Server настроено использование проверки подлинности Active Directory, координатор распределенных транзакций по умолчанию использует защиту RPC с помощью взаимной проверки подлинности.If SQL Server is configured to use AD authentication, MSDTC uses mutual authentication RPC security by default.

Windows и LinuxWindows and Linux

Если клиент с операционной системой Windows необходимо включить в распределенную транзакцию с SQL Server на Linux, он должен иметь следующую минимальную версию операционной системы Windows.If a client on a Windows operating system needs to enlist into distributed transaction with SQL Server on Linux, it must have the following minimum version of Windows operating system:

Операционная системаOperating system Минимальная версияMinimum version Сборка ОСOS Build
Windows ServerWindows Server 19031903 18362.30.190401-152818362.30.190401-1528
Windows 10Windows 10 19031903 18362.26718362.267

Следующие шагиNext steps

Дополнительные сведения об SQL Server на Linux см. в статье SQL Server на Linux.For more information about SQL Server on Linux, see SQL Server on Linux.