DMS バッチ適用機能を使用して CDC レプリケーションパフォーマンスを向上させるにはどうすればよいですか?

最終更新日: 2020 年 12 月 17 日

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

簡単な説明

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

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

AWS DMS CDC プロセスは、デフォルトでシングルスレッドです (トランザクション適用)。この方法は、他のすべてのオンライントランザクション処理 (OLTP) データベースエンジンで使用されるのと同じように、SQL レプリケーションで使用されます。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 タスクを実行し、1 つのバッチで新しい行を挿入し、その行を 10 回更新し、その行を削除した場合、DMS はこれらすべてのトランザクションを差し引き、それらを持ち越しません。こうするのは、行が最終的に削除されて存在しなくなるためです。このプロセスにより、ターゲットに適用される実際のトランザクションの数が減ります。

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

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

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

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

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

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

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

制限事項

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

  • Amazon Redshift ターゲットは、デフォルトでバッチ適用を使用します。Amazon Simple Storage Service (Amazon S3) ターゲットは、トランザクション適用を使用するように強制されます。
  • バッチ適用は、プライマリキー/一意のインデックスを持つテーブルでのみ機能します。プライマリキー/一意のインデックスがないテーブルの場合、一括適用は一括モードでのみ挿入を適用しますが、更新と削除を個別に実行します。テーブルにプライマリキー/一意のインデックスがあるが、個別モードに切り替えられていることが確認された場合は、AWS DMS タスクの最中に一括操作が失敗したことが原因で Amazon Redshift が個別モードに切り替えられた理由をトラブルシューティングするにはどうすればよいですか? を参照してください。
  • LOB 列がレプリケーションに含まれている場合、制限付き LOB モードでのみ BatchApplyEnabled を使用できます。詳細については、ターゲットメタデータタスク設定をご参照ください。
  • BatchApplyEnabled が true に設定されている場合、ターゲットテーブルに一意の制約があるときは、AWS DMS はエラーメッセージを生成します。

解決方法

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、最新の AWS CLI バージョンを使用していることを確認してください

BatchApplySetting はデフォルトで無効になっています。この設定は、AWS CLI または AWS DMS コンソールを使用して有効にできます。バッチ設定を有効にする前に、システムで次のセットアップタスクを完了してください。

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

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

AWS CLI を使用してバッチ設定を有効にする

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

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

AWS 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}}"

AWS DMS コンソールを使用してバッチ設定を有効にする

  1. AWS DMS コンソールを開きます。
  2. ナビゲーションパネルから、[データベース移行タスク] を選択します。
  3. タスクを選択してから、[変更] を選択します。
  4. [タスク設定] セクションから、[JSON エディタ] を選択します。
  5. 変更したいタスク設定を変更します。例えば、[TargetMetadata] セクションから、BatchApplyEnabledtrue に変更します (デフォルトは false)。
  6. [保存] をクリックしてタスクを変更します。

次の手順に従って、変更が有効になっていることを確認します。

  1. [タスク] リストページから、変更したタスクを選択します。
  2. [概要の詳細] タブから、[タスク設定 (JSON)] を展開します。
  3. そのタスクのタスク設定を確認します。

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

バッチモードでタスクを実行した後、CDCLatencyTarget が高い場合、次の原因でレイテンシーが発生している可能性があります。

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

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