クラスター環境にSQL Server をインストールする際、MSDTC をクラスター化する必要があるか?

フェールオーバークラスター環境にSQL Server をインストールする際に以下のお問い合わせをいただくことがあります。

フェールオーバークラスター環境に SQL Server をインストールする際、MSDTC はクラスター化する必要があるか?

Books Online には以下のように記載されています。

フェールオーバー クラスタリングをインストールする前に
https://technet.microsoft.com/ja-jp/library/ms189910(v=SQL.105).aspx

-----------抜粋はじめ

Microsoft 分散トランザクション コーディネーターのインストール

フェールオーバー クラスターに SQL Server をインストールする前に、Microsoft 分散トランザクション コーディネーター (MSDTC) クラスター リソースを作成する必要があるかどうかを判断します。データベース エンジンだけをインストールする場合、MSDTC クラスター リソースは必要ありません。データベース エンジンと SSIS やワークステーション コンポーネントをインストールする場合、または分散トランザクションを使用する場合は、MSDTC のインストールが必要です。Analysis Services のみのインスタンスには MSDTC は必要ありません。

Microsoft 分散トランザクション コーディネーターの構成

オペレーティング システムをインストールしてクラスターを構成した後で、クラスター アドミニストレーターを使用して、クラスター内で機能するように MSDTC を構成する必要があります。MSDTC のクラスター化に失敗しても SQL Server セットアップは中断しませんが、MSDTC が適切に構成されていない場合は SQL Server のアプリケーション機能に影響が生じる可能性があります。

-----------抜粋終わり

今回は上記に補足します。

MSDTC とは?

MSDTC は Microsoft Distribution Transaction Coordinator の略で、Windows に標準でインストールされている分散トランザクションを管理する機能となります。
Windows Server 2012 では、「コントロールパネル」-「システムとセキュリティ」-「管理ツール」-「コンポーネントサービス」-「コンピュータ」- 「マイコンピュータ-」-「Distribution Transaction Coordinator」 にて確認可能です。

 

image

SQL Server では、複数のリソース(データベース、アプリケーション等)にまたがったトランザクション(分散トランザクション)の実行が可能です。 この場合、複数のサーバーで意図した結果を得られなかった場合、各リソースの結果に不整合が起きないように、各リソースで得られた結果を元に、Commit (確定) するのか、Rollback(元に戻す)するのか、コーディネートを行う役目が必要です。 MSDTC はその役目を担っています。
   

MSDTC のクラスター化の条件        

改めて、クラスター化の条件について確認します。
 

Windows Version SQL Server Version MSDTC サービスの有効化 MSDTC のクラスター化
Windows Server 2003 / Windows Server 2003 R2 SQL Server 2005 以上 必須 必須
Windows Server 2008 / Windows Server 2008 R2 SQL Server 2005 以上 SSIS、ワークステーションコンポーネントをインストールする場合は必須。 必須ではないが、 分散トランザクションを使用する場合は推奨。
Windows Server 2012 / Windows Server 2012 R2 SQL Server 2008 以上 SSIS、ワークステーションコンポーネントをインストールする場合は必須。 必須ではないが、 分散トランザクションを使用する場合は推奨。

 
つまり、MSDTC のクラスター化の条件は、Windows のバージョンに依存します。

SQL Server をインストールするには MS DTC へアクセスができることが必要です。 Windows Server 2003 、および、Windows 2003 R2 上のMSCS クラスター環境の場合、MSDTC へのアクセスはクラスター化されたMSDTC ではないとアクセスできないため、クラスター化が必須です。

フェールオーバー クラスタが設定された SQL Server で MSDTC を再構築または移動する方法 https://support.microsoft.com/kb/294209/ja

