DMS バッチ適用機能を使用して CDC レプリケーションのパフォーマンスを向上させる方法を教えてください。

最終更新日: 2020 年 8 月 24 日

全ロードと変更データキャプチャ (CDC) の AWS Database Migration Service (AWS DMS) タスクを実行しています。ソースレイテンシーは高くありませんが、ターゲットレイテンシーは高いか、増加しています。CDC のレプリケーションフェーズをスピードアップするには、どうすればよいですか?

簡単な説明

AWS DMS では、次の方法を使用して、変更データキャプチャ (CDC) フェーズでデータをレプリケートします。

  • トランザクション適用
  • バッチ適用

AWS DMS CDC プロセスは、デフォルトではシングルスレッドです (トランザクション適用)。SQL レプリケーションには、他のすべてのオンライントランザクション処理 (OLTP) データベースエンジンと同じ方法を使用します。DMS CDC レプリケーションは、ソースデータベーストランザクションログに完全に依存します。進行中のレプリケーションフェーズでは、DMS は、次のようにトランザクション適用方法を用いて、変更を適用します。

  1. DMS は、トランザクションログのソースからレプリケーション DB インスタンスメモリに変更を読み込みます。
  2. DMS は、変更を変換し、ソーターコンポーネントに渡します。
  3. ソーターコンポーネントは、トランザクションをコミット順にソートし、順番にターゲットに転送します。

ソース DB の変更率が高い場合、このプロセスに時間がかかることがあります。DMS がソース DB から受信する着信ワークロードが高いと、CDC ターゲットのレイテンシーメトリクスが急上昇するのを確認できます。

DMS は、シングルスレッドレプリケーション方法を使用して CDC の変更を処理します。DMSには、バッチを使用してターゲットの変更をすばやく処理するために、タスクレベル設定 BatchApplyEnabled が用意されています。BatchApplyEnabled は、ソース DB のワークロードが高く、ターゲット CDC レイテンシーが高いタスクがある場合に便利です。デフォルトでは、DMS は BatchApplySetting を無効にします。これは、AWS コマンドラインインターフェイス (AWS CLI) を使用して有効にできます。

バッチ適用の仕組み

BatchApplyEnabled を使用してタスクを実行すると、DMS は次の方法で変更を処理します。

  1. DMS は、ソース DB トランザクションログから変更をバッチで収集します。
  2. DMS は、バッチからのすべての変更とともに、ネット変更テーブルと呼ばれるテーブルを作成します。
  3. このテーブルはレプリケーション DB インスタンスのメモリにあり、ターゲット DB インスタンスに渡されます。
  4. DMS は、ネット変更テーブルからのすべての変更を実際のターゲットテーブルにネットアウトするネット変更アルゴリズムを適用します。

たとえば、BatchApplyEnabled で DMS タスクを実行し、新しい行を挿入し、その行に対して 10 回更新し、1 つのバッチでその行を削除すると、DMS はこれらのすべてのトランザクションをネットアウトし、それらを繰り越しません。これは、行が最終的に削除され、存在しなくなるためです。このプロセスは、ターゲットに適用される実際のトランザクションの数を減らします。

BatchApplyEnabled は、特定のタスクのバッチ内にある表の行レベルで正味変更アルゴリズムを適用します。したがって、ソースデータベースに頻繁な変更 (更新、削除、および挿入) がある場合、またはワークロードの組み合わせが同じ行にある場合は、BatchApplyEnabled を最適に利用することができます。これにより、ターゲットに適用される変更が最小限に抑えられます。収集されたバッチの変更が一意である場合 (つまり、異なる行レコードの変更を更新/削除/挿入した場合)、ネット変更テーブルアルゴリズムプロセスはイベントをフィルタリングできず、すべてのバッチイベントがバッチモードでターゲットに適用されます。バッチ適用が機能するには、テーブルのプライマリキーまたは一意のキーのいずれかが必要です。

DMS には、変更処理のチューニング用の BatchApplyPreserveTransaction 設定も用意されています。BatchApplySetting を有効にすると、BatchApplyPreserveTransaction がデフォルトでオンになります。true に設定すると、トランザクションの整合性が保持され、バッチにはソースからのトランザクション内のすべての変更が含まれることが保証されます。この設定は、Oracle ターゲットエンドポイントにのみ適用されます。

