Cómo configurar el Coordinador de transacciones distribuidas de Microsoft (MSDTC) en Linux
Se aplica a: SQL Server - Linux
En este artículo se describe cómo configurar el Coordinador de transacciones distribuidas de Microsoft (MSDTC) en Linux.
El Coordinador de transacciones distribuidas en Linux se admite en SQL Server 2017 (14.x) a partir de la actualización acumulativa 16 y versiones posteriores.
Información general
Las transacciones distribuidas se habilitan en SQL Server en Linux mediante la inclusión de MSDTC y la funcionalidad del asignador de puntos de conexión de llamada a procedimiento remoto (RPC) en SQL Server. Un proceso de asignador de puntos de conexión de RPC escucha las solicitudes de RPC entrantes en el puerto 135 de forma 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 que SQL Server se inicie con privilegios raíz en el proceso del asignador de puntos de conexión de RPC, los administradores del sistema deben usar iptables para crear la traducción de direcciones de red con objeto de enrutar el tráfico del puerto 135 al proceso de asignador de puntos de conexión de RPC de SQL Server.
El Coordinador de transacciones distribuidas 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 MSDTC. Si no se establece, el servicio de MSDTC usa un puerto efímero aleatorio en los reinicios del servicio, y es 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 | Sí | No |
Transacciones distribuidas XA | SQL Server, otras ODBC y orígenes de datos de JDBC que admiten XA | Sí (se requiere la versión 17.3 o posterior) | Yes |
Transacciones distribuidas en el servidor vinculado | SQL Server | Sí | No |
Para obtener más información, vea Descripción de las transacciones XA.
Pasos de configuración de MSDTC
Hay tres pasos para configurar la comunicación y la funcionalidad de MSDTC. Si no se realizan los pasos de configuración necesarios, SQL Server no habilita la funcionalidad de MSDTC.
- Configure
network.rpcport
ydistributedtransaction.servertcpport
mediante mssql-conf. - Configure el servidor de seguridad 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 al puerto
network.rpcport
de SQL Server.
En las siguientes secciones se proporciona información detallada sobre cada paso.
Configuración de los puertos de RPC y MSDTC
Primero, configure network.rpcport
y distributedtransaction.servertcpport
mediante mssql-conf. Este paso es específico de SQL Server y común a todas las distribuciones admitidas.
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
Establezca el valor
distributedtransaction.servertcpport
. En el siguiente ejemplo se establece en 51999.sudo /opt/mssql/bin/mssql-conf set distributedtransaction.servertcpport 51999
Reinicie SQL Server.
sudo systemctl restart mssql-server
Configuración del firewall
El segundo paso consiste en configurar el firewall para permitir la comunicación en servertcpport
y en el puerto 135. Esto hace posible que el proceso de asignación de puntos de conexión de RPC y el proceso de MSDTC se comuniquen externamente con otros coordinadores y administradores de transacciones. Los pasos reales para llevar esto a cabo varian en función del firewall y de la distribución 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
En el siguiente ejemplo se muestra cómo podría realizarse este procedimiento en Red Hat Enterprise Linux (RHEL) :
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 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 enrutamiento del servidor Linux para que la comunicación RPC en el puerto 135 se redirija al puerto network.rpcport
de SQL Server. El mecanismo de configuración para el reenvío de puertos puede diferir según la distribución. En las siguientes secciones se proporcionan instrucciones relativas a Ubuntu, SUS Enterprise Linux (SLES) y Red Hat Enterprise Linux (RHEL).
Enrutamiento de puertos en Ubuntu y SLES
Ubuntu y SLES no usan el servicio firewalld, de modo que las reglas iptable son un mecanismo eficaz para lograr el enrutamiento de puertos. Es posible que las reglas iptable no se conserven durante los reinicios; es por eso que en los siguientes comandos también se proporcionan instrucciones para restaurar las reglas después de un reinicio.
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 parámetro
--comment RpcEndPointMapper
de los comandos anteriores ayuda a administrar estas reglas en comandos posteriores.Vea las reglas de enrutamiento que creó con el siguiente comando:
sudo iptables -S -t nat | grep "RpcEndPointMapper"
Guarde las reglas de enrutamiento en un archivo en el equipo.
sudo iptables-save > /etc/iptables.conf
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
oafter.local
.
Los comandos iptables-save e iptables-restore, junto con la configuración de inicio de rc.local
/after.local
, 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 la dirección IP de la instancia de SQL Server cambia (por una intervención manual o mediante DHCP), deberá quitar y volver a crear las reglas de enrutamiento si se crearon con iptables. Si necesita volver a crear o eliminar las reglas de enrutamiento existentes, puede usar el siguiente comando para quitar las reglas RpcEndPointMapper
anteriores:
sudo iptables -S -t nat | grep "RpcEndPointMapper" | sed 's/^-A //' | while read rule; do iptables -t nat -D $rule; done
Enrutamiento de puertos en RHEL
En las distribuciones que usan el servicio firewalld (como Red Hat Enterprise Linux), se puede usar el mismo servicio para abrir el puerto en el servidor y para el reenvío de puerto interno. Por ejemplo, en Red Hat Enterprise Linux, debe usar el servicio firewalld (a través de la utilidad de configuración firewall-cmd con -add-forward-port
u opciones similares) para crear y administrar reglas de reenvío de puertos persistentes en lugar de usar iptables.
sudo firewall-cmd --permanent --add-forward-port=port=135:proto=tcp:toport=13500
sudo firewall-cmd --reload
Comprobación
En este punto, SQL Server debería poder participar en las transacciones distribuidas. Para confirmar que SQL Server está escuchando, ejecute el comando netstat (si usa RHEL, es posible que antes tenga que instalar 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
Sin embargo, después de un reinicio, SQL Server no empieza a escuchar en servertcpport
hasta la primera transacción distribuida. En este caso, no verá SQL Server escuchando en el puerto 51999 en este ejemplo 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 el equipo host se une a un dominio de Active Directory, MSDTC se puede configurar para que use la comunicación RPC autenticada mediante las siguientes opciones de 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. |
Instrucciones adicionales
Active Directory
Microsoft recomienda el uso de MSDTC con RPC habilitado si SQL Server está inscrito en una configuración de Active Directory. Si SQL Server está configurado para usar la autenticación de Active Directory, MSDTC utiliza 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 |