Compartir por


Cómo configurar el Coordinador de transacciones distribuidas de Microsoft (MSDTC) en Linux

Se aplica a:SQL Server en Linux

En este artículo se describe cómo configurar el Coordinador de transacciones distribuidas de Microsoft (MSDTC) en Linux.

MSDTC en Linux se admite en SQL Server 2017 (14.x) a partir de la actualización acumulativa 16 y versiones posteriores.

Información general

Habilitas las transacciones distribuidas en SQL Server en Linux introduciendo la funcionalidad para el mapeo de puntos de conexión MSDTC y RPC dentro de SQL Server. Un proceso de asignación de puntos de conexión de RPC escucha las solicitudes de RPC entrantes en el puerto 135 de manera predeterminada, y facilita información de los componentes registrados a las solicitudes remotas. Las solicitudes remotas pueden usar la información devuelta por el asignador de puntos de conexión para comunicarse con los componentes de RPC registrados, como los servicios de MSDTC.

Un proceso requiere privilegios de superusuario para enlazar con puertos conocidos (números de puerto inferiores a 1024) en Linux. Para evitar iniciar SQL Server con privilegios raíz para el proceso del asignador de puntos de conexión RPC, los administradores del sistema deben usar iptables para crear traducción de direcciones de red para enrutar el tráfico del puerto 135 al proceso de asignación de puntos de conexión RPC de la instancia de SQL Server.

MS DTC usa dos parámetros de configuración para la utilidad mssql-conf:

Parámetro de mssql-conf Descripción
network.rpcport Puerto TCP al que se enlaza el asignador de puntos de conexión de RPC.
distributedtransaction.servertcpport Puerto en el que escucha el servidor de MS DTC. Si no se establece, el servicio de MSDTC usa un puerto efímero aleatorio en los reinicios del servicio, y será necesario reconfigurar las excepciones de firewall para asegurarse de que el servicio de MSDTC pueda continuar con la comunicación.

Para más información sobre estas y otras opciones de configuración relativas a MSDTC, vea Configuración de SQL Server en Linux con la herramienta mssql-conf.

Estándares de transacciones admitidos

Se admiten las siguientes configuraciones de MSDTC:

Estándar de transacciones Orígenes de datos Controlador ODBC Controlador JDBC
Transacciones OLE-TX SQL Server en Linux No
Transacciones distribuidas XA SQL Server, otras ODBC y orígenes de datos de JDBC que admiten XA Sí (requiere 17.3 o versiones posteriores)
Transacciones distribuidas en el servidor vinculado SQL Server No

Para obtener más información, vea Descripción de las transacciones XA.

Pasos de configuración de MSDTC

Complete los tres pasos siguientes para configurar la comunicación y la funcionalidad de MSDTC para SQL Server.

  • Configure network.rpcport y distributedtransaction.servertcpport con mssql-conf.
  • Configure el firewall para permitir la comunicación en distributedtransaction.servertcpport y en el puerto 135.
  • Configure el enrutamiento del servidor Linux para que la comunicación RPC en el puerto 135 se redirija a la instancia de network.rpcportSQL Server.

En las siguientes secciones se proporciona información detallada sobre cada paso.

Configuración de los puertos de RPC y MSDTC

Configure network.rpcport y distributedtransaction.servertcpport con mssql-conf. Este paso es específico de SQL Server y común en todas las distribuciones admitidas.

  1. Use mssql-conf para establecer el valor network.rpcport. En el siguiente ejemplo se establece en 13500.

    sudo /opt/mssql/bin/mssql-conf set network.rpcport 13500
    
  2. Establezca el valor distributedtransaction.servertcpport. En el siguiente ejemplo se establece en 51999.

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

    sudo systemctl restart mssql-server
    

Configuración del firewall

Configure el firewall para permitir la comunicación en servertcpport y en el puerto 135. Este paso permite que el proceso de asignación de puntos de conexión RPC y el proceso MSDTC se comuniquen externamente con otros administradores y coordinadores de transacciones. El procedimiento real varía en función de la distribución y el firewall de Linux.

En el siguiente ejemplo se muestra cómo crear estas reglas en 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

Es importante configurar el firewall antes de configurar el enrutamiento de puertos en la sección siguiente. Si el firewall se actualiza, en algunos casos se podrían borrar las reglas de enrutamiento de puertos.

Configuración del enrutamiento de puertos

