Amazon Web Services ブログ

ドメイン参加済みの Amazon RDS for SQL Server インスタンスに対する分散トランザクションサポートの有効化



Amazon Relational Database Service (RDS) for SQL Server が Microsoft 分散トランザクションコーディネータ (MSDTC) を使用した分散トランザクションをサポートするようになりました。MSDTC を使用することで、RDS for SQL Server DB インスタンスが関与する分散トランザクションを実行することができます。この記事では、Amazon RDS for SQL Server 使用時に、AWS Directory Service for Microsoft Active Directory (AWS Managed Microsoft AD) を使って分散トランザクションを実行する最も一般的な方法について説明します。

ソリューションの概要

この記事では、3 つの主要用語が使用されています。

  • 分散トランザクション – 2 台以上のネットワークコンピュータシステムにあるデータを更新するトランザクションです。分散トランザクションは、分散データを更新する必要があるアプリケーションにトランザクションのメリットを提供します。
  • トランザクションマネージャー – アトミックトランザクションの結果の管理と分散に対する責任を担います。トランザクションマネージャーは、ルートトランザクションマネージャー、または特定のトランザクションに対する下位トランザクションマネージャーのどちらかになります。
  • リソースマネージャー – アトミックトランザクションの結果とのリソース状態の調整に対する責任を担います。指定されたトランザクションについて、リソースマネージャーはひとつのトランザクションマネージャーのみと連携し、トランザクション結果の表明と最終結果の取得を行います。

このソリューションには、以下のステップが含まれます。

  1. パラメータグループの設定。
  2. オプショングループの設定。
  3. Amazon RDS for SQL Server DB インスタンスの設定。
  4. 分散トランザクションの設定。

前提条件

手順を開始する前に、AWS Managed Microsoft AD ディレクトリを作成します。複数のアカウントまたは VPC がある場合にインスタンスを参加させる手順については、アカウント間の Amazon RDS DB インスタンスを単一の共有ドメインに参加させるを参照してください。

パラメータグループの設定

MSDTC オプションを Amazon RDS for SQL Server DB インスタンスに割り当てることができるのは、この DB インスタンスがコミットを推測する、または中断を推測する、状態が不明なトランザクションの解決方法を設定している場合のみです。これは、in-doubt xact resolution サーバーパラメータを 1 (コミットを推測) または 2 (中断を推測) に変更することで実行できます。これらの値の詳細については、Microsoft のドキュメントウェブサイトにある in-doubt xact resolution サーバー構成オプションを参照してください。

パラメータグループは、AWS マネジメントコンソールまたは AWS コマンドラインインターフェイス (AWS CLI) で作成および設定できます。

AWS マネジメントコンソール

コンソールで新しいパラメータグループを作成するには、以下のステップを完了してください。

  1. Amazon RDS コンソールで [パラメータグループ] を選択します。
  2. [パラメータグループの作成] を選択します。
  3. 新しいパラメータグループは、正しいエンジンタイプとバージョンで作成してください。以下はその例です。
    • a) パラメータグループファミリーには [sqlserver-ee-14.0] を選択します。
    • b) グループ名には param-group-for-msdtc と入力します。
    • c) 説明には Parameter group for MSDTC と入力します。
  4. [作成] を選択します。
  5. パラメータグループで新しく作成されたパラメータグループを選択します。
  6. [パラメータグループアクション] で [編集] を選択します。
  7. in-doubt xact resolution パラメータを検索します。
  8. に希望のパラメータ値を入力します。
  9. [変更の保存] を選択します。

AWS CLI

AWS CLI を使ってパラメータグループを設定するには、以下のステップを完了してください。

  1. 以下のコードで新しいパラメータグループを作成します。
    aws rds create-db-parameter-group
        --db-parameter-group-name param-group-for-msdtc
        --db-parameter-group-family sqlserver-ee-14.0
        --description "Parameter group for MSDTC"
  2. 以下のコードでパラメータ値を設定します。
    aws rds modify-db-parameter-group
        --db-parameter-group-name param-group-for-msdtc
        --parameters ParameterName='in-doubt xact resolution',ParameterValue=1,ApplyMethod=IMMEDIATE

