※ 本記事は弊社の Technet のサイトから移行した記事です。
いつも弊社製品をご利用いただきまして誠にありがとうございます。日本マイクロソフトの Windows サポートチームです。
今回は、Web アプリケーションでもよく利用される MS DTC (Distributed Transaction Coordinator) を介した分散トランザクションを実行する際、MSDTC を動作させるために必要な構成や設定について案内します。
「MSDTC の設定をしてみたけど、うまく動かない」「アプリケーションを動かしたら、分散トランザクションが失敗したことを示すエラーが記録された」といったことがありましたら、下記の設定が正しくできているか、まずは確認してみてください。
MSDTC を介した分散トランザクションが正常に動作するには、以下の 5 つが必要になります。
- MSDTC サービスの起動を確認する
- MSDTC のセキュリティ設定をする
- MSDTC が利用するポートを空ける
- NetBIOS 名での名前解決可否を確認する
- CID の一意性を確認する
1. MSDTC サービスの起動を確認する
MSDTC は Windows のサービス プログラムの 1 つとして実装されており、MSDTC を介して分散トランザクションを実行するには、MSDTC サービスが起動している必要があります。
MSDTC を利用する全てのサーバーノードで、[管理ツール] - [サービス] 等から [Distributed Transaction Coordinator] サービスが実行中となっており、ログオン アカウントとして NETWORK SERVICE アカウントで動作している事をご確認ください。
また、もし、クラスター上でクラスター リソースとして分散トランザクション コーディネーター (MSDTC) をリソースとして作成されている場合、既定ではそちらが優先して利用されます。その場合、同様に [管理ツール] - [サービス] 等を確認しますと、MSDTC クラスター リソースを持っているアクティブノード上に [Distributed Transaction Coordinator (xxxxxx)] (xxxxx は一意の GUID) という名前のサービスがありますので、こちらが実行中となっているか、ご確認ください。
2. MSDTC のセキュリティ設定をする
MSDTC がネットワークアクセスを許可している事をご確認ください。こちらも MSDTC を利用する全てのサーバーでご確認ください。
[管理ツール] - [コンポーネントサービス」を起動します。
左ペインのツリーにて、 [コンポーネントサービス] - [コンピュータ] - [マイコンピュータ] - [Distributed Transaction Coordinator] 内、[ローカル DTC] 内のコンピューターアイコンを右クリックし、[プロパティ] を開きます。なお、クラスター上に MSDTC をリソースを作成されている場合は、[クラスタ化された DTC] 内のアイコンを確認します。
[セキュリティ] タブを以下のように構成します。この設定を変更すると MSDTC サービスの再起動が自動的に実施されます。また、設定の反映のためには MSDTC を使用しているサービス等の再起動を要する場合があります。
- ネットワーク DTC アクセス
- トランザクションマネージャー通信
- 受信を許可する
- 送信を許可する
- 認証を必要としない (*)
- XA トランザクションを有効にする (※Oracle、DB2 等と分散トランザクションを実施する場合に有効)
*過去、MSDTC を利用するお客様の環境では、認証機能は Domain など状態に影響を受けることから、外因により障害へ発展する可能性が高く、この様なトラブルの発生を避けるため、”認証を必要としない” を選択されていることが一般的です。
なお、”認証を必要としない” を設定しても、MSDTC を利用する側 (例えば IIS や SQL Server など) で認証が行われていることが想定されます。
- [DTC ログオン アカウント] に NT Authority\NetworkService が指定されていることを確認します。
3. MSDTC が利用するポートを空ける
以下のポート範囲について、経路上でブロックされていないか、ご確認ください。
3.1.
MSDTC は通信にリモート プロシージャ コール (以下、RPC) を利用するため、135 番ポート、および RPC により動的に利用されるランダムなポートを使用します。
*OS により、RPC が利用するランダムポートに相違があります。
Windows Server 2008 、及びそれ以降の OS では、既定では 49152 - 65535 までの範囲となります。
一方、Windows XP や Windows Server 2003 では、1025 - 5000 までの範囲が利用されます。
Windows のサービス概要およびネットワーク ポート要件
http://support.microsoft.com/kb/832017/ja
Windows 上の F/W に対しては、分散トランザクション コーディネイターに対するルールを許可していただくことになります。
マシン上やネットワーク上に 3rd party 製の F/W 等がある場合は、上述のポートが空いているかどうか、ご確認ください。
なお、コンポーネントサービスの設定により、利用するポートの範囲を指定することも可能です。以下手順で設定を確認してください。
- コンポーネントサービスの “マイコンピューター” を選択し、右クリックにてプロパティを表示します。
- 表示されたマイコンピューターのプロパティにおいて、”既定のプロトコル” タブを選択し、”接続指向 TCP/IP” を選択の “プロパティ” をクリックします。
- 表示された “COM インターネットサービスのプロパティ” のポート範囲に何らかの範囲が指定されていないか、確認します。指定されている場合、設定されているポートを利用して (MSDTC を含む) RPC 通信が行われます。
3.2.
後述する NetBIOS の名前解決のために、UDP 137 ~ 139 番、さらに、もし前項で認証を使用していた場合は Kerberos の UDP 88番および TCP 88番を使用します。
3.3.
MSDTC通信を許可するために、Windows のファイアウォールを設定します。
- [コントロールパネル] - [システムとセキュリティ] - [Windows ファイアウォール] を起動します。
- 左ペインの、[詳細設定] をクリックします。
- 左ペインの、[受信の規則] をクリックし、 [分散トランザクション コーディネーター] (RPC / PRC-EPMAP / TCP 受信のそれぞれ) を選択し、右ペインの [規則の有効化] をクリックします。
- 左ペインの、[送信の規則] をクリックし、 [分散トランザクション コーディネーター] (TCP 送信) を選択し、右ペインの [規則の有効化] をクリックします。
これにより MSDTC が RPC を使用して通信する際のポートが許可されます。
4. NetBIOS 名での名前解決可否を確認する
MSDTC は、サーバー間でお互いに名前解決できる必要があります。
名前解決の動作検証は、以下コマンドにてエラーが起きないことを確認いただくことで可能です。
ping <相手サーバー名>
それぞれのサーバーから、接続先のサーバーについて、名前解決が可能かをご確認ください。
クラスター環境では、さらに MSDTC に関連付けたクライアントアクセスポイント名も解決できる様に構成をお願いします。
a. 相手サーバー名
b. クラスターのネットワーク名
c. MSDTC クラスター リソースのネットワーク名 (クライアント アクセスポイント名。下記図の場合、msdtc99)
なお、名前解決に失敗する場合、hosts ファイルに対しサーバー名と IP アドレスを記述することで、明確に利用するアドレスを指定することが可能です。
hosts ファイルは、c:\Windows\System32\Drivers\etc 配下に保存されており、管理者権限で昇格したメモ帳などで編集することが可能です。
その際、以下の様なフォーマット (IPアドレス [スペース] サーバー名、もしくは MSDTC に依存関係を結んだサーバー名) で指定いたします。
例:
192.168.0.101 testServer1
192.168.0.102 testServer2
複数設定されたアドレスの内、対象のサーバーに対して接続する際に、利用するべき IP アドレスを指定いただければ幸いです。
なお、クラスター環境では、両方の系で hosts ファイルを編集し、指定したアドレスに差が無いように設定くださいますようお願い申し上げます。
*ここで差が出ますと、系が切り替わった瞬間からトランザクションが失敗するという問題が起きる可能性があります。
5. CID の一意性を確認する
MSDTC は、相互に通信を行う際に自身を特定するために CID と呼ばれる一意の ID をインストール時に採番しそれを通信に利用します。
この ID はレジストリに保持されることとなりますが、仮想マシンの利用などで、ディスクイメージをコピーし、それをそのまま利用した場合、レジストリの内容もコピーされて ID が衝突してしまうこと考えられます。
この場合も、MSDTC は通信に失敗してしまいます。
それぞれのサーバーにおいて、HKEY_CLASSES_ROOT\CID のレジストリ値に同一エントリーが含まれている場合、本状況に合致していると判断可能です。
この CID を改めて採番したい場合、MSDTC の再インストールが有効です。
以下に手順を記載します。
a. 管理者権限でコマンド プロンプトを起動し、以下のコマンドを実行して MSDTC サービスを停止します
>net stop msdtc
b. 続けて、以下のコマンドを実行します
>msdtc -uninstall
c. レジストリ エディターを開いていただき、以下のレジストリが存在すれば、手動で削除します
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\MSDTC
HKEY_CLASSES_ROOT\CID
HKEY_CLASSES_ROOT\CID.Local
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC
d. 以下のコマンドを実行します
>msdtc -install
>msdtc -resetlog
e. 以下の手順にてパフォーマンスカウンターの再登録を実行します
>cd %windir%\inf\msdtc\0000
>copy ..\msdtcprf.h msdtcprf.h
>lodctr msdtcprf.ini
f. OS を再起動します
なお、クラスター上に MSDTC が構成されている場合、一度 MSDTC リソースを削除してから、上記手順を実施し、その後、改めて MSDTC のリソースを追加いただければ幸いです。
また、本手順により MSDTC の設定がクリアされることとなります。
本手順の 2. も参考に、必ずコンポーネントサービスから MSDTC の再設定 (ローカル 及び クラスター上) を行ってください。
以上となります。