この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、菊池です。
先日登場したAmazon DocumentDBをいろいろと触っています。
- [速報] MongoDB 互換のマネージドデータベース!Amazon DocumentDB が登場しました
- [AWS] DocumentDB 詳細解説:クラスターの作成と設定項目
- [AWS] DocumentDB 詳細解説:MongoDB との違いを理解する
今回は、既存の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が使えることが最大の利点と言えるでしょう。