MSDTC オプショングループの設定

この時点で、MSDTC オプションを設定し、そのオプションを新しい、または既存のオプショングループに関連付ける必要があります。このユースケースでは、新しいオプショングループを作成します。これには、コンソールまたは AWS CLI のいずれかを使用できます。

AWS マネジメントコンソール

コンソールでオプショングループを設定するには、以下のステップを完了してください。

  1. Amazon RDS コンソールで [オプショングループ] を選択します。
  2. [グループを作成] を選択します。
  3. 希望のエンジンタイプとメジャーバージョンで新しいオプショングループを作成します。以下はその例です。
    • a) 名前には option-group-for-msdtc を入力します。
    • b) 説明には Option group for MSDTC を入力します。
    • c) エンジンには [sqlserver-ee] を選択します。
    • d) メジャーエンジンバージョンには [14.00] を選択します。
  4. [作成] を選択します。
  5. MSDTC オプションを選択してから、[オプションを追加] を選択します。
  6. オプション設定で、MSDTC オプションの主なパラメータを設定します。
    • a) ポートには、MSDTC サービスのポートを入力、またはデフォルト値 (5000) を使用します。
    • b) セキュリティグループには、MSDTC オプションを有効化したい VPC セキュリティグループを選択します。
    • c) 認証タイプには、MSDTC サービスの認証タイプを選択します。この記事ではドメイン参加済みの環境に対するオプションを設定しているので、[相互] を選択します。
    • d) トランザクションログサイズには、希望のサイズを入力、またはデフォルト値 (4) を使用します。
  7. 追加設定セクションでは、[インバウンド接続を有効にする] と [アウトバウンド接続を有効にする] を選択します。
  8. スケジューリングでは、[今すぐ] を選択して変更を即座に適用します。
  9. [オプションの追加] を選択します。

AWS CLI

AWS CLI を使ってオプショングループを設定するには、以下のステップを完了してください。

  1. 以下のコードで新しいオプショングループを作成します。
    aws rds create-option-group
        --option-group-name option-group-for-msdtc
        --engine-name sqlserver-ee --major-engine-version 14.00
        --option-group-description "Option group for MSDTC"
  2. 以下のコードで MSDTC オプションを追加し、その設定を行います (セキュリティグループ識別子を変更する必要があります)。
    aws rds add-option-to-option-group 
        --options "OptionName=MSDTC,OptionSettings=[{Name=AUTHENTICATION,Value=MUTUAL},{Name=TRANSACTION_LOG_SIZE,Value=4}],Port=5000,VpcSecurityGroupMemberships=sg-abcd1234" \
        --option-group-name option-group-for-msdtc --apply-immediately

DB インスタンスの設定

新しく作成されたオプショングループとパラメータグループを既存の RDS インスタンスに割り当てる、または新しい RDS インスタンスを作成して、オプショングループとパラメータグループの両方を指定することができます。

新しいインスタンスの作成

