Compartilhar via


Como configurar o MSDTC (Coordenador de Transações Distribuídas da Microsoft) no Linux

Aplica-se a:SQL Server no Linux

Este artigo descreve como configurar o MSDTC (Coordenador de Transações Distribuídas da Microsoft) no Linux.

O MSDTC no Linux é suportado no SQL Server 2017 (14.x) Atualização Cumulativa 16 e versões posteriores.

Visão geral

Você habilita transações distribuídas no SQL Server no Linux introduzindo o MSDTC e a funcionalidade de mapeador de ponto de extremidade (RPC) no SQL Server. Por padrão, um processo de mapeamento de ponto de extremidade RPC escuta na porta 135 para solicitações RPC de entrada e fornece informações de componentes registrados a solicitações remotas. As solicitações remotas podem usar as informações retornadas pelo mapeador de pontos de extremidade para se comunicarem com os componentes RPC registrados, tais como os serviços MSDTC.

Um processo requer privilégios de superusuário para associar a portas conhecidas (números de porta menores que 1024) no Linux. Para evitar iniciar o SQL Server com privilégios de root para o processo de mapeamento de ponto de extremidade RPC, os administradores do sistema devem usar iptables para criar Tradução de Endereço de Rede para rotear o tráfego na porta 135 para o processo de mapeamento de ponto de extremidade RPC da instância do SQL Server.

O MSDTC usa dois parâmetros de configuração para o utilitário mssql-conf:

configuração mssql-conf Descrição
network.rpcport A porta TCP à qual o processo do mapeador de pontos de extremidade RPC é associado.
distributedtransaction.servertcpport A porta em que o servidor MSDTC escuta. Se não for definido, o serviço MSDTC usará uma porta efêmera aleatória na reinicialização do serviço, e as exceções de firewall precisarão ser reconfiguradas para garantir que o serviço MSDTC possa continuar a comunicação.

Para obter mais informações sobre essas configurações e outras configurações relacionadas do MSDTC, confira Configurar o SQL Server em Linux com a ferramenta mssql-conf.

Padrões de transação com suporte

As configurações do MSDTC a seguir são compatíveis:

Padrão de transação Fontes de dados driver ODBC Driver JDBC
Transações OLE-TX SQL Server em Linux Sim Não
Transações distribuídas XA SQL Server, outras fontes de dados ODBC e JDBC que dão suporte a XA Sim (requer versões 17.3 ou posteriores) Sim
Transações distribuídas em um servidor vinculado SQL Server Sim Não

Para saber mais, confira Noções básicas sobre Transações XA.

Etapas de configuração do MSDTC

Conclua as três etapas a seguir para configurar a comunicação e a funcionalidade do MSDTC para o SQL Server.

  • Configurar network.rpcport e distributedtransaction.servertcpport com mssql-conf.
  • Configure o firewall para permitir a comunicação em distributedtransaction.servertcpport e na porta 135.
  • Configure o roteamento do servidor Linux para que a comunicação RPC na porta 135 seja redirecionada para a instância do network.rpcportSQL Server.

As seções a seguir fornecem instruções detalhadas para cada etapa.

Configurar portas RPC e MSDTC

Configurar network.rpcport e distributedtransaction.servertcpport com mssql-conf. Esta etapa é específica do SQL Server e comum em todas as distribuições com suporte.

  1. Use mssql-conf para definir o valor network.rpcport. O exemplo a seguir define-o para 13500.

    sudo /opt/mssql/bin/mssql-conf set network.rpcport 13500
    
  2. Defina o valor distributedtransaction.servertcpport. O exemplo a seguir define-o para 51999.

    sudo /opt/mssql/bin/mssql-conf set distributedtransaction.servertcpport 51999
    
  3. Reinicie o SQL Server.

    sudo systemctl restart mssql-server
    

Configurar o firewall

Configure o firewall para permitir a comunicação em servertcpport e na porta 135. Esta etapa permite que o processo de mapeamento de ponto de extremidade RPC e o processo MSDTC se comuniquem externamente com outros gerentes e coordenadores de transações. O procedimento real varia dependendo da distribuição e do firewall do Linux.

O exemplo a seguir mostra como criar essas regras no 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

É importante configurar o firewall antes de configurar o roteamento de portas na próxima seção. A atualização do firewall pode limpar as regras de roteamento de porta em alguns casos.

Configurar roteamento de porta

