Konfigurieren von Microsoft Distributed Transaction Coordinator (MS DTC) unter Linux

Gilt für: SQL Server – Linux

In diesem Artikel wird beschrieben, wie Microsoft Distributed Transaction Coordinator (MS DTC) unter Linux konfiguriert wird.

MS DTC für Linux wird in SQL Server 2017 (14.x) kumulatives Update 16 und in höheren Versionen unterstützt.

Übersicht

Verteilte Transaktionen sind für SQL Server für Linux aktiviert, indem MS DTC und die Funktion der Remoteprozeduraufruf (RPC) -Endpunktzuordnung in SQL Server eingeführt werden. Standardmäßig lauscht ein RPC-Endpunktzuordnungsprozess an Port 135 für eingehende RPC-Anforderungen und bietet Informationen zu registrierten Komponenten für Remoteanforderungen. Remoteanforderungen können die von der Endpunktzuordnung zurückgegebenen Informationen zum Kommunizieren mit registrierten RPC-Komponenten wie MS DTC-Diensten verwenden. Ein Prozess erfordert unter Linux Superuser-Berechtigungen für die Bindung an bekannte Ports (Portnummern unter 1024). Systemadministratoren müssen iptables zum Erstellen einer Netzwerkadressenübersetzung für das Routen von Datenverkehr an Port 135 zum RPC-Endpunktzuordnungsprozess von SQL Server verwenden, um zu vermeiden, dass SQL Server mit Stammberechtigungen für den RPC-Endpunktzuordnungsprozess gestartet wird.

MS DTC verwendet zwei Konfigurationsparameter für das mssql-conf-Hilfsprogramm:

mssql-conf-Einstellung Beschreibung
network.rpcport Der TCP-Port, an den der RPC-Endpunktzuordnungsprozess gebunden wird.
distributedtransaction.servertcpport Der Port, an dem der MS DTC-Server lauscht. Wenn dieser nicht festgelegt ist, verwendet der MS DTC-Dienst bei Neustarts des Diensts einen zufälligen kurzlebigen Port. Firewallausnahmen müssen neu konfiguriert werden, um sicherzustellen, dass die Kommunikation mit dem MS DTC-Dienst fortgesetzt werden kann.

Weitere Informationen zu diesen Einstellungen und weiteren MS DTC-Einstellungen finden Sie unter Konfigurieren von SQL Server für Linux mit dem mssql-conf-Tool.

Unterstützte Transaktionsstandards

Die folgenden MS DTC-Konfigurationen werden unterstützt:

Transaktionsstandard Datenquellen ODBC-Treiber JDBC-Treiber
OLE-TX-Transaktionen SQL Server unter Linux Ja Nein
Verteilte XA-Transaktionen SQL Server sowie andere ODBC- und JDBC-Datenquellen mit Unterstützung für XA Ja (Version 17.3 oder höher erforderlich) Ja
Verteilte Transaktionen auf Verbindungsserver SQL Server Ja Nein

Weitere Informationen finden Sie unter Grundlegendes zu XA-Transaktionen.

MS DTC-Konfigurationsschritte

Es gibt drei Schritte, um die MS DTC-Kommunikation und -Funktionalität zu konfigurieren. Wenn die erforderlichen Konfigurationsschritte nicht ausgeführt werden, aktiviert SQL Server die MS DTC-Funktionalität nicht.

  • Konfigurieren von network.rpcport und distributedtransaction.servertcpport mit mssql-conf.
  • Konfigurieren Sie die Firewall so, dass die Kommunikation auf distributedtransaction.servertcpport und an Port 135 zugelassen wird.
  • Konfigurieren des Linux-Serverroutings, sodass die RPC-Kommunikation an Port 135 an network.rpcport von SQL Server umgeleitet wird.

Die folgenden Abschnitte enthalten detaillierte Anweisungen für die einzelnen Schritte.

Konfigurieren von RPC- und MS DTC-Ports