分散トランザクションをサポートする新しいインスタンスを作成するには、以下のステップを完了してください。

  1. Amazon RDS コンソールで [データベース] を選択します。
  2. [Microsoft SQL Server] を選択し、メジャーバージョンには [00] を選択します。
    MSDTC サービスは、すべての Amazon RDS for SQL Server エディションと、バージョン 11.00.5058 (SQL Server 2012 SP2) 以降のバージョンでサポートされています。
  3. 設定で、以下の情報を入力します。
    • a) 有効なインスタンス名を入力します (例: sqlserver-msdtc1)。
    • b) 認証情報の設定で、インスタンスの接続に使用したいマスターユーザー名とパスワードを入力します。
  4. DB インスタンスサイズでは、希望のインスタンスサイズを選択します (例: m4.xlarge)。
  5. ストレージはデフォルト値のままにしておきます。
  6. 可用性 & 耐久性では、マルチ AZ 配置に [いいえ] を選択します。
    MSDTC はシングル AZ 配置と Always On のマルチ AZ 配置でサポートされ、ミラーリングのマルチ AZ ではサポートされません。
  7. 接続セクションでは、以下を入力します。
    • a) Virtual Private Cloud (VPC) には、MSDTC オプションに関連付けたセキュリティグループを持つ VPC を選択します。
    • b) 追加の接続設定では、期待されるサブネットグループと VPC セキュリティグループが、MSDTC オプションに選択したセキュリティグループと一致することを確認してください。
  8. Microsoft SQL Server Windows 認証セクションでは、[ディレクトリを参照] を選択してから、使用したい AWS Managed Microsoft AD ディレクトリを選択します。
  9. 追加設定では、作成したパラメータグループとオプショングループを選択します。
  10. 残りはデフォルト設定のままにしておきます。
  11. [データベースの作成] を選択します。

既存インスタンスの変更

既存の DB インスタンスに分散トランザクションのサポートを追加するには、以下のステップを完了してください。

  1. Amazon RDS コンソールで [データベース] を選択します。
  2. 変更する DB インスタンスを選択してから、[変更] を選択します。
  3. ネットワーク & セキュリティで、正しいサブネットグループセキュリティグループが選択されていることを確認します。
  4. データベースオプションで、作成したパラメータグループとオプショングループを選択します。
  5. Microsoft SQL Server Windows 認証で、正しいディレクトリが選択されていることを確認します。
  6. 他の設定は、変更せずにそのままにしておきます。
  7. [次へ] を選択します。
  8. [すぐに適用] を選択します。
  9. [DB インスタンスの変更] を選択して、DB インスタンスを即座に分散トランザクション用に設定します。

分散トランザクション制御の設定

これで、クライアントアプリケーションから分散トランザクションを実行できるようになりました。アプリケーションでは、分散トランザクションがローカルトランザクションと同様の方法で管理されます。トランザクションの最後に、アプリケーションはトランザクションがコミットまたはロールバックされることを要求します。トランザクションマネージャーは、一部のリソースマネージャーがトランザクションを正常にコミットする一方、他のリソースマネージャーがロールバックすることにつながるネットワーク障害のリスクを最小限に抑えるために、分散コミットを異なる方法で管理する必要があります。これは、2 フェーズコミットと呼ばれる 2 段階でのコミットプロセスを管理することで実現できます。

  • 準備フェーズ – トランザクションマネージャーがコミット要求を受け取ると、そのトランザクションに関与するすべてのリソースマネージャーに PREPARE コマンドを送信します。各リソースマネージャーは、トランザクションを持続的にするために必要な処理をすべて実行し、そのトランザクションのログイメージを含むすべてのバッファーをディスクにフラッシュします。各リソースマネージャーが準備フェーズを完了したら、準備が正常に行われたか、または失敗したかをトランザクションマネージャーに通知します。
  • コミットフェーズ – トランザクションマネージャーがすべてのリソースマネージャーから準備が正常に完了したという通知を受け取ると、各リソースマネージャーに COMMIT コマンドを送信します。コマンド受け取り後、リソースマネージャーはコミットを完了することができます。コミットが正常に完了したことをすべてのリソースマネージャーが報告する場合、トランザクションマネージャーはアプリケーションに成功通知を送信します。準備が失敗したことを報告するリソースマネージャーがある場合、トランザクションマネージャーは各リソースマネージャーに ROLLBACK コマンドを送信し、アプリケーションへのコミットの失敗を知らせます。

Amazon RDS for SQL Server では、オンプレミスでの分散トランザクションの実行と同じ方法で分散トランザクションを実行します。トランザクションは、リンクサーバーを使って SQL Server をトランザクションマネージャーとして実行、またはクライアントアプリケーションと同じホストで実行される MSDTC をトランザクションマネージャーの役割に昇格して実行することができます。

リンクサーバー