注: この設定の長所と短所に注意してください。BatchApplyPreserveTransaction 設定が true の場合、DMS はレプリケーション DB インスタンスのメモリに長時間実行されるトランザクション全体をキャプチャします。これは、MemoryLimitTotalMemoryKeepTime を設定するタスクごとに行い、ネット変更テーブルに変更を送信する前に、必要に応じてスワップします。BatchApplyPreserveTransaction 設定が false の場合、1 つのトランザクションからの変更が複数のバッチにまたがることがあります。これは、たとえば、ターゲットデータベースが使用できないなどの理由で、部分的に適用すると、データが失われる可能性があります。

DMS レイテンシーとバッチ適用プロセスの詳細については、AWS DMS 移行のデバッグブログのパート 2パート 3 を参照してください。

バッチ適用のユースケース

バッチ適用は、次の状況で使用できます。

  • タスクはソースからキャプチャされたトランザクションの数が多いので、ターゲットのレイテンシーを引き起こしています。
  • タスクにはソースからのワークロードがあります。これは、同じ行に対する挿入、更新、削除の組み合わせです。
  • ターゲットで厳密な参照整合性を維持する必要はありません (無効化された FK)。

制限

バッチ適用には、現在、次の制限があります

  • Amazon Redshift ターゲットは、デフォルトでバッチ適用を使用します。Amazon シンプルストレージサービス (Amazon S3) ターゲットは、トランザクション適用を強制的に使用する必要があります。
  • バッチ適用は、プライマリキー/一意のインデックスを持つテーブルでのみ機能します。プライマリキー/一意のインデックスのないテーブルの場合、一括適用は一括モードでの挿入のみを適用しますが、更新と削除は個別に実行されます。テーブルにプライマリキー/一意のインデックスがあり、個別処理モードが切り替わっている場合は、「AWS DMS タスク中に Amazon Redshift が個別処理モードに切り替わり、一括操作が失敗した場合のトラブルシューティング方法を教えてください」を参照してください。
  • レプリケーションに LOB 列が含まれている場合、BatchApplyEnabled は、制限付きの LOB モードでのみ使用できます。詳細については、「Target メタデータのタスク設定」を参照してください。

解決方法

BatchApplySetting はデフォルトで無効になっています。この設定を有効にするには、AWS コマンドラインインターフェイス (AWS CLI) を使用する必要があります。バッチ設定を有効にする前に、システムで次の設定タスクを完了してください。

既存のタスクのバッチ設定ステータスを確認する

  1. AWS DMS コンソールを開きます。
  2. ナビゲーションパネルで、[データベース移行タスク] を選択します。
  3. タスクを選択し、[ タスク設定 (JSON)] をクリックします。JSON では、BatchApplyEnabled無効な 状態でリストされています。

バッチ設定を有効にする

  1. AWS CLI がインストールされているシステムを開きます。
  2. aws configure コマンドを実行して、CLI プロンプトを入力します。
  3. AWS アクセスキー ID を入力し、Enter キーを押します。
  4. AWS シークレットキー ID を入力し、Enter キーを押します。
  5. DMS リソースのリージョン名を入力し、Enter キーを押します。
  6. 出力形式を入力し、Enter キーを押します。
  7. タスク ARN とバッチ設定条件を指定して、modify-replication-task コマンドを実行します。

注: タスクを変更する前に、タスクが 停止 状態であることを確認してください。タスクに基づいて次のコマンドの ARN を変更してから、それを実行してタスク設定を変更します。

コマンドが CLI で正常に実行されたら、DMS コンソールを開き、タスクのバッチ設定ステータスを再度確認します。BatchApplyEnabled は、タスク設定 (JSON) で有効として一覧表示されるようになりました。

DMS タスクを開始し、移行のパフォーマンスを観察できるようになりました。

aws dms modify-replication-task --replication-task-arn arn:aws:dms:us-east-1:123456789123:task:4VUCZ6ROH4ZYRIA25M3SE6NXCM --replication-task-settings "{\"TargetMetadata\":{\"BatchApplyEnabled\":true}}"

バッチモードでタスクを実行した後、高い CDClatencyTarget をトラブルシューティングする

バッチモードでタスクを実行した後、CDCLatencyTarget が高くなると、以下が原因でレイテンシーが発生する可能性があります。

  • プライマリインデックスとセカンダリインデックスがないため、ターゲット上でトランザクションが長時間実行されている
  • ターゲットでワークロードを処理するためのリソースの可用性が不足している
  • DMS レプリケーションインスタンスでリソース競合が頻繁に発生している

DMS のベストプラクティスに従って、これらの問題のトラブルシューティングを行います。