【AWS】DMS について詳細調査(SQL Server → Redshift)

DMS とは何か

AWS DMS(AWS Database Migration Service)は、DB 間でデータを移行・継続同期するためのマネージドサービスです。

SQL Server → Redshift の場合は、以下のような役割です。

SQL Server
  ↓
AWS DMS レプリケーションインスタンス
  ↓
一時的な CSV / 変更データ
  ↓
S3
  ↓
Redshift COPY
  ↓
Redshift テーブル

DMS のタスクでは、主に次の3つの移行方式があります。

方式内容用途
フルロード、再ロード、Full Load既存データを一括コピー初回移行
CDC only変更分だけ連携既にターゲットに初期データがある場合
フルロード + CDC初期データをコピーし、その後の変更も継続反映本番系の継続レプリケーションでよく使う

DMS タスクは Full loadFull load + CDCCDC only を選択でき、Full load + CDC では既存データをロードしながらソース側の変更を捕捉し、フルロード後に変更分をターゲットへ適用すると説明されています。

DMS の主要コンポーネント

DMS は、主に以下で構成されます。

コンポーネント役割
レプリケーションインスタンスDMS タスクを実行する実体。ソースから読み、ターゲットへ書く処理を行う
ソースエンドポイントSQL Server への接続情報
ターゲットエンドポイントRedshift への接続情報
レプリケーションタスクどのテーブルを、どの方式で、どの設定で連携するか
テーブルマッピング対象スキーマ・テーブル・除外条件・変換ルール
タスク設定 JSONタスク設定 JSON

DMS タスクには、レプリケーションインスタンス、ソースエンドポイント、ターゲットエンドポイント、移行方式、テーブルマッピング、CloudWatch ログなどを指定します。

SQL Server → Redshift の全体像

SQL Server → Redshift の DMS は、SQL Server のトランザクションログ / CDC 情報を読み取り、Redshift に反映する仕組みです。

ただし Redshift は OLTP DB ではなく、分析向けの DWH です。そのため、DMS は Redshift に対して1行ずつ直接 JDBC で INSERT / UPDATE / DELETE するというより、S3 を中間置き場として使い、Redshift の COPY でまとめて取り込む動きになります。

Redshift がターゲットの場合、DMS はまずデータを CSV ファイルにエクスポートし、S3 バケットへアップロードし、その後 Redshift の COPY コマンドで対象テーブルにロードすると説明されています。

Amazon Redshiftへのデータベース移行中、AWS DMSはまずデータをAmazon S3バケットに移動します。ファイルがAmazon S3バケットに格納されると、AWS DMSはそれらをAmazon Redshiftデータウェアハウス内の適切なテーブルに転送します。AWS DMSは、Amazon Redshiftデータベースと同じAWSリージョンにS3バケットを作成します。AWS DMSレプリケーションインスタンスも、同じAWSリージョンに配置する必要があります。

AWS DMS は、Amazon S3 バケットを使用してデータを Amazon Redshift データベースに転送します。AWS DMS がバケットを作成するには、コンソールで IAM ロールを使用します 
dms-access-for-endpoint。AWS CLI または DMS API を使用して、ターゲット データベースとして Amazon Redshift を指定してデータベース移行を作成する場合は、この IAM ロールを作成する必要があります。

Amazon Redshift ターゲットの中間ストレージとして使用する S3 バケットでは、バージョン管理を有効にしないでください。S3 バージョン管理が必要な場合は、ライフサイクル ポリシーを使用して古いバージョンを積極的に削除してください。そうしないと、S3
list-object 呼び出しのタイムアウトによりエンドポイント テストの接続が失敗する可能性があります。

DMS ログを調査すると S3 バケットへのアップロードなどが出てきます。SQL Server → Redshift のレプリケーションで S3 は中間領域として使われます。

初回ロードと CDC の流れ

たとえば SQL Server に以下のテーブルがあるとします。

CREATE TABLE dbo.user (
    id INT NOT NULL PRIMARY KEY,
    name NVARCHAR(100) NOT NULL,
    status NVARCHAR(20) NULL,
    updated_at DATETIME2 NOT NULL
);