Configure a tabela de roteamento do servidor Linux para que a comunicação RPC na porta 135 seja redirecionada para a instância do network.rpcportSQL Server. O mecanismo de configuração para encaminhamento de porta pode variar dependendo da distribuição. As seções a seguir fornecem diretrizes para Ubuntu, SUSE Enterprise Linux (SLES) e RHEL (Red Hat Enterprise Linux).

O Ubuntu e o SLES não usam o serviço firewalld, portanto, as regras iptables são um mecanismo eficiente para alcançar o encaminhamento de portas. As regras de iptables podem não persistir durante as reinicializações, portanto, os comandos a seguir também fornecem instruções para restaurar as regras após uma reinicialização.

  1. Crie regras de roteamento para a porta 135. No exemplo a seguir, a porta 135 é direcionada para a porta RPC, 13500, definida na seção anterior. Substitua <ipaddress> pelo endereço IP do servidor.

    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
    

    O --comment RpcEndPointMapper parâmetro nos comandos anteriores ajuda você a gerenciar essas regras em comandos posteriores.

  2. Exiba as regras de roteamento que você criou com o seguinte comando:

    sudo iptables -S -t nat | grep "RpcEndPointMapper"
    
  3. Salve as regras de roteamento em um arquivo no computador.

    sudo iptables-save > /etc/iptables.conf
    
  4. Para recarregar as regras após uma reinicialização, adicione o seguinte comando a /etc/rc.local (para Ubuntu) ou a /etc/init.d/after.local (para SLES):

    iptables-restore < /etc/iptables.conf
    

    Observação

    Você deve ter privilégios de superusuário (sudo) para editar os arquivos rc.local ou after.local.

Os comandos iptables-save e iptables-restore, juntamente com a rc.local/after.local configuração de inicialização, fornecem um mecanismo básico para salvar e restaurar Entradas de Iptables. Dependendo de sua distribuição do Linux, pode haver opções mais avançadas ou automatizadas disponíveis. Por exemplo, uma alternativa do Ubuntu é o pacote iptables-persistent para tornar as entradas persistentes.

As etapas anteriores pressupõem um endereço IP fixo. Se o endereço IP da instância do SQL Server for alterado (devido à intervenção manual ou DHCP), você deverá remover e recriar as regras de roteamento se as tiver criado com iptables. Se você precisar recriar ou excluir regras de roteamento existentes, use o seguinte comando para remover regras antigas RpcEndPointMapper :

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

Verificar

Neste ponto, o SQL Server deve ser capaz de participar de transações distribuídas. Para verificar se o SQL Server está escutando, execute o comando netstat . Se você estiver usando o RHEL, talvez seja necessário primeiro instalar o pacote de ferramentas de rede :

sudo netstat -tulpn | grep sqlservr

Você deverá ver uma saída semelhante ao seguinte exemplo:

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

No entanto, após uma reinicialização, o SQL Server não começa a escutar no servertcpport até a primeira transação distribuída. Nesse caso, você não veria o SQL Server escutando na porta 51999 neste exemplo até a primeira transação distribuída.

Configurar a autenticação na comunicação RPC para o MSDTC

O MSDTC para SQL Server no Linux não usa autenticação na comunicação RPC por padrão. No entanto, quando o computador host é ingressado em um domínio do Active Directory, você pode configurar o MSDTC para usar a comunicação RPC autenticada usando as seguintes configurações mssql-conf :

Configuração Descrição
distributedtransaction.allowonlysecurerpccalls Configure chamadas RPC somente seguras para transações distribuídas. O valor padrão é 0.
distributedtransaction.fallbacktounsecurerpcifnecessary Configure chamadas RPC somente de segurança para transações distribuídas. O valor padrão é 0.
distributedtransaction.turnoffrpcsecurity Habilitar ou desabilitar a segurança RPC para transações distribuídas. O valor padrão é 0.

Suportabilidade e compatibilidade

Active Directory

A Microsoft recomenda usar o MSDTC com O RPC habilitado se o SQL Server estiver registrado em uma configuração do Active Directory. Se você configurar o SQL Server para usar a autenticação do Active Directory, o MSDTC usará a segurança RPC de autenticação mútua por padrão.

Windows e Linux

Se um cliente em um sistema operacional Windows precisar se inscrever em uma transação distribuída com SQL Server em Linux, ele deverá ter a seguinte versão mínima do sistema operacional Windows:

Sistema operacional Versão mínima Compilação do sistema operacional
Windows Server 1903 18362.30.190401-1528
Windows 10 1903 18362.267