Como configurar o MSDTC (Coordenador de Transações Distribuídas da Microsoft) no Linux
Aplica-se a: SQL Server – Linux
Este artigo descreve como configurar o MSDTC (Coordenador de Transações Distribuídas da Microsoft) no Linux.
Há suporte para o MSDTC no Linux a partir da atualização cumulativa 16 no SQL Server 2017 (14.x).
Visão geral
As transações distribuídas são habilitadas no SQL Server em Linux, introduzindo o MSDTC e a funcionalidade de mapeador de pontos de extremidade da chamada de procedimento remoto (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 raiz para o processo do mapeador de pontos de extremidade RPC, os administradores do sistema devem usar iptables para criar a conversão de endereços de rede para rotear o tráfego na porta 135 para o processo de mapeamento de ponto de extremidade RPC 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 em reinicializações de 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 no 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 a versão 17.3 ou posterior) | Sim |
Transações distribuídas no 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
Há três etapas para configurar a comunicação e a funcionalidade do MSDTC. Se as etapas de configuração necessárias não forem feitas, o SQL Server não habilitará a funcionalidade do MSDTC.
- Configure
network.rpcport
edistributedtransaction.servertcpport
usando 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
network.rpcport
do SQL Server.
As seções a seguir fornecem instruções detalhadas para cada etapa.
Configurar portas RPC e MSDTC
Primeiro, configure network.rpcport
e distributedtransaction.servertcpport
usando mssql-conf. Esta etapa é específica para o SQL Server e comum em todas as distribuições compatíveis.
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
Defina o valor
distributedtransaction.servertcpport
. O exemplo a seguir define-o para 51999.sudo /opt/mssql/bin/mssql-conf set distributedtransaction.servertcpport 51999
Reinicie o SQL Server.
sudo systemctl restart mssql-server
Configurar o firewall
A segunda etapa é configurar o firewall para permitir a comunicação em servertcpport
e na porta 135. Isso permite que o processo de mapeamento de pontos de extremidade RPC e o processo do MSDTC se comuniquem externamente com outros gerenciadores de transação e coordenadores. As etapas reais para isso variam de acordo com a distribuição do Linux e o firewall.
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
O exemplo a seguir mostra como isso pode ser feito no RHEL (Red Hat Enterprise Linux) :
sudo firewall-cmd --zone=public --add-port=51999/tcp --permanent
sudo firewall-cmd --zone=public --add-port=135/tcp --permanent
sudo firewall-cmd --reload
É importante configurar o firewall antes de configurar o roteamento de porta 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 network.rpcport
do SQL Server. O mecanismo de configuração para encaminhamento de porta em outras distribuições pode ser diferente. As seções a seguir fornecem diretrizes para Ubuntu, SLES (SUS Enterprise Linux) e RHEL (Red Hat Enterprise Linux).
Roteamento de porta no Ubuntu e no SLES
O Ubuntu e o SLES não usam o serviço firewalld, portanto, as regras de iptable são um mecanismo eficiente para conseguir o roteamento de porta. As regras de iptable podem não persistir durante reinícios, portanto, os comandos a seguir também fornecem instruções para restaurar as regras após uma reinicialização.
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 parâmetro
--comment RpcEndPointMapper
nos comandos anteriores ajuda a gerenciar essas regras em comandos posteriores.Exiba as regras de roteamento que você criou com o seguinte comando:
sudo iptables -S -t nat | grep "RpcEndPointMapper"
Salve as regras de roteamento em um arquivo no computador.
sudo iptables-save > /etc/iptables.conf
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
ouafter.local
.
Os comandos iptables-save e iptables-restore, juntamente com a configuração de inicialização rc.local
/after.local
, 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 a intervenção manual ou DHCP), você deverá remover e recriar as regras de roteamento se elas tiverem sido criadas com iptables. Se precisar recriar ou excluir regras de roteamento existentes, você poderá usar o comando a seguir para remover regras RpcEndPointMapper
antigas:
sudo iptables -S -t nat | grep "RpcEndPointMapper" | sed 's/^-A //' | while read rule; do iptables -t nat -D $rule; done
Roteamento de porta no RHEL
Em distribuições que usam o serviço firewalld, assim como o Red Hat Enterprise Linux, o mesmo serviço pode ser usado para abrir a porta no servidor e o encaminhamento de porta interno. Por exemplo, em Red Hat Enterprise Linux, você deve usar o serviço firewalld (por meio do utilitário de configuração firewall-cmd com -add-forward-port
ou opções semelhantes) para criar e gerenciar regras de encaminhamento de porta persistentes em vez de usar iptables.
sudo firewall-cmd --permanent --add-forward-port=port=135:proto=tcp:toport=13500
sudo firewall-cmd --reload
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 precise instalar primeiro o pacote net-tools):
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 em servertcpport
até a primeira transação distribuída. Nesse caso, você não verá 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 em 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, é possível configurar o MSDTC para usar a comunicação RPC autenticada usando as seguintes configurações de 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. |
Diretriz adicional
Active Directory
A Microsoft recomenda usar o MSDTC com RPC habilitado se o SQL Server estiver registrado em uma configuração do Active Directory. Se o SQL Server estiver configurado 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 | Build do sistema operacional |
---|---|---|
Windows Server | 1903 | 18362.30.190401-1528 |
Windows 10 | 1903 | 18362.267 |