DMS タスクを Full load + CDC で開始すると、流れは以下になります。

フェーズ1:Full Load

最初に、SQL Server の既存データを読みます。

SELECT * FROM dbo.user;

DMS は取得したデータを内部的に CSV 化し、S3 に置き、Redshift の COPY で取り込みます。

SQL Server dbo.user
  ↓
DMS
  ↓
S3: 一時CSV
  ↓
Redshift COPY
  ↓
Redshift public.user

Redshift ターゲットでは、フルロード(Full Load)時に DMS がソースレコードを CSV ファイルへ変換し、S3 の BucketFolder/TableID 配下へロードし、COPY 完了後にファイルを削除する仕様です。CDC 時は NetChanges テーブル用のパスへ変更データをロードします。

フェーズ2:Full Load 中の変更をキャッシュ

Full Load 中にもアプリケーションは SQL Server を更新し続ける可能性があります。

INSERT INTO dbo.user (id, name, status, updated_at)
VALUES (101, N'山田', N'active', SYSDATETIME());

UPDATE dbo.user
SET status = N'inactive', updated_at = SYSDATETIME()
WHERE id = 10;

DELETE FROM dbo.user
WHERE id = 20;

DMS はフルロード(Full Load)中に発生した変更を CDC として捕捉し、あとで Redshift に反映します。

フェーズ3:CDC 継続同期

Full Load が終わった後、DMS は SQL Server の変更ログを読み続けます。

SQL Server の INSERT / UPDATE / DELETE
  ↓
DMS が変更を捕捉
  ↓
S3 に変更データを一時出力
  ↓
Redshift に反映

DMS は CDC では DB エンジンのログを使って変更を収集します。変更適用が追いつかない場合、DMS はレプリケーションインスタンス上に変更をバッファし、メモリが足りなくなるとディスク上の Change Cache に、一時的にスピルする(メモリからディスク溢れだす)ことがあります。

SQL Server 側の CDC の考え方

SQL Server を DMS のソースにして継続レプリケーションする場合、DMS は SQL Server 側で変更を追跡できる状態を必要とします。

公式ドキュメントでは、SQL Server ソースで CDC を使うには、SQL Server が Full Backup 構成であること、リカバリモデルが FULL または BULK_LOGGED であること、DMS の CDC には SQL Server 側でフルトランザクションログが必要であり、MS-Replication または SQL Server CDC を有効にする必要があると説明されています。

BULK_LOGGED

BULK_LOGGED とは、SQL Server の 復旧モデル(Recovery Model) の1つです。

大量データ投入やインデックス作成などの一部のバルク処理で、トランザクションログの出力量を減らすためのモードです。

SQL Server の復旧モデルには主に以下があります。

復旧モデル(リカバリモデル)概要CDC 利用
SIMPLEログバックアップなし。復旧できるのは基本的にバックアップ時点まで
FULLすべての変更をログに記録。任意時点復旧が可能
BULK_LOGGEDFULL に近いが、一部の大量処理を最小ログ記録にする

オンプレミスや EC2 上の SQL Server の場合

オンプレミスや EC2 上の SQL Server では、DMS は基本的に以下の使い分けをします。

テーブル状態DMS の変更取得方式
主キーありSQL Server Replication
主キーなしSQL Server CDC

self-managed SQL Server では、主キーありテーブルの変更捕捉に MS-Replication、主キーなしテーブルの変更捕捉に MS-CDC を使うと説明されています。

RDS for SQL Server の場合

Amazon RDS for SQL Server は MS-Replication をサポートしないため、DMS は主キーあり・なしに関係なく MS-CDC を使う必要があると説明されています。

そのため、RDS SQL Server → Redshift の構成では、データベースレベル CDC とテーブルレベル CDC が非常に重要です。

MS-Replication

MS-Replication は、正式には Microsoft SQL Server Replication のことです。

SQL Server にあるデータやDBオブジェクトを、別のDBへコピー・配布し、その後も同期するための SQL Server 標準機能です。Replication は「あるDBから別のDBへデータやDBオブジェクトをコピー・配布し、整合性を保つために同期する技術群」と説明されています。