次の方法で共有


Linux で Microsoft 分散トランザクション コーディネーター (MSDTC) を構成する方法

適用対象:SQL Server - Linux

この記事では、Linux で Microsoft 分散トランザクション コーディネーター (MSDTC) を構成する方法を説明します。

Linux 上の MSDTC は、SQL Server 2017 (14.x) の累積的な更新プログラム 16 以降のバージョンでサポートされています。

概要

SQL Server on Linux で分散トランザクションを有効にするには、SQL Server 内で MSDTC とリモート プロシージャ コール (RPC) エンドポイント マッパー機能を導入します。 既定では、RPC エンドポイント マッピング プロセスは、着信 RPC 要求をポート 135 でリッスンし、登録されたコンポーネント情報をリモート要求に提供します。 リモート要求は、登録済み RPC コンポーネント (MSDTC サービスなど) と通信するために、エンドポイント マッパーによって返される情報を使用できます。

プロセスが Linux 上のよく知られているポート (ポート番号 1024 未満) にバインドするには、スーパーユーザー特権が必要です。 RPC エンドポイント マッパー プロセスのルート特権で SQL Server を起動しないようにするには、システム管理者は iptables を使用してネットワーク アドレス変換を作成し、ポート 135 のトラフィックを SQL Server インスタンスの RPC エンドポイント マッピング プロセスにルーティングする必要があります。

MSDTC は、mssql-conf ユーティリティ用に次の 2 つの構成パラメーターを使用します。

mssql-conf の設定 説明
network.rpcport RPC エンドポイント マッパー プロセスのバインド先の TCP ポート。
distributedtransaction.servertcpport MSDTC サーバーがリッスンするポート。 設定しない場合、MSDTC サービスはサービス再起動時にランダムな一時ポートを使用するため、MSDTC サービスが通信を継続できるようにファイアウォールの例外を再構成する必要があります。

これらの設定やその他の関連する MSDTC 設定について詳しくは、「mssql-conf ツールを使用して SQL Server on Linux を構成する」をご覧ください。

サポートされているトランザクション標準

サポートされている MSDTC 構成は次のとおりです。

トランザクション標準 データ ソース ODBC ドライバ JDBC ドライバー
OLE-TX トランザクション SQL Server on Linux あり いいえ
XA 分散トランザクション XA をサポートする SQL Server、その他の ODBC、JDBC データ ソース はい (17.3 以降のバージョンが必要) あり
リンク サーバー上の分散トランザクション SQL Server あり いいえ

詳細については、「XA トランザクションについて」を参照してください。

MSDTCの 構成手順

SQL Server の MSDTC 通信と機能を構成するには、次の 3 つの手順を実行します。

  • network.rpcport を使用してdistributedtransaction.servertcpportを構成します。
  • distributedtransaction.servertcpport とポート 135 での通信を許可するようにファイアウォールを構成します。
  • ポート 135 での RPC 通信が SQL Server インスタンスの network.rpcportにリダイレクトされるように、Linux サーバー ルーティングを構成します。

以下のセクションで各手順について詳しく説明します。

RPC および MSDTC ポートを構成する

network.rpcport を使用してdistributedtransaction.servertcpportを構成します。 この手順は SQL Server に固有であり、サポートされているすべてのディストリビューションで共通です。

  1. mssql-conf を使用してnetwork.rpcport の値を設定します。 次の例では 13500 に設定されます。

    sudo /opt/mssql/bin/mssql-conf set network.rpcport 13500
    
  2. distributedtransaction.servertcpport値を設定します。 次の例では 51999 に設定されます。

    sudo /opt/mssql/bin/mssql-conf set distributedtransaction.servertcpport 51999
    
  3. 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

次のセクションでポートルーティングを構成する前に、ファイアウォールを構成することが重要です。 場合によっては、ファイアウォールを更新するとポートのルーティング規則がクリアされます。

ポートのルーティングを構成する