Konfigurieren Sie zuerst network.rpcport und distributedtransaction.servertcpport mit mssql-conf. Dieser Schritt gilt für SQL Server und für alle unterstützten Distributionen einheitlich.

  1. Verwenden Sie mssql-conf, um den network.rpcport-Wert festzulegen. Im folgenden Beispiel wird dieser auf „13500“ festgelegt.

    sudo /opt/mssql/bin/mssql-conf set network.rpcport 13500
    
  2. Legen Sie den distributedtransaction.servertcpport-Wert fest. Im folgenden Beispiel wird dieser auf 51999 festgelegt.

    sudo /opt/mssql/bin/mssql-conf set distributedtransaction.servertcpport 51999
    
  3. Starten Sie SQL Server neu.

    sudo systemctl restart mssql-server
    

Konfigurieren der Firewall

Der zweite Schritt besteht darin, die Firewall zu konfigurieren, um die Kommunikation an servertcpport und Port 135 zuzulassen. Dadurch kann der RPC-Endpunktzuordnungsprozess und der MS DTC-Prozess aktiviert werden, um extern mit anderen Transaktions-Managern und Koordinatoren zu kommunizieren. Die eigentlichen Schritte hierfür sind abhängig von Ihrer Linux-Distribution und Ihrer Firewall.

Im folgenden Beispiel wird das Erstellen dieser Regeln unter Ubuntu gezeigt.

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

Im folgenden Beispiel wird gezeigt, wie dies unter Red Hat Enterprise Linux (RHEL) durchgeführt werden kann:

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

Es ist wichtig, dass die Firewall vor dem Konfigurieren des Portroutings im nächsten Abschnitt konfiguriert wird. Das Aktualisieren der Firewall kann in manchen Fällen die Portroutingregeln löschen.

Konfigurieren des Portroutings

Konfigurieren Sie die Linux-Serverroutingtabelle, sodass die RPC-Kommunikation an Port 135 an network.rpcport von SQL Server umgeleitet wird. Der Konfigurationsmechanismus für die Portweiterleitung kann sich bei unterschiedlichen Distributionen unterscheiden. Die folgenden Abschnitte enthalten Anleitungen für Ubuntu, SUS Enterprise Linux (SLES) und Red Hat Enterprise Linux (RHEL).

Portrouting in Ubuntu und SLES

Ubuntu und SLES (SUSE Linux Enterprise Server) verwenden nicht den firewalld-Dienst, sodass iptable-Regeln einen effizienten Mechanismus zum Erreichen von Portrouting bieten. Die iptable-Regeln bleiben bei Neustarts möglicherweise nicht erhalten, sodass die folgenden Befehle auch Anweisungen zum Wiederherstellen der Regeln nach einem Neustart enthalten.

  1. Erstellen Sie Routingregeln für Port 135. Im folgenden Beispiel wird Port 135 an den RPC-Port 13500 weitergeleitet, der im vorherigen Abschnitt definiert wurde. Ersetzen Sie <ipaddress> durch die IP-Adresse Ihres Servers.

    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
    

    Der --comment RpcEndPointMapper-Parameter in den vorherigen Befehlen unterstützt Sie bei der Verwaltung dieser Regeln in späteren Befehlen.

  2. Lassen Sie die mit dem folgenden Befehl erstellten Routingregeln anzeigen:

    sudo iptables -S -t nat | grep "RpcEndPointMapper"
    
  3. Speichern Sie die Routingregeln in einer Datei auf Ihrem Computer.

    sudo iptables-save > /etc/iptables.conf
    
  4. Fügen Sie den folgenden Befehl zu /etc/rc.local (für Ubuntu) oder zu /etc/init.d/after.local (für SLES) hinzu, um die Regeln nach einem Neustart erneut zu laden:

    iptables-restore < /etc/iptables.conf
    

    Hinweis

    Sie müssen über Superuser-Berechtigungen (Sudo) verfügen, um die Dateien rc.local oder after.local zu bearbeiten.

