AWS DMS を使用した継続的なレプリケーション用のタスクの作成
ソースデータ ストアへの継続的な変更をキャプチャする AWS DMS タスクを作成できます。データの移行中にこのキャプチャを実行できます。サポートされているターゲットデータストアへの初回(全ロード)の移行が完了した後で、継続的な変更をキャプチャするタスクを作成することもできます。このプロセスは継続的なレプリケーションまたは変更データキャプチャ (CDC) と呼ばれます。AWS DMS では、このプロセスを使用してソースデータストアの継続的な変更をレプリケートします。このプロセスでは、データベースエンジンのネイティブ API を使用してデータベースログへの変更を収集します。
注記
全ロードタスクのみを使用してビューを移行できます。タスクが CDC のみのタスクであるか、完了後に CDC を開始する全ロードタスクである場合、移行にはソースのテーブルのみが含まれます。全ロードのみのタスクを使用して、ビューまたはテーブルとビューの組み合わせを移行できます。詳細については、「 JSON を使用するテーブル選択および変換を指定する」を参照してください。
ソースエンジンごとに、この変更ストリームを指定されたユーザーアカウントに開示するための固有の設定要件があります。ほとんどのエンジンでは、キャプチャプロセスでデータ損失を発生させずに意味のある方法で変更データを使用するために、追加の設定が必要です。たとえば、Oracle ではサプリメンタルロギングの追加が必要であり、MySQL では行レベルのバイナリログ (bin ログ) が必要です。
ソースデータベースから継続的な変更を読み取るために、AWS DMS はエンジン固有の API アクションを使用してソースエンジンのトランザクションログから変更を読み取ります。これを AWS DMS で実行する例を以下に示します。
-
Oracle AWS DMS は、Oracle LogMiner API または Binary Reader API (bfile API) を使用して、継続的な変更を読み取ります。AWS DMS は、システム変更番号 (SCN) に基づいてオンラインまたはアーカイブ REDO ログから継続的な変更を読み取ります。
-
Microsoft SQL Server の場合、AWS DMS は MS-Replication または MS-CDC を使用して SQL Server のトランザクションログに情報を書き込みます。次に、SQL Server の
fn_dblog()
関数またはfn_dump_dblog()
関数を使用して、ログシーケンス番号 (LSN) に基づいてトランザクションログの変更を読み取ります。 -
MySQL の場合、AWS DMS は、行ベースのバイナリログ (binlogs) から変更を読み取り、この変更をターゲットに移行します。
-
PostgreSQL の場合、AWS DMS はレプリケーションスロットを設定し、test_decoding プラグインを使用して、ソースから変更を読み取り、この変更をターゲットに移行します。
-
ソースとしての Amazon RDS の場合は、CDC をセットアップするためのバックアップが有効になっていることを確認するようお勧めします。また、変更ログを十分な時間だけ (通常は 24 時間で十分) 保持するようにソースデータベースが設定されていることを確認してください。各エンドポイントの特定の設定については、次を参照してください。
Amazon RDS for Oracle: AWS DMS 用に AWS が管理する Oracle ソースを設定する
Amazon RDS for MySQL and Aurora MySQL: AWS DMS のソースとして AWS が管理する MySQL 互換データベースの使用
Amazon RDS for SQL Server: Cloud SQL Server DB インスタンスでの継続的なレプリケーションのセットアップ
Amazon RDS for PostgreSQL と Aurora PostgreSQL: PostgreSQL は必要な WAL を自動的に保持します
継続的なレプリケーションタスクには 2 つのタイプがあります。
-
全ロード + CDC: タスクでは、まず既存のデータを移行し、次にソースデータベースへの変更に応じてターゲットデータベースを更新します。
-
CDC のみ: タスクでは、ターゲットデータベースにデータが取り込まれた後の継続的変更を移行します。
CDC 開始ポイントからのレプリケーションの実行
AWS DMS の継続的なレプリケーションタスク (変更データのキャプチャのみ) は、複数のポイントから開始できます。これには以下が含まれます。
-
[From a custom CDC start time](カスタム CDC 開始時刻から) - AWS Management Console または AWS CLI を使用して、レプリケーションをスタートするタイムスタンプを AWS DMS に提供できます。AWS DMS は、このカスタム CDC 開始時刻から継続的レプリケーションタスクをスタートします。AWS DMS は、提供されたタイムスタンプ (UTC) をネイティブスタートポイント (SQL Server の LSN や Oracle の SCN など) に変換します。AWS DMS は、エンジン固有の方法を使用し、ソースエンジンの変更ストリームに基づいて移行タスクのスタート位置を決定します。
注記
ソースが Db2 の場合、
StartFromContext
接続属性を必要なタイムスタンプに設定した場合にのみ CDC 開始時刻をカスタマイズできます。PostgreSQL をソースとする場合、カスタム CDC の開始時刻はサポートされません。これは、PostgreSQL データベースエンジンには、Oracle や SQL Server とは異なり、タイムスタンプを LSN や SCN にマップする方法がないためです。
-
[From a CDC native start point](CDC ネイティブのスタートポイントから) - ソースエンジンのトランザクションログのネイティブポイントから開始することもできます。場合によっては、タイムスタンプはトランザクションログで複数のネイティブポイントを示すことができるため、このアプローチのほうが適している場合があります。AWS DMS では、この機能を以下のソースエンドポイントでサポートしています。
-
SQL Server
-
PostgreSQL
-
Oracle
-
MySQL
-
MariaDB
-
タスクが作成されると、AWS DMS は CDC の開始点にマークが付けられます。これを変更することはできません。別のCDC開始点を使用するには、新しいタスクを作成します。
CDC ネイティブのスタートポイントの決定
CDC ネイティブの開始ポイントは、CDC を開始できる時間を定義するデータベースエンジンのログ内のポイントです。例えば、あるバルクデータ ダンプがターゲットに適用されているとします。継続的レプリケーション専用タスクについて、ネイティブのスタートポイントを参照できます。データの不整合を回避するには、レプリケーション専用タスクのスタートポイントを慎重に選択してください。DMS は、選択した CDC スタートポイントの後に開始されたトランザクションをキャプチャします。
以下の例では、サポートされているソースエンジンから CDC ネイティブの開始ポイントを見つける方法を示します。
- SQL Server
-
SQL Server では、ログシーケンス番号 (LSN) は以下の 3 つのパートで構成されています。
-
仮想ログファイル (VLF) シーケンス番号
-
ログブロックの開始オフセット
-
スロット番号
LSN の例:
00000014:00000061:0001
トランザクションログのバックアップ設定に基づいて SQL Server の移行タスクの開始ポイントを取得するには、SQL Server の
fn_dblog()
関数またはfn_dump_dblog()
関数を使用します。SQL Server で CDC ネイティブ開始点を使用するには、継続的なレプリケーションの対象の任意のテーブルにパブリケーションを作成します。CDC ネイティブ開始点を使用せずに CDC を使用すると、AWS DMS はパブリケーションを自動的に作成します。
-
- PostgreSQL
-
PostgreSQL ソースデータベースには、CDC 復旧チェックポイントを使用できます。進行中のレプリケーションタスクはソースデータベース (親タスク) に対して実行されるため、このチェックポイント値はまざまな時点で生成されます。チェックポイント全般の詳細については、「チェックポイントを CDC のスタートポイントとして使用する」をご参照ください。
ネイティブスタートポイントとして使用するチェックポイントを特定するには、データベース
pg_replication_slots
ビューを使用するか、AWS Management Console から親タスク概要の詳細を使用します。コンソールで親タスクの概要の詳細を検索するには
-
AWS Management Console にサインインし、AWS DMS コンソール (https://console.aws.amazon.com/dms/v2/
) を開きます。 IAM ユーザーとしてサインインしている場合は、AWS DMS にアクセスするための適切なアクセス許可があることを確認します。必要なアクセス権限の詳細については、「AWS DMS の使用に必要な IAM アクセス許可」をご参照ください。
-
ナビゲーションペインで、[データベース移行タスク] を選択します。
-
[データベース移行タスク] ページのリストから親タスクを選択します。これにより、親タスクページが開き、概要の詳細が表示されます。
-
[データキャプチャの変更 (CDC)]、[データキャプチャの変更 (CDC) の開始位置]、および [データキャプチャの変更 (CDC) リカバリチェックポイント] でチェックポイント値を見つけます。
値は、次のようになります。
checkpoint:V1#1#000004AF/B00000D0#0#0#*#0#0
ここでは、このネイティブ CDC 開始ポイントを指定するために必要な
4AF/B00000D0
コンポーネントです。PostgreSQL ソースのこの開始ポイントでレプリケーションを開始する CDC タスクを作成するときに、DMS APICdcStartPosition
パラメータをこの値に設定します。AWS CLI を使用して CDC タスクを作成する方法の詳細については、「AWS DMS を使用して AWS が管理する PostgreSQL DB インスタンスでの CDC の有効化」をご参照ください。
-
- Oracle
-
システム変更番号 (SCN) は、Oracle データベースで使用される論理的な内部タイムスタンプです。SCN は、データベース内で発生するイベントを順序付けします。これは、トランザクションの ACID プロパティを満たすために必要です。Oracle データベースでは、ディスクに書き込まれたすべての変更の位置を SCN でマークするため、書き込み済みの変更には復旧アクションが適用されません。また、Oracle では、データセットで REDO が存在しないポイントをマークして復旧を停止できるようにするためにも SCN を使用します。
Oracle データベース内の現在の SCN を取得するには、次のコマンドを実行します。
SELECT CURRENT_SCN FROM V$DATABASE
SCN またはタイムスタンプを使用して CDC タスクを開始すると、オープントランザクションの結果が失われ、このような結果の移行に失敗します。オープントランザクションとは、タスクの開始位置より前に開始され、タスクの開始位置の後にコミットされたトランザクションを指します。SCN とタイムスタンプを特定して、すべての未決トランザクションを含むポイントで CDC タスクをスタートできます。詳細については、Oracle ドキュメントの「トランザクション
」をご参照ください。バージョン 3.5.1 以降では、タスクを開始するために SCN またはタイムスタンプを使用する場合、AWS DMS は openTransactionWindow
エンドポイント設定を使用して CDC のみのタスクのオープントランザクションをサポートしています。この
openTransactionWindow
設定を使用する場合、オープントランザクションを処理する期間を分単位で指定する必要があります。AWS DMS はキャプチャ位置を移動して、データキャプチャを開始する新しい位置を検索します。AWS DMS は、必要となる Oracle REDO ログまたはアーカイブ REDO ログからオープントランザクションをスキャンするために新しい開始位置を使用します。 - MySQL
-
MySQL バージョン 5.6.3 がリリースされるまで、MySQL のログシーケンス番号 (LSN) は 4 バイトの符号なし整数でした。MySQL バージョン 5.6.3 で、REDO ログファイルのサイズ上限が 4 GB から 512 GB に引き上げられ、LSN は 8 バイトの符号なし整数になりました。この引き上げは、サイズ情報の保存に追加のバイトが必要になったことが理由です。MySQL 5.6.3 以降で構築された LSN 値を使用するアプリケーションでは、LSN 値を保存して比較するために 32 ビット変数ではなく 64 ビット変数を使用する必要があります。MySQL の LSN の詳細については、「MySQL のドキュメント
」をご参照ください。 MySQL データベース内の現在の LSN を取得するには、以下のコマンドを実行します。
mysql> show master status;
このクエリから、binlog ファイルの名前、位置、およびその他いくつかの値が返されます。CDC ネイティブの開始ポイントは、binlogs ファイルの名前と位置の組み合わせです (例:
mysql-bin-changelog.000024:373
)。この例で、mysql-bin-changelog.000024
は binlogs ファイルの名前、373
は AWS DMS で変更のキャプチャを開始する位置です。
チェックポイントを CDC のスタートポイントとして使用する
継続的なレプリケーションタスクでは変更を移行し、AWS DMS では AWS DMS 固有のチェックポイント情報を時々キャッシュします。AWS DMS が作成するチェックポイントに含まれている情報に従って、レプリケーションエンジンは変更ストリームの復旧ポイントを確認します。チェックポイントを使用して変更のタイムラインをさかのぼり、失敗した移行タスクを復旧できます。チェックポイントを使用して、別のターゲットに向けて別の継続的なレプリケーションタスクを任意の時点から開始することもできます。
チェックポイント情報は、以下の 3 つの方法で取得できます:
-
API オペレーション
DescribeReplicationTasks
を実行して結果を確認します。情報をタスク別にフィルタ処理し、チェックポイントを検索できます。タスクが停止状態または失敗状態のときに最新のチェックポイントを取得できます。タスクを削除すると、この情報は失われます。 -
ターゲットインスタンスで
awsdms_txn_state
というメタデータテーブルを表示します。テーブルにクエリを実行してチェックポイント情報を取得できます。メタデータテーブルを作成するには、タスクの作成時にTaskRecoveryTableEnabled
パラメータをYes
に設定します。この設定により、AWS DMS はチェックポイント情報を継続的にターゲットメタデータテーブルに書き込みます。タスクを削除すると、この情報は失われます。次に、メタデータテーブル
checkpoint:V1#34#00000132/0F000E48#0#0#*#0#121
でのチェックポイントの例を示します -
ナビゲーションペインで、[Database migration tasks] (データベース移行タスク) を選択し、[Database migration tasks](データベース移行タスク) ページに表示されるリストから親タスクを選択します。親タスクページが開き、概要の詳細が表示されます。[データキャプチャの変更 (CDC)]、[データキャプチャの変更 (CDC) の開始位置]、および [データキャプチャの変更 (CDC) リカバリチェックポイント] でチェックポイント値を見つけます。チェックポイントの値は、次のようになります:
checkpoint:V1#1#000004AF/B00000D0#0#0#*#0#0
コミット時間ポイントまたはサーバー時間ポイントでのタスクの停止
CDC ネイティブの開始ポイントの導入により、AWS DMS では以下のポイントでタスクを停止することもできます。
-
ソースのコミット時間
-
レプリケーションインスタンスのサーバー時間
必要に応じてタスクを変更し、停止する時刻を UTC で設定できます。タスクは、設定したコミット時間またはサーバー時間に基づいて自動的に停止します。または、タスクの作成時に移行タスクを停止する時間があらかじめわかっている場合は、タスクの作成時に停止時間を設定できます。
注記
新しい AWS DMS サーバーレスレプリケーションを初めて開始する場合、すべてのリソースを初期化するのに最大 40 分かかることがあります。server_time
オプションは、リソースの初期化が完了した後にのみ適用されることに注意します。
双方向レプリケーションの実行
AWS DMS タスクを使用すると、2 つのシステム間で双方向レプリケーションを実行できます。双方向レプリケーションでは、2 つのシステム間で同じテーブル (またはテーブルのセット) のデータを両方向にレプリケートします。
たとえば、データベース A からデータベース B に EMPLOYEE テーブルをコピーし、テーブルの変更内容をデータベース A からデータベース B にレプリケートできます。さらに、EMPLOYEE テーブルの変更内容をデータベース B から A にレプリケートすることもできます。したがって、双方向レプリケーションを実行していることになります。
注記
AWS DMS 双方向レプリケーションは、プライマリノード、競合解決などを含む完全なマルチマスターソリューションとしては意図されていません。
異なるノード上のデータが動作的に分離されている状況で双方向レプリケーションを使用します。つまり、ノード A で動作しているアプリケーションによって変更されたデータ要素があり、そのノード A がノード B との双方向レプリケーションを実行するとします。ノード A のそのデータ要素は、ノード B で動作するアプリケーションによって変更されることはありません。
AWS DMS では、次のデータベースエンジンでの双方向レプリケーションがサポートされています:
-
Oracle
-
SQL Server
-
MySQL
-
PostgreSQL
-
Amazon Aurora MySQL 互換エディション
-
Aurora PostgreSQL 互換エディション
双方向レプリケーションタスクの作成
AWS DMS 双方向レプリケーションを有効にするには、両方のデータベース (A と B) のソースとターゲットのエンドポイントを設定します。たとえば、データベース A のソースエンドポイント、データベース B のソースエンドポイント、データベース A のターゲットエンドポイント、データベース B のターゲットエンドポイントを設定します。
次に、ソース A からターゲット B にデータを移動するタスクと、ソース B からターゲット A にデータを移動するタスクの 2 つのタスクを作成します。さらに、各タスクでループバック防止が設定されていることを確認します。これにより、両方のタスクのターゲットに同一の変更が適用されて、少なくとも一方のタスクのデータが破損するのを防ぐことができます。詳細については、「ループバックの防止」を参照してください。
最も簡単な方法として、まずデータベース A とデータベース B の両方に同一のデータセットを作成します。次に CDC 専用タスクを 2 つ作成します。1 つは A から B にデータをレプリケートするタスクで、もう 1 つは B から A にデータをレプリケートするタスクです。
AWS DMS を使用してノード A からノード B の新しいデータセット (データベース) をインスタンス化するには、次の操作を行います。
-
データベース A から B にデータを移動するには全ロードおよび CDC タスクを使用します。この間、アプリケーションによりデータベース B のデータが変更されないようにしてください。
-
全ロードが完了した後、アプリケーションがデータベース B のデータを変更できるようになる前に、データベー ス B の時刻または CDC 開始位置をメモします。手順については、「CDC 開始ポイントからのレプリケーションの実行」をご参照ください。
-
この開始時刻または CDC 開始位置を使用して、データベース B から A にデータを移動する CDC 専用タスクを作成します。
注記
全ロードと CDC にできる双方向ペアのタスクは 1 つだけです。
ループバックの防止
ループバックの防止について説明するため、タスク T1 で AWS DMS がソースデータベース A から変更ログを読み取り、ターゲットデータベース B に変更内容を適用するとします。
次に、2 番目のタスクである T2 がソースデータベース B から変更ログを読み取り、ターゲットデータベース A に適用します。T2 がこれを行う前に、DMS は、ソースデータベース A からターゲットデータベース B に対して行われたのと同じ変更がソースデータベース B に対して行われていないことを確認する必要があります。つまり、DMS は、これらの変更がターゲットデータベース A にエコー (ループ) されないことを確認する必要があります。そうしないと、データベース A のデータが破損する可能性があります。
変更のループバックを防止するには、各双方向レプリケーションタスクに次のタスク設定を追加します。これにより、ループバックデータの破損がどちらの方向でも発生しなくなります。
{ . . . "LoopbackPreventionSettings": { "EnableLoopbackPrevention":
Boolean
, "SourceSchema":String
, "TargetSchema":String
}, . . . }
LoopbackPreventionSettings
タスク設定により、トランザクションが新規であるか、反対方向のレプリケーションタスクからのエコーであるかが決まります。AWS DMS がトランザクションをターゲットデータベースに適用すると、DMS テーブル (awsdms_loopback_prevention
) が変更のマークで更新されます。各トランザクションをターゲットに適用する前に、DMS はこの awsdms_loopback_prevention
テーブルへの参照を含むトランザクションをすべて無視します。したがって、変更が適用されません。
これらのタスク設定は、双方向ペアの各レプリケーションタスクに含めます。これらの設定により、ループバック防止が有効になります。さらに、各エンドポイントの awsdms_loopback_prevention
テーブルを含むタスク内の各ソースおよびターゲットデータベースのスキーマも指定します。
各タスクがそのようなエコーを識別して破棄できるようにするには、EnableLoopbackPrevention
を true
に設定します。awsdms_loopback_prevention
を含むソースでスキーマを指定するには、SourceSchema
をソースデータベース内のそのスキーマの名前に設定します。同じテーブルを含むターゲットでスキーマを指定するには、TargetSchema
をターゲットデータベース内のそのスキーマの名前に設定します。
次の例では、レプリケーションタスク T1 とその反対方向のレプリケーションタスク T2 の SourceSchema
および TargetSchema
設定が、反対方向の設定で指定されています。
タスク T1 の設定は以下のとおりです。
{ . . . "LoopbackPreventionSettings": { "EnableLoopbackPrevention": true, "SourceSchema": "LOOP-DATA", "TargetSchema": "loop-data" }, . . . }
反対方向のタスク T2 の設定は以下のとおりです。
{ . . . "LoopbackPreventionSettings": { "EnableLoopbackPrevention": true, "SourceSchema": "loop-data", "TargetSchema": "LOOP-DATA" }, . . . }
注記
AWS CLI を使用する場合、create-replication-task
または modify-replication-task
コマンドだけを使用して、双方向レプリケーションタスクで LoopbackPreventionSettings
を設定します。
双方向レプリケーションの制限
AWS DMS の双方向レプリケーションには、次の制限があります。
-
ループバック防止は、データ操作言語 (DML) ステートメントのみを追跡します。AWS DMS は、データ定義言語 (DDL) ループバックの防止をサポートしていません。これを行うには、双方向ペアのいずれかのタスクを、DDL ステートメントが除外されるように設定します。
-
ループバック防止を使用するタスクは、一括変更のコミットをサポートしていません。ループバック防止を使用してタスクを設定するには、
BatchApplyEnabled
をfalse
に設定します。 -
DMS 双方向レプリケーションには、競合の検出や解決は含まれていません。データの不整合を検出するには、両方のタスクでデータ検証を使用します。