この構成では、分散トランザクションが RDS インスタンスのひとつで実行される MSDTC によって管理されます。クライアントアプリケーションは Amazon RDS for SQL Server のエンドポイントに接続し、RDS インスタンスで実行される MSDTC サービスに分散トランザクションの管理を任せます。Amazon RDS for SQL Server インスタンス上での分散トランザクションの制御には、BEGIN DISTRIBUTED TRANSACTION T-SQL ステートメントを使用することができます。分散トランザクションが開始されると、任意の数のリンクサーバーに送信されたあらゆるクエリが分散トランザクションの一部となります。

以下の図は、RDS インスタンスで実行される MSDTC がトランザクションマネージャーとして機能するシナリオを表しています。

2 つの RDS インスタンス間でのリンクサーバーの作成に関する詳細については、Implement Linked Servers with Amazon RDS for Microsoft SQL Serverを参照してください。

TransactionScope クラス

このユースケースでは、クライアントホストで実行される MSDTC サービスがトランザクションマネージャーの役割に昇格されます。クライアントで実行される MSDTC サービスは、分散トランザクションに関与する他のホストで実行されるすべての MSDTC サービスと通信する必要があります。前のシナリオにあるように、分散トランザクションに関与するホストの数は 2 台に制限されません。

TransactionScope クラスの詳細とソースコード例については、トランザクションスコープを使用した暗黙的なトランザクションの実装を参照してください。

以下の図は、クライアントアプリケーションと同じホストで実行されている MSDTC がトランザクションマネージャーとして機能する構成を表しています。

Windows クライアントマシンをトランザクションマネージャーに昇格させるには、以下のステップを完了してください。

  1. クライアントマシンを RDS インスタンスと同じ Active Directory ドメインに参加させて、相互認証が機能するようにします。クライアントアプリケーションが Amazon Elastic Cloud Compute (Amazon EC2) を使用する場合は、EC2 インスタンスを AWS Managed Microsoft AD ディレクトリに結合するを参照してください。このステップは、分散トランザクションに関与するすべてのホストの相互認証と完全に機能するドメイン名解決に必要です。
  2. MSDTC サービスをネットワークアクセスのために設定します。
    • a) コンポーネントサービスを開きます (または、サーバーマネージャーで [ツール] を選択し、次に [コンポーネントサービス] を選択します)。
    • b) [コンポーネントサービス]、[コンピュータ]、[マイコンピュータ、[分散トランザクションコーディネータ] と展開してから、[ローカル DTC] (右クリック)、[プロパティ] と選択します。
    • c) [セキュリティ] タブで以下を選択します。
      • ネットワーク DTC アクセス
      • 受信を許可する
      • 送信を許可する
      • 相互認証を必要とする
    • d) [OK] を選択して変更を保存します。
    • e) サービスを再起動するプロンプトが表示されたら、[はい] を選択します。
  3. Windows ファイアウォールが、MSDTC サービスのネットワーク通信を許可するよう適切に設定されていることを確認します。
    • a) Windows ファイアウォールを開き、[受信の規則] を選択します。
    • b) 以下のファイアウォール規則が有効化されていることを確認します。
      • 分散トランザクションコーディネータ (RPC)
      • 分散トランザクションコーディネータ (RPC-EPMAP)
      • 分散トランザクションコーディネータ (TCP-In)

まとめ

Amazon RDS for SQL Server に対する MSDTC サポートにより、SQL Server の非マネージド型インスタンスと同じ方法を使って、Amazon RDS 内で分散トランザクションを実行することができます。この記事では、Active Directory 環境で分散トランザクションを制御する方法について説明しました。分散トランザクションの詳細については、Support for Microsoft Distributed Transaction Coordinator in SQL Server を参照してください。

SQL Server で分散トランザクションを今すぐお試しください! ご意見またはご質問がおありの場合は、コメント欄からお知らせください。

この記事にある定義の一部は、以下のソースから引用しました。


著者について

 

Vaclav Lukas アマゾン ウェブ サービスのソフトウェア開発エンジニアです。