ポート 135 での RPC 通信が SQL Server インスタンスの network.rpcportにリダイレクトされるように、Linux サーバー ルーティング テーブルを構成します。 ポート フォワーディングの構成メカニズムは、ディストリビューションによって異なる場合があります。 次のセクションでは、Ubuntu、SUSE Enterprise Linux (SLES)、Red Hat Enterprise Linux (RHEL) に関するガイダンスを提供します。

Ubuntu と SLES は ファイアウォールサービス を使用しないため、 iptables ルールはポート ルーティングを実現するための効率的なメカニズムです。 iptables ルールは再起動中に保持されない可能性があるため、次のコマンドでは、再起動後にルールを復元する手順も示します。

  1. ポート 135 のルーティング規則を作成します。 次の例では、ポート 135 は、前のセクションで定義した RPC ポート 13500 に転送されます。 <ipaddress> をご使用のサーバーの IP アドレスで置き換えます。

    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 パラメーターは、後のコマンドでこれらのルールを管理するのに役立ちます。

  2. 次のコマンドを使用して、作成したルーティング規則を表示します。

    sudo iptables -S -t nat | grep "RpcEndPointMapper"
    
  3. コンピューター上のファイルにルーティング規則を保存します。

    sudo iptables-save > /etc/iptables.conf
    
  4. 再起動後に規則を再読み込みするには、次のコマンドを /etc/rc.local (Ubuntu の場合) または /etc/init.d/after.local (SLES の場合) に追加します。

    iptables-restore < /etc/iptables.conf
    

    rc.local ファイルまたは after.local ファイルを編集するには、スーパー ユーザー (sudo) 特権が必要です。

iptables-saveコマンドとiptables-restore コマンドは、rc.local/after.localスタートアップ構成と共に、iptables エントリを保存および復元するための基本的なメカニズムを提供します。 Linux ディストリビューションによっては、高度な方法つまり自動化された方法を使用できる場合もあります。 たとえば、Ubuntu での代替手段は、エントリを永続化するための iptables-persistent パッケージです。

前の手順では、固定 IP アドレスが想定されています。 SQL Server インスタンスの IP アドレスが変更された場合 (手動による介入または DHCP が原因)、 iptable を使用して作成した場合は、ルーティング規則を削除して再作成する必要があります。 既存のルーティング規則を再作成または削除する必要がある場合は、次のコマンドを使用して古い 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 でのリッスンを開始しません。 この場合、最初の分散トランザクションまで、この例のポート 51999 でリッスンしている SQL Server は表示されません。

MSDTC のために RPC 通信の認証を構成する

SQL Server on Linux の MSDTC では、既定で RPC 通信で認証が使用されません。 ただし、ホスト マシンが Active Directory ドメインに参加している場合は、次の mssql-conf 設定を使用して、認証済みの RPC 通信を使用するように MSDTC を構成できます。

設定 説明
distributedtransaction.allowonlysecurerpccalls 分散トランザクションに対して、セキュリティで保護された RPC のみを構成します。 既定値は 0 です。
distributedtransaction.fallbacktounsecurerpcifnecessary 分散トランザクションに対して、セキュリティで保護された RPC のみを構成します。 既定値は 0 です。
distributedtransaction.turnoffrpcsecurity 分散トランザクションの RPC セキュリティを有効または無効にします。 既定値は 0 です。

サポート可能性と互換性

Active Directory

SQL Server が Active Directory 構成に登録されている場合は、RPC を有効にして MSDTC を使用することをお勧めします。 Active Directory 認証を使用するように SQL Server を構成した場合、MSDTC は既定で相互認証 RPC セキュリティを使用します。

Windows と Linux

Windows オペレーティング システム上のクライアントが SQL Server on Linux での分散トランザクションに参加する必要がある場合は、次のバージョン以上の Windows オペレーティング システムが必要です。

オペレーティング システム 最小バージョン OS ビルド
Windows Server 1903 18362.30.190401-1528
Windows 10 1903 18362.267