[DMS] S3 TargetのCDCにUPDATE/DELETEが出力されるようになっていました

こんにちは、菊池です。

Database Migration Service(DMS)では、データレプリケーション先にS3が選択可能です。

S3 Targetがサポートされた当初、継続的なデータレプリケーション(Change Data Capture:CDC)の対象はInsertのみで、UPDATE/DELETEは記録されませんでした。ところが、最近試したところ、CDCでもUPDATE/DELETEの更新についても記録されるようになっていました。

なお、本記事執筆時点(2017/6/5)でも、公式ドキュメントには以下のような記載があります。

Limitations to Using Amazon S3 as a Target

The following limitations apply to a file in Amazon S3 that you are using as a target:

  • UPDATE and DELETE statements are not supported.

 UPDATE/DELETEの出力

MongoDB to S3へのマイグレーションでCDCの出力を確認しました。MongoDB Sourceのマイグレーションモードはドキュメントモードを利用しています。

まずは転送元のコレクションにデータを登録しておきます。

s0-rs0:PRIMARY> db.contacts.insert({name:"hoge1", city: "Tokyo", phone:"090-xxxx-xxxx"});
WriteResult({ "nInserted" : 1 })
s0-rs0:PRIMARY> db.contacts.insert({name:"hoge2", city: "Kanagawa", email:"hoge2@example1.com"});
WriteResult({ "nInserted" : 1 })
s0-rs0:PRIMARY> db.contacts.insert({name:"hoge3", city: "Chiba" });
WriteResult({ "nInserted" : 1 })

この状態でDMSのタスク(フルロード/CDC)を実行します。フルロードでS3に出力されたファイルを確認します。

$ cat LOAD00000001.csv"
"{ ""_id"" : { ""$oid"" : ""5934e486ee12fb67cd5d8032"" }, ""name"" : ""hoge1"", ""city"" : ""Tokyo"", ""phone"" : ""090-xxxx-xxxx"" }"
"{ ""_id"" : { ""$oid"" : ""5934e48eee12fb67cd5d8033"" }, ""name"" : ""hoge2"", ""city"" : ""Kanagawa"", ""email"" : ""hoge2@example1.com"" }"
"{ ""_id"" : { ""$oid"" : ""5934e494ee12fb67cd5d8034"" }, ""name"" : ""hoge3"", ""city"" : ""Chiba"" }"

続けて、CDCを確認するため、MongoDBのデータを更新します。

s0-rs0:PRIMARY> db.contacts2.insert({name:"hoge4", city: "Tokyo", phone:"090-zzzz-zzzz"});
WriteResult({ "nInserted" : 1 })
s0-rs0:PRIMARY> db.contacts.update({name:"hoge3"}, {name:"hoge3", city: "Saitama"})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

しばらくすると、更新データがS3に出力されます。

$ cat 20170605-0505337058.csv
U,"{ ""_id"" : { ""$oid"" : ""5934e494ee12fb67cd5d8034"" }, ""name"" : ""hoge3"", ""city"" : ""Saitama"" }"
I,"{ ""_id"" : { ""$oid"" : ""5934e670ee12fb67cd5d8036"" }, ""name"" : ""hoge4"", ""city"" : ""Tokyo"", ""phone"" : ""090-zzzz-zzzz"" }"

行われた操作が、I(INSERT)、U(UPDATE)のように先頭カラムに追記されています。

続けて、ドキュメントの削除を試します。

s0-rs0:PRIMARY> db.contacts.deleteOne({name:"hoge3"})
{ "acknowledged" : true, "deletedCount" : 1 }

こちらも、ファイルを確認してみるとD(DELETE)として記録されています。

$ cat 20170605-0513342260.csv
D,"{ ""_id"" : { ""$oid"" : ""5934e494ee12fb67cd5d8034"" } }"

CDCでもS3 Targetの場合、以前はPDATE/DELETEについては何も出力されませんでしたが、更新情報が出力されるようになりました。出力されたファイルを時系列に確認することで、データ更新をトレースできます。

さいごに

いかがでしょうか。

UPDATE/DELETEが出力されることで、データの変更については正しく追跡可能になりました。S3をデータレイクとしてEMRやRedshiftに連携するなど、使い方に広がりが期待できます。

一方で、ドキュメント上、サポートされないような記載があるのが気になりますので、このあたりの更新情報もウォッチしていきたいと思います。