Condividi tramite


Come configurare Microsoft Distributed Transaction Coordinator (MSDTC) su Linux

Si applica a:SQL Server - Linux

Questo articolo descrive come configurare Microsoft Distributed Transaction Coordinator (MSDTC) in Linux.

MSDTC in Linux è supportato in SQL Server 2017 (14.x) a partire dall'aggiornamento cumulativo 16 e versioni successive.

Panoramica

Per abilitare le transazioni distribuite in SQL Server su Linux, si utilizzano MSDTC e la funzionalità di mapping dell'endpoint RPC (Chiamata di Procedura Remota) all'interno di SQL Server. Per impostazione predefinita, un processo di mapping degli endpoint RPC ascolta sulla porta 135 le richieste RPC in ingresso e fornisce informazioni sui componenti registrati alle richieste remote. Le richieste remote possono usare le informazioni restituite dal mapper di endpoint per comunicare con i componenti RPC registrati, ad esempio i servizi MSDTC.

Un processo richiede privilegi avanzati per l'associazione a porte note (numeri di porta inferiori a 1024) in Linux. Per evitare di avviare SQL Server con privilegi radice per il processo di mapping degli endpoint RPC, gli amministratori di sistema devono usare iptables per creare la traduzione degli indirizzi di rete per instradare il traffico sulla porta 135 al processo di mapping degli endpoint RPC dell'istanza di SQL Server.

MSDTC usa due parametri di configurazione per l'utilità mssql-conf:

Impostazione di mssql-conf Descrizione
network.rpcport Porta TCP cui si associa il processo di mapping degli endpoint RPC.
distributedtransaction.servertcpport Porta su cui è in ascolto il server MSDTC. Se non è impostata, il servizio MSDTC usa una porta temporanea casuale ai riavvii del servizio ed è necessario riconfigurare le eccezioni del firewall per garantire che il servizio MSDTC possa continuare le comunicazioni.

Per altre informazioni su queste impostazioni e altre impostazioni MSDTC correlate, vedere Configurare SQL Server in Linux con lo strumento mssql-conf.

Standard di transazione supportati

Sono supportate le configurazioni MSDTC seguenti:

Standard di transazione Origini dati Driver ODBC Driver JDBC
Transazioni OLE-TX SQL Server in Linux NO
Transazioni distribuite XA SQL Server, altre origini dati ODBC e JDBC che supportano XA Sì (richiede la versione 17.3 o successiva)
Transazioni distribuite nel server collegato SQL Server NO

Per altre informazioni, vedere Informazioni sulle transazioni XA.

Passaggi di configurazione di MSDTC

Completare i tre passaggi seguenti per configurare la comunicazione e le funzionalità MSDTC per SQL Server.

  • Configurare network.rpcport e distributedtransaction.servertcpport con mssql-conf.
  • Configurare il firewall per consentire la comunicazione su distributedtransaction.servertcpport e sulla porta 135.
  • Configurare il routing del server Linux in modo che la comunicazione RPC sulla porta 135 venga reindirizzata all'istanza di network.rpcportSQL Server.

Le sezioni seguenti includono istruzioni dettagliate per ogni passaggio.

Configurare le porte RPC e MSDTC

Configurare network.rpcport e distributedtransaction.servertcpport con mssql-conf. Questo passaggio è specifico di SQL Server e comune in tutte le distribuzioni supportate.

  1. Usare mssql-conf per impostare il valore network.rpcport. Nell'esempio seguente viene impostato il valore 13500.

    sudo /opt/mssql/bin/mssql-conf set network.rpcport 13500
    
  2. Imposta il valore distributedtransaction.servertcpport. Nell'esempio seguente viene impostato il valore 51999.

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

    sudo systemctl restart mssql-server
    

Configurare il firewall

Configurare il firewall per consentire la comunicazione su servertcpport e sulla porta 135. Questo passaggio consente al processo di mapping degli endpoint RPC e al processo MSDTC di comunicare esternamente ad altri gestori transazioni e coordinatori. La procedura effettiva varia a seconda della distribuzione e del firewall di Linux.

L'esempio seguente mostra come creare queste regole in 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 configurare il firewall prima di configurare il routing delle porte nella sezione successiva. In alcuni casi, l'aggiornamento del firewall può cancellare le regole di routing delle porte.

Configurare il routing delle porte