Windows Server 2003 /2003 R2 では 分散トランザクションを使用されない環境においてもクラスター化が必要でした。 そのため、後続の Windows Server 2008 の MSFC クラスター環境では、MS DTC をクラスターリソースとして作成してアクセスすることも、 ローカルの MS DTC へアクセスすることも、どちらも可能であるように仕様変更されました。その結果、必ずしも MS DTC をクラスターリソースとして登録する必要はなくなりました。 また、Windows Server 2003 の MSCS クラスターでは 1 つのクラスターに 1 つの MSDTC リソースしか作成できませんでしたが、Windows Server 2008 の MSFC クラスターから MSDTC リソースの作成ルールが拡張されており、クラスター グループ毎に MSDTC リソースを作成することができるようになっています。 その結果、MSDTC を利用するクラスター リソースが複数のクラスター グループに存在する場合、必要とされるクラスター グループ毎に MSDTC リソースを作成することが MSFC クラスター環境にて可用性を高めて動作できることが可能となり、サポートではこちらの構成を推奨しております。

MSDTC のクラスター化した場合としない場合での動作の違い

 

MSDTC のクラスター化が必須でない場合は、「分散トランザクションを使用する場合」となります。 上記で分散トランザクションについて少し説明いたしましたが、ここでは、MSDTC のクラスター化を行う場合と行わない場合で何が異なるのか見ていきます。

クラスター化されている MS DTC と、クラスター化されていない(ローカルの) MS DTC では、分散トランザクション実行中に SQL Server がフェールオーバーした場合では、以下の差が発生します。  

<クラスター化された MS DTC の場合>
トランザクションの Rollback

<クラスター化されていない MS DTC の場合>
トランザクションの Abort

トランザクションが完了しないという点では同じですが、トランザクションの Abort に失敗した場合、ローカル MS DTC には完了しないトランザクションが存在する(インダウト状態)になります。完了していないトランザクションは、SQL Server がフェールバックしたとしてもそのトランザクションに紐付けられていたセッションが存在しない状態となるため、トランザクションを完了(Commit、もしくは、Rollback)することができません。
この場合、手動でコンポーネントサービスのローカル DTC 上に表示されるインダウト状態のトランザクションを「破棄」等の操作を行う必要があります。
どのトランザクションがAbort に失敗するかを予測することはできないため、ローカル MS DTCを使用して上記現象が発生した場合は、ご自身にて対応いただく必要があります。
MS DTC をクラスターリソース化することにより、トランザクションが適切に処理され、インダウト状態のトランザクションを抑制することが予測されますため、分散トランザクションを実行する場合、もしくは分散トランザクションを実行する予定がある場合は、MS DTC をクラスターリソースとして登録することを推奨しております。

分散トランザクションを使用するためのMSDTC の設定

Windows Server 2008 以降では、MSDTC をクラスターリソースとして登録しなくても、分散トランザクションは実行可能です。 ただし、クラスター化しても、しない場合においても、MSDTC のセキュリティオプションを有効にする必要があります。 設定手順は以下の通りです。

※Windows Server 2012 の場合

1.「管理ツール」-「コンポーネントサービス」-「コンピュータ」- 「マイコンピュータ-」ー「Distribution Transaction Coordinator」 ー「ローカルDTC」もしくは「クラスター化されたMSDTC」を右クリックし、「プロパティ」メニューを選択。

2.以下と同じようにチェックされていることを確認します。

image

 

3. MS DTC の Windows ファイアウォールの例外設定
MS DTC の Windows ファイアウォールの例外設定を行います。

クラスター環境の場合はすべてのノードにて行います。

Enable Firewall Exceptions for MS DTC
https://technet.microsoft.com/ja-jp/library/cc725913(v=ws.10).aspx

 

4. MSDTC を再起動します。
クラスター環境の場合は、MS DTC クラスターリソースを含むクラスターグループを各クラスターノードへ移動します。

MSDTC のクラスター化につきましては以下をご参照ください。

Windows Server 2012 フェールオーバー クラスタリング構築・運用・管理ガイド download.microsoft.com/download/9/.../WS2012_WSFC_Guide.docx‎