[AWS] DocumentDB 詳細解説:MongoDB からのデータ移行

2019.02.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、菊池です。

先日登場したAmazon DocumentDBをいろいろと触っています。

今回は、既存のMongoDBからのデータ移行方法を検証してみました。

DocumentDBへのデータ移行方法

MongoDBからDocumentDBへのデータ移行方法は大きく2つです。

  • 既存のMongoDBからダンプデータを取得して、DocumentDBにリストア
  • DMS(Database Migration Service)の利用

ダンプデータの移行では、MongoDB公式で提供している、mongodump/mongorestoreが使用可能です。

似たツールとして、mongoexport/mongoimportというものもありますが、mongodumpの場合にはIndexなどのメタデータを含めて移行することが可能です。詳細はこちらをご確認ください。

AWSが提供するデータベース移行サービスである、DMSを使っての移行も可能です。従来より、ソース(移行元)としてMongoDBをサポートしてましたが、DocumentDBの登場にあわせてターゲット(移行先)としてDocumentDBをサポートしました。DMSを使う利点はなりより、CDC(Chage Data Capcher)を使っての継続的な移行が可能なことです。ある時点での一括移行だけでなく、更新内容をキャプチャし差分同期することで、ダウンタイムを極力抑えた移行が可能です。ただし、CDCを使うためには、ソースのMongoDBがレプリカセットクラスタ構成であることが必須です。これは、レプリカセットクラスタの同期に利用されるOplogを、CDCでも利用するためです。

ダンプデータの移行

それでは、まずダンプデータの移行を試してみます。

mongodump/mongorestoreは、MongoDB本体プロセスであるmongodと同時に、mongodb-org-toolsをインストールしていれば利用可能です。検証では、ソースDBとして、EC2(Amazon Linux)にインストールしたMongoDB バージョン3.6を使用しています。移行対象データは、以下のチュートリアルに記載のデータをインポートしています。

まず、移行前のデータの確認です。

> use zips-db
switched to db zips-db
> db.stats()
{
	"db" : "zips-db",
	"collections" : 1,
	"views" : 0,
	"objects" : 29353,
	"avgObjSize" : 94.50938575273396,
	"dataSize" : 2774134,
	"storageSize" : 1429504,
	"numExtents" : 0,
	"indexes" : 1,
	"indexSize" : 315392,
	"fsUsedSize" : 1775960064,
	"fsTotalSize" : 8318783488,
	"ok" : 1
}
> show collections
zips
> db.zips.count()
29353

zips-dbデータベースのzipsコレクションに、29353件のデータが保存されています。これをmongodumpで取得します。

$ mongodump --host 172.31.54.185 \
> --port 27017 \
> --db zips-db \
> --out dumpdata
2019-02-10T05:50:04.231+0000	writing zips-db.zips to
2019-02-10T05:50:04.297+0000	done dumping zips-db.zips (29353 documents)

取得できました。ディレクトリをみると、BSONデータ本体とメタデータが取得できています。

$ ls -l dumpdata/zips-db/
合計 2716
-rw-rw-r-- 1 ec2-user ec2-user 2774134  2月 10 05:50 zips.bson
-rw-rw-r-- 1 ec2-user ec2-user     126  2月 10 05:50 zips.metadata.json

これをmondorestoreでDocumentDBにリストアします。ホストにDocumentDBのクラスタエンドポイントを指定しましょう。

$ mongorestore --host docdb-2019-02-10-05-25-07.cluster-xxxxxxxxxxxx.us-east-1.docdb.amazonaws.com \
> --port 27017 \
> --username skikuchi \
> --password xxxxxxxxx \
> --db zips-db zips-db/
2019-02-10T06:11:27.723+0000	the --db and --collection args should only be used when restoring from a BSON file. Other uses are deprecated and will not exist in the future; use --nsInclude instead
2019-02-10T06:11:27.723+0000	building a list of collections to restore from zips-db dir
2019-02-10T06:11:27.731+0000	reading metadata for zips-db.zips from zips-db/zips.metadata.json
2019-02-10T06:11:27.772+0000	restoring zips-db.zips from zips-db/zips.bson
2019-02-10T06:11:28.800+0000	no indexes to restore
2019-02-10T06:11:28.800+0000	finished restoring zips-db.zips (29353 documents)
2019-02-10T06:11:28.800+0000	done

インポートできました。DB、コレクション、データ件数とも一致しています。

rs0:PRIMARY> show dbs
zips-db  0.005GB
rs0:PRIMARY> use zips-db
switched to db zips-db
rs0:PRIMARY> db.stats()
{
	"db" : "zips-db",
	"collections" : 1,
	"objects" : 29353,
	"storageSize" : 4956160,
	"indexes" : 1,
	"indexSize" : 942080,
	"fileSize" : 5898240,
	"ok" : 1
}
rs0:PRIMARY> show collections
zips
rs0:PRIMARY> db.zips.count()
29353

DMSの利用

続いて、DMSでの移行を試してみます。先ほどと同じデータを使用して、以下のチュートリアルに従って実施しました。

手順は以下の通りです。

  • レプリケーションインスタンスの作成
  • ソースエンドポイントの作成
  • ターゲットエンドポイントの作成
  • タスクの実行

まずはレプリケーションインスタンスの作成です。今回は、ソースDB(MongoDB)、ターゲットDB(DocumentDB)ともに同じ VPC内に作成しています。エンジンバージョンを最新にし、同じVPC内にレプリケーションインスタンスを作成します。

続いて、ソースエンドポイントの作成です。移行元は認証/SSLとも有効にしていないので、「none」を選択しています。メタデータモードは、「Document」を選択してください。

次に、ターゲットエンドポイントです。ターゲットエンジンに、「docdb」を選択し、サーバ名にDocumentDBのクラスタエンドポイントを指定します。

最後に、タスクの作成です。作成したレプリケーションインスタンス、ソース/ターゲットエンドポイントを選択して実行します。なお、移行タイプとしてCDCも有効にしましたが、ソースがスタンドアロン構成のため機能しませんでした。

タスクが開始されました。

間も無く、フルロードが完了して、29,353件のデータが移行ずみになしました。

DocumentDBに接続して、データを確認してみます。

rs0:PRIMARY> show dbs
awsdms_control  0.000GB
zips-db         0.005GB
rs0:PRIMARY> use zips-db
switched to db zips-db
rs0:PRIMARY> db.stats()
{
	"db" : "zips-db",
	"collections" : 1,
	"objects" : 29353,
	"storageSize" : 4956160,
	"indexes" : 1,
	"indexSize" : 942080,
	"fileSize" : 5898240,
	"ok" : 1
}
rs0:PRIMARY> db.zips.count()
29353

ちゃんと移行できたようです。

まとめ

DocumentDBからの移行方法として、ダンプ取得による移行、DMSを使った移行を紹介しました。

サービス停止による静止点の確保が可能であれば、mongodump/mongorestoreを使った移行がシンプルですし、インデックスなども移行できるのでよいのではないでしょうか。DMSを使う場合には、CDCが使えることが最大の利点と言えるでしょう。