適用於:Linux 上的 SQL Server
此文章說明如何在 Linux 上設定 Microsoft 分散式交易協調器 (MSDTC)。
從累積更新 16 及更新版本開始,SQL Server 2017 (14.x) 就支援 Linux 上的 MSDTC。
概觀
你可以在 Linux 上啟用分散式交易,方法是在 SQL Server 中引入 MSDTC 及遠端程序呼叫(RPC)端點映射器功能。 根據預設,RPC 端點對應程序會在連接埠 135 上接聽傳入的 RPC 要求,並向遠端要求提供已註冊的元件資訊。 遠端要求可以使用端點對應程式傳回的資訊來與已註冊的 RPC 元件 (例如 MSDTC 服務) 進行通訊。
程序必須要有超級使用者權限,才能繫結至 Linux 上的已知連接埠 (小於 1024 的連接埠)。 為避免以 RPC 端點映射程序的根權限啟動 SQL Server,系統管理員必須使用 iptables 建立網路位址轉換,將 135 埠的流量路由至 SQL Server 實例的 RPC 端點映射程序。
MSDTC 針對 mssql-conf 公用程式使用兩個設定參數:
| mssql-conf 設定 | 描述 |
|---|---|
network.rpcport |
RPC 端點對應程式所繫結的 TCP 連接埠。 |
distributedtransaction.servertcpport |
MSDTC 伺服器所接聽的連接埠。 如果未設定,MSDTC 服務會在服務重新啟動時使用隨機的暫時連接埠,且防火牆例外必須重新設定,以確保 MSDTC 服務可以繼續進行通訊。 |
如需有關這些設定及其他相關 MSDTC 設定的詳細資訊,請參閱使用 mssql-conf 工具設定 Linux 上的 SQL Server。
支援的交易標準
以下是支援的 MSDTC 設定:
| 交易標準 | 資料來源 | ODBC 驅動程式 | JDBC 驅動程式 |
|---|---|---|---|
| OLE-TX 交易 | Linux 上的 SQL Server | 是 | 否 |
| XA 分散式交易 | 支援 XA 的 SQL Server、其他 ODBC 和 JDBC 資料來源 | 可以(需要 17.3 或更新版本) | 是 |
| 連結伺服器上的分散式交易 | SQL Server | 是 | 否 |
如需詳細資訊,請參閱了解 XA 交易。
MSDTC 設定步驟
完成以下三個步驟,即可為 SQL Server 配置 MSDTC 通訊與功能。
- 設定
network.rpcport和distributedtransaction.servertcpport,利用 mssql-conf。 - 設定防火牆以允許在
distributedtransaction.servertcpport和埠 135 上進行通訊。 - 設定 Linux 伺服器路由,使 135 埠的 RPC 通訊被導向至 SQL Server 實例。
network.rpcport
下列各節提供每個步驟的詳細指示。
設定 RPC 和 MSDTC 連接埠
設定 network.rpcport 和 distributedtransaction.servertcpport,利用 mssql-conf。 此步驟是 SQL Server 專用的,且在所有支援的發行版中都通用。
使用 mssql-conf 設定
network.rpcport值。 下列範例會將其設定為 13500。sudo /opt/mssql/bin/mssql-conf set network.rpcport 13500設定
distributedtransaction.servertcpport值。 下列範例會將其設定為 51999。sudo /opt/mssql/bin/mssql-conf set distributedtransaction.servertcpport 51999重新啟動 SQL Server。
sudo systemctl restart mssql-server
設定防火牆
設定防火牆以允許在 servertcpport 和埠 135 上進行通訊。 此步驟使 RPC 端點映射程序與 MSDTC 程序能與其他交易管理器及協調者外部溝通。 實際的流程會依你的 Linux 發行版和防火牆而異。
下列範例說明如何在 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
在下一節中,請務必先設定防火牆,再設定連接埠路由。 在某些情況下,重新整理防火牆可以清除連接埠路由規則。
設定連接埠路由
設定 Linux 伺服器路由表,使 135 埠的 RPC 通訊被重新導向至 SQL Server 實例的 network.rpcport。 不同發行版的埠轉發設定機制可能有所不同。 以下章節提供 Ubuntu、SUSE Enterprise Linux(SLES)及 Red Hat Enterprise Linux(RHEL)的指引。
Ubuntu 和 SLES 不使用 firewalld 服務,因此 iptables 規則是實現埠路由的高效機制。 iptables 的規則在重新啟動時可能不會持續存在,因此以下指令也提供了重新啟動後還原規則的指示。
為連接埠 135 建立路由規則。 在下列範例中,連接埠 135 會導向到上一節中定義的 RPC 連接埠 13500。 請以您伺服器的 IP 位址取代
<ipaddress>。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--comment RpcEndPointMapper前面指令中的參數幫助你在後續指令中管理這些規則。使用下列命令來檢視您建立的路由規則:
sudo iptables -S -t nat | grep "RpcEndPointMapper"將路由規則儲存到您機器上的檔案中。
sudo iptables-save > /etc/iptables.conf若要在重新開機後重新載入規則,請將下列命令新增至
/etc/rc.local(適用於 Ubuntu) 或/etc/init.d/after.local(適用於 SLES):iptables-restore < /etc/iptables.conf注意
您必須具備超級使用者 (sudo) 權限,才能編輯
rc.local或after.local檔案。
iptables-save和iptables-restore指令,以及rc.local/after.local啟動配置,提供了儲存和還原 iptables 條目的基本機制。 視您的 Linux 發行版本而定,可能會有更進階或自動化的選項可供使用。 例如,用於 Ubuntu 的替代方案是 iptables-persistent 套件,此套件可讓條目保持永續。
先前的步驟假設使用固定 IP 位址。 如果你的 SQL Server 實例的 IP 位址因人工介入或 DHCP 而改變,你必須移除並重新建立用 iptables 建立的路由規則。 如果你需要重新建立或刪除現有的路由規則,請使用以下指令移除舊 RpcEndPointMapper 規則:
sudo iptables -S -t nat | grep "RpcEndPointMapper" | sed 's/^-A //' | while read rule; do iptables -t nat -D $rule; done
驗證
此時,SQL Server 應該已能夠參與分散式交易。 要確認 SQL Server 正在監聽,請執行 netstat 指令。 如果你用的是 RHEL,可能得先安裝 net-tools 套件:
sudo netstat -tulpn | grep sqlservr
您應該會看到類似下列範例的結果:
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
不過,在重新啟動之後,必須等到第一次分散式交易之後,SQL Server 才會開始在 servertcpport 上進行接聽。 在此情況下,於此範例中,您必須等到第一次分散式交易之後,才會看到 SQL Server 在連接埠 51999 上進行接聽。
針對 MSDTC 設定 RPC 通訊上的驗證
Linux 上 SQL Server 的 MSDTC 預設不會在 RPC 通訊上使用驗證。 然而,當主機加入 Active Directory 網域時,你可以透過以下 mssql-conf 設定設定 MSDTC 使用認證 RPC 通訊:
| 設定 | 描述 |
|---|---|
distributedtransaction.allowonlysecurerpccalls |
針對分散式交易設定僅限安全的 RPC 呼叫。 預設值為 0。 |
distributedtransaction.fallbacktounsecurerpcifnecessary |
設定僅限安全性的 RPC 呼叫,以用於分散式交易。 預設值為 0。 |
distributedtransaction.turnoffrpcsecurity |
針對分散式交易啟用或停用 RPC 安全性。 預設值為 0。 |
支援性與相容性
Active Directory
Microsoft 建議在 SQL Server 加入 Active Directory 設定時,使用已啟用 RPC 的 MSDTC。 如果你設定 SQL Server 使用 Active Directory 認證,MSDTC 預設會使用相互認證 RPC 安全性。
Windows 與 Linux
如果 Windows 作業系統上的用戶端需要使用 Linux 上的 SQL Server 登錄到分散式交易,它必須具有下列最低版本的 Windows 作業系統:
| 作業系統 | 最小版本 | 作業系統版本 |
|---|---|---|
| Windows Server | 一九零三年 | 18362.30.190401-1528 |
| Windows 10 | 一九零三年 | 18362.267 |