Configurare la tabella di routing del server Linux in modo che la comunicazione RPC sulla porta 135 venga reindirizzata all'istanza di network.rpcportSQL Server. Il meccanismo di configurazione per il port forwarding può variare in diverse distribuzioni. Le sezioni seguenti forniscono indicazioni per Ubuntu, SUSE Enterprise Linux (SLES) e Red Hat Enterprise Linux (RHEL).

Ubuntu e SLES non usano il servizio firewall , quindi le regole iptables sono un meccanismo efficiente per ottenere il routing delle porte. Le regole iptables potrebbero non essere persistenti durante i riavvii, pertanto i comandi seguenti forniscono anche istruzioni per il ripristino delle regole dopo un riavvio.

  1. Creare regole di routing per la porta 135. Nell'esempio seguente la porta 135 viene indirizzata alla porta RPC 13500 definita nella sezione precedente. Sostituire <ipaddress> con l'indirizzo IP del 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
    

    Il --comment RpcEndPointMapper parametro nei comandi precedenti consente di gestire queste regole nei comandi successivi.

  2. Visualizzare le regole di routing create con il comando seguente:

    sudo iptables -S -t nat | grep "RpcEndPointMapper"
    
  3. Salvare le regole di routing in un file nel computer.

    sudo iptables-save > /etc/iptables.conf
    
  4. Per ricaricare le regole dopo un riavvio, aggiungere il comando seguente a /etc/rc.local (per Ubuntu) o a /etc/init.d/after.local (per SLES):

    iptables-restore < /etc/iptables.conf
    

    Nota

    Per modificare i file rc.local o after.local, è necessario disporre di privilegi avanzati (sudo).

I iptables-save comandi eiptables-restore, insieme allarc.local/after.localconfigurazione di avvio, forniscono un meccanismo di base per salvare e ripristinare le voci di iptable. A seconda della distribuzione Linux potrebbero essere disponibili opzioni più avanzate o automatizzate. Ad esempio, un'alternativa ad Ubuntu è il pacchetto iptables-persistent per rendere persistenti le voci.

I passaggi precedenti presuppongono un indirizzo IP fisso. Se l'indirizzo IP per l'istanza di SQL Server cambia (a causa dell'intervento manuale o DHCP), è necessario rimuovere e ricreare le regole di routing se sono state create con iptable. Se è necessario ricreare o eliminare regole di routing esistenti, usare il comando seguente per rimuovere le regole precedenti RpcEndPointMapper :

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

Verificare

A questo punto, SQL Server dovrebbe essere in grado di partecipare alle transazioni distribuite. Per verificare che SQL Server sia in ascolto, eseguire il comando netstat . Se si usa RHEL, potrebbe essere necessario prima installare il pacchetto net-tools :

sudo netstat -tulpn | grep sqlservr

L'output dovrebbe essere simile all'esempio seguente:

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

Tuttavia, dopo un riavvio, SQL Server non inizia l'ascolto su servertcpport fino alla prima transazione distribuita. In questo caso, SQL Server non sarà in ascolto sulla porta 51999 fino alla prima transazione distribuita.

Configurare l'autenticazione per le comunicazioni RPC per MSDTC

MSDTC per SQL Server in Linux non usa l'autenticazione per le comunicazioni RPC per impostazione predefinita. Tuttavia, quando il computer host viene aggiunto a un dominio di Active Directory, è possibile configurare MSDTC per l'uso delle comunicazioni RPC autenticate usando le impostazioni mssql-conf seguenti:

Impostazione Descrizione
distributedtransaction.allowonlysecurerpccalls Configurare solo chiamate RPC protette per le transazioni distribuite. Il valore predefinito è 0.
distributedtransaction.fallbacktounsecurerpcifnecessary Configurare la sicurezza delle sole chiamate RPC per le transazioni distribuite. Il valore predefinito è 0.
distributedtransaction.turnoffrpcsecurity Abilitare o disabilitare la sicurezza RPC per le transazioni distribuite. Il valore predefinito è 0.

Supporto e compatibilità

Active Directory

Microsoft consiglia di usare MSDTC con RPC abilitato se SQL Server è registrato in una configurazione di Active Directory. Se si configura SQL Server per l'uso dell'autenticazione di Active Directory, MSDTC usa la sicurezza RPC di autenticazione reciproca per impostazione predefinita.

Windows e Linux

Se un client in un sistema operativo Windows deve integrarsi in una transazione distribuita con SQL Server in Linux, deve avere la versione minima del sistema operativo Windows seguente:

Sistema operativo Versione minima Build del sistema operativo
Windows Server 1903 18362.30.190401-1528
Windows 10 1903 18362.267