Die Befehle iptables-save und iptables-restore stellen zusammen mit der Startkonfiguration rc.local/after.local einen grundlegenden Mechanismus zum Speichern und Wiederherstellen von iptables-Entitäten bereit. Abhängig von Ihrer Linux-Distribution sind möglicherweise erweiterte oder automatisierte Optionen verfügbar. Eine Ubuntu-Alternative ist beispielsweise das iptables-persistent-Paket, um Einträge persistent zu machen.

In den vorherigen Schritte wird von einer festen IP-Adresse ausgegangen. Wenn sich die IP-Adresse für Ihre SQL Server-Instanz (aufgrund von manuellem Eingriff oder DHCP) ändert, müssen Sie die Routingregeln entfernen und neu erstellen, wenn diese mit iptables erstellt wurden. Wenn Sie vorhandene Routingregeln neu erstellen oder löschen müssen, können Sie den folgenden Befehl zum Löschen alter RpcEndPointMapper-Regeln verwenden:

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

Portrouting in RHEL

Bei Distributionen wie Red Hat Enterprise Linux, die den firewalld-Dienst verwenden, kann derselbe Dienst sowohl für das Öffnen des Ports auf dem Server als auch für die interne Portweiterleitung verwendet werden. Im Fall von Red Hat Enterprise Linux sollten Sie beispielsweise anstatt iptables den firewalld-Dienst verwenden (über das firewall-cmd-Konfigurationshilfsprogramm mit -add-forward-port oder ähnlichen Optionen), um persistente Portweiterleitungsregeln zu erstellen und zu verwalten.

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

Überprüfung

An diesem Punkt sollte SQL Server an verteilten Transaktionen teilnehmen können. Führen Sie den Befehl netstat aus, um zu überprüfen, ob SQL Server lauscht (Wenn Sie RHEL verwenden, müssen Sie möglicherweise zuerst das Paket net-tools installieren):

sudo netstat -tulpn | grep sqlservr

Die Ausgabe sollte etwa folgendem Beispiel entsprechen:

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

Nach einem Neustart beginnt SQL Server jedoch bis zur ersten verteilten Transaktion nicht damit, an servertcpport zu lauschen. In diesem Fall würde SQL Server bis zur ersten verteilten Transaktion nicht an Port 51999 lauschen.

Konfigurieren der Authentifizierung für die RPC-Kommunikation für MS DTC

MS DTC für SQL Server für Linux verwendet standardmäßig keine Authentifizierung für die RPC-Kommunikation. Wenn der Hostcomputer jedoch einer Active Directory-Domäne hinzugefügt wird, ist es möglich, MS DTC mithilfe der folgenden mssql-conf-Einstellungen für die Verwendung der authentifizierten RPC-Kommunikation zu konfigurieren:

Einstellung Beschreibung
distributedtransaction.allowonlysecurerpccalls Konfigurieren von sicheren RPC-Aufrufen für verteilte Transaktionen. Der Standardwert ist 0.
distributedtransaction.fallbacktounsecurerpcifnecessary Konfigurieren von sicheren RPC-Aufrufen für verteilte Transaktionen. Der Standardwert ist 0.
distributedtransaction.turnoffrpcsecurity Aktivieren oder Deaktivieren der RPC-Sicherheit für verteilte Transaktionen. Der Standardwert ist 0.

Zusätzliche Anleitungen

Active Directory

Microsoft empfiehlt die Verwendung von MS DTC mit aktiviertem RPC, wenn SQL Server in einer Active Directory-Konfiguration registriert ist. Wenn SQL Server für die Verwendung der Active Directory-Authentifizierung konfiguriert ist, verwendet MS DTC standardmäßig die RPC-Sicherheit mit gegenseitiger Authentifizierung.

Windows und Linux

Wenn sich ein Client mit Windows-Betriebssystem bei einer verteilten Transaktion mit SQL Server für Linux eintragen muss, benötigt er die folgende Mindestversion des Windows-Betriebssystems:

Betriebssystem Mindestversion Betriebssystembuild
Windows Server 1903 18362.30.190401-1528
Windows 10 1903 18362.267