Configure la tabla de enrutamiento del servidor Linux para que la comunicación RPC en el puerto 135 se redirija a la instancia de network.rpcportSQL Server. El mecanismo de configuración para el reenvío de puertos puede diferir en distintas distribuciones. En las secciones siguientes se proporcionan instrucciones para Ubuntu, SUSE Enterprise Linux (SLES) y Red Hat Enterprise Linux (RHEL).

Ubuntu y SLES no utilizan el servicio firewalld, por lo que las reglas iptables son un mecanismo eficaz para gestionar el enrutamiento de puertos. Es posible que las reglas de iptables no persistan durante los reinicios, por lo que los siguientes comandos también proporcionan instrucciones para restaurar las reglas después de un reinicio.

  1. Cree reglas de enrutamiento para el puerto 135. En el siguiente ejemplo, el puerto 135 se dirige al puerto RPC (13500), que se definió en la sección anterior. Reemplace <ipaddress> por la dirección IP de su 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
    

    El --comment RpcEndPointMapper parámetro de los comandos anteriores le ayuda a administrar estas reglas en comandos posteriores.

  2. Vea las reglas de enrutamiento que creó con el siguiente comando:

    sudo iptables -S -t nat | grep "RpcEndPointMapper"
    
  3. Guarde las reglas de enrutamiento en un archivo en el equipo.

    sudo iptables-save > /etc/iptables.conf
    
  4. Para volver a cargar las reglas tras un reinicio, agregue el siguiente comando a /etc/rc.local (Ubuntu) o a /etc/init.d/after.local (SLES):

    iptables-restore < /etc/iptables.conf
    

    Nota

    Debe tener privilegios de superusuario (sudo) para editar los archivos rc.local o after.local.

Los iptables-save comandos y iptables-restore , junto con rc.local/after.local la configuración de inicio, proporcionan un mecanismo básico para guardar y restaurar entradas de iptables . En función de la distribución de Linux, es posible que haya opciones más avanzadas o automatizadas. Por ejemplo, una alternativa de Ubuntu es el paquete iptables-persistent para que las entradas sean persistentes.

En los pasos anteriores se da por hecho que la dirección IP es fija. Si cambia la dirección IP de la instancia de SQL Server (debido a la intervención manual o DHCP), debe quitar y volver a crear las reglas de enrutamiento si las creó con iptables. Si necesita volver a crear o eliminar reglas de enrutamiento existentes, use el siguiente comando para quitar las reglas antiguas RpcEndPointMapper :

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

Comprobar

En este punto, SQL Server debería poder participar en las transacciones distribuidas. Para comprobar que SQL Server está escuchando, ejecute el comando netstat . Si usa RHEL, es posible que tenga que instalar primero el paquete net-tools :

sudo netstat -tulpn | grep sqlservr

Debería ver una salida similar al ejemplo siguiente:

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

Pero después de un reinicio, SQL Server no inicia la escucha en servertcpport hasta la primera transacción distribuida. En este caso, no verá que SQL Server escucha en el puerto 51999 hasta la primera transacción distribuida.

Configuración de la autenticación en la comunicación RPC para MSDTC

MSDTC para SQL Server en Linux no usa de forma predeterminada la autenticación en la comunicación RPC. Sin embargo, cuando la máquina host está unida a un dominio de Active Directory, puede configurar MSDTC para usar la comunicación RPC autenticada mediante la siguiente configuración mssql-conf :

Configuración Descripción
distributedtransaction.allowonlysecurerpccalls Configure solo llamadas RPC seguras para transacciones distribuidas. El valor predeterminado es 0.
distributedtransaction.fallbacktounsecurerpcifnecessary Configure solo llamadas RPC de seguridad para transacciones distribuidas. El valor predeterminado es 0.
distributedtransaction.turnoffrpcsecurity Habilite o deshabilite la seguridad RPC de las transacciones distribuidas. El valor predeterminado es 0.

Soportabilidad y compatibilidad

Active Directory

Microsoft recomienda usar MSDTC con RPC habilitado si SQL Server está inscrito en una configuración de Active Directory. Si configura SQL Server para usar la autenticación de Active Directory, MSDTC usa la seguridad RPC de autenticación mutua de forma predeterminada.

Windows y Linux

Si un cliente de un sistema operativo Windows necesita darse de alta en una transacción distribuida con SQL Server en Linux, deberá tener la siguiente versión mínima del sistema operativo Windows:

Sistema operativo Versión mínima Compilación del sistema operativo
Windows Server 1903 18362.30.190401-1528
Windows 10 1903 18362.267