亚马逊AWS官方博客
数据库迁移服务DMS——手把手教你玩转MongoDB到DynamoDB之间数据库迁移
1. 前言
AWS最近刚刚宣布了一项关于数据库迁移的新feature,支持Mongodb数据库作为源端,迁移到目标端Dynamodb中,这样可以使MongoDB的用户充分利用DynamoDB数据库提供的技术优势,譬如完全托管服务,高性能低延迟(毫秒级),精细化粒度控制等等。由于最近项目中涉及很多数据库迁移的事情,同时也对NOSQL数据库异构平台迁移非常感兴趣,写了这篇文档供大家参考。
2. DMS服务介绍
DMS作为数据迁移服务支持下面三种迁移类型:
- 迁移源库中存在的数据到目标库
- 迁移源库中存在的数据并且复制新增加的数据到目标库
- 只复制新增加的数据库
数据迁移时源端和目标端设置
- MongoDB作为源端
AWS DMS支持Mongodb作为源端的版本为2.6.x和3.0.x,MongoDB 作为一个基于文档存储的数据库,数据模式非常灵活,支持JSON和BJSON格式进行存储。当前AWS DMS 支持MongoDB作为源端以两种模式进行迁移,它们分别是文档模式和表模式。在文档模式中,需要设置参数extractDocID=true和nestingLevel=none,在复制时不支持collection的重命名。在表模式中需要启用表模式需要设置nestingLevel=one,另外在选择CDC时它不支持添加新的collection和重名collection。
- DynamoDB作为目标端
使用Dynamodb作为目标端时需要配置partion key和Object mapping。
具体注意事项请参考官方文档链接:
http://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.MongoDB.html
3. 配置步骤
3.1 安装Mongodb
安装Mongodb的方式有多种方法,可以选择Marketplace或者AWS提供的cloudformation以及手动下载Mongodb软件进行安装,我选择手动安装Mongodb2.6.12版本。
A、登录EC2,获取如下软件:
ubuntu@ip-172-31-60-214:~$ wget http://downloads-distro.mongodb.org/repo/ubuntu-upstart/dists/dist/10gen/binary-amd64/mongodb-org_2.6.12_amd64.deb
ubuntu@ip-172-31-60-214:~$ wget http://downloads-distro.mongodb.org/repo/ubuntu-upstart/dists/dist/10gen/binary-amd64/mongodb-org-mongos_2.6.12_amd64.deb
ubuntu@ip-172-31-60-214:~$ wget http://downloads-distro.mongodb.org/repo/ubuntu-upstart/dists/dist/10gen/binary-amd64/mongodb-org-tools_2.6.12_amd64.deb
ubuntu@ip-172-31-60-214:~$ wget http://downloads-distro.mongodb.org/repo/ubuntu-upstart/dists/dist/10gen/binary-amd64/mongodb-org-server_2.6.12_amd64.deb
ubuntu@ip-172-31-60-214:~$ wget http://downloads-distro.mongodb.org/repo/ubuntu-upstart/dists/dist/10gen/binary-amd64/mongodb-org-shell_2.6.12_amd64.deb
B、安装软件包:
ubuntu@ip-172-31-60-214:~$ sudo dpkg -i mongodb-org*
C、创建数据目录和日志目录:
ubuntu@ip-172-31-60-214:~$ sudo mkdir /data /log
D、启动mongodb数据库服务:
ubuntu@ip-172-31-60-214:~$ sudo mongod –dbpath /data –logpath /log/mongodb.log –smallfiles –oplogSize 50 –fork
打开mongodb的shell, 验证服务启动成功。
ubuntu@ip-172-31-60-214:~$ mongo
MongoDB shell version: 2.6.12
connecting to: test
如下图所示:
3.2 通过脚本生成数据
for (var i = 1; i <= 793308; i++) {
db.testData.insert( { x : i , name: "MACLEAN" , name1:"MACLEAN", name2:"MACLEAN", name3:"MACLEAN"} )
db.contacts.insert( { name: "Amanda", status:
"Updated" } )
db.contacts.insert( { name: "tom", status: "Updated" } )
db.contacts.insert( { name: "jack", status: "Updated" } )
db.contacts.insert( { name: "jack1", status: "Updated" } )
db.contacts.insert( { name: "steph", status: "Updated" } )
3.3 验证数据生成
运行如下命令:
3.4配置mongodb的副本集
A、启动mongodb数据库
ubuntu@ip-172-31-60-214:~$ sudo mongod –dbpath /data –replSet rs0 –logpath /log/mongodb.log –smallfiles –oplogSize 50 -fork
如下图:
B、登录到mongodb中,进行副本的初始化,如下图所示:
ubuntu@ip-172-31-60-214:~$ mongo localhost
MongoDB shell version: 2.6.12
connecting to: localhost
>
rs.initiate()
C、验证部署配置
> rs.conf()
D、创建管理员角色
rs0:PRIMARY> use admin
switched to db admin
rs0:PRIMARY> db.createUser(
… {
… user: “root”,
… pwd: “rootpass”,
… roles: [ { role: “root”, db: “admin” } ]
… }
… )
如下图所示:
E、停止mongodb,然后重启mongodb:
ubuntu@ip-172-31-60-214:~$ sudo mongod –dbpath /data –replSet rs0 –logpath /log/mongodb.log –smallfiles –oplogSize 50 -fork –auth
如下图所示:
至此,Mongodb的数据库准备工作完成。
3.5 使用global账号登录到DMS服务,如下图所示:
A、创建复制实例:
指定Name,Instance class,Allocated storage,VPC选择创建,如下图所示:
创建mongodb源端的Endpoint,输入Endpoint identifier,Source engine指定为mongodb,Servername为Mongodb数据库主机IP,Port,Authentication mode,username等信息,如下所示:
注意在高级设置中指定extraDocID=true;nestingLevel=none
点击test connection验证连接成功。
点击创建完成。
B、创建目标端DynamoDB的endpoint
在endpoint console中选择create endpoint,并输入信息:Endpoint identifier,Endpoint type为Target,Target engine为dynamodb,指定Service Aceess Role ARN,并在advanced中设置:extractDOcID=true;nestingLevel=none
如下图所示:
点击test connection,验证成功,选择create 完成创建。
此处主要角色的设置需要指定:dms-vpc-role,同时attached 3个policy,如下图所示:
endpoint创建完成,如下所示:
C、创建task
点击create task,输入如下信息:task name,source endpoint,target endpoint,migrate type,Enable loging,同时根据实际需求进行相应的任务设置。
创建table mappings,点击json tab,进行手动输入设置:
注意,json文件内容需要根据各自创建的表进行手动创建。
点击创建任务,任务创建完成。
D、验证数据导入成功
返回任务列表,选择table statistics,查看表的导入是否成功,如下图所示:
MongoDb记录成功导入到dynamodb中,选择log可以通过cloudwatch查看DMS导入过程的记录。
登录到DynamoDb中,发现表成功创建,并且导入成功,如下图:
至此整个利用DMS进行Mongodb到Dynamodb的数据库迁移完成。
关于如何设置Table mapping 请参阅官方文档:
http://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.DynamoDB.html
附录
测试中我使用的Table Mapping json内容如下:
{
"rules": [
{
"rule-type": "selection",
"rule-id": "1",
"rule-name": "1",
"object-locator": {
"schema-name": "test",
"table-name": "%"
},
"rule-action": "include"
},
{
"rule-type": "object-mapping",
"rule-id": "2",
"rule-name": "TransformToDDB",
"rule-action": "map-record-to-record",
"object-locator": {
"schema-name": "test",
"table-name": "contacts"
},
"target-table-name": "contacts",
"mapping-parameters": {
"partition-key-name": "id",
"exclude-columns": [
"_id"
],
"attribute-mappings":[
{
"target-attribute-name": "id",
"attribute-type":"scalar",
"attribute-sub-type":"string",
"value": "${_id}"
}
]
}
},
{
"rule-type": "object-mapping",
"rule-id": "3",
"rule-name": "TransformToinventory",
"rule-action": "map-record-to-record",
"object-locator": {
"schema-name": "test",
"table-name": "inventory"
},
"target-table-name": "inventory",
"mapping-parameters": {
"partition-key-name": "id",
"exclude-columns": [
"_id"
],
"attribute-mappings":[
{
"target-attribute-name": "id",
"attribute-type":"scalar",
"attribute-sub-type":"string",
"value": "${_id}"
}
]
}
},
{
"rule-type": "object-mapping",
"rule-id": "2",
"rule-name": "TransformToEC2test",
"rule-action": "map-record-to-record",
"object-locator": {
"schema-name": "test",
"table-name": "ec2Test"
},
"target-table-name": "ec2Test",
"mapping-parameters": {
"partition-key-name": "id",
"exclude-columns": [
"_id"
],
"attribute-mappings":[
{
"target-attribute-name": "id",
"attribute-type":"scalar",
"attribute-sub-type":"string",
"value": "${_id}"
}
]
}
},
{
"rule-type": "object-mapping",
"rule-id": "2",
"rule-name": "TransformToDDB",
"rule-action": "map-record-to-record",
"object-locator": {
"schema-name": "test",
"table-name": "testData"
},
"target-table-name": "testData",
"mapping-parameters": {
"partition-key-name": "id",
"exclude-columns": [
"_id"
],
"attribute-mappings":[
{
"target-attribute-name": "id",
"attribute-type":"scalar",
"attribute-sub-type":"string",
"value": "${_id}"
}
]
}
}
]
}
作者介绍
王友升
AWS解决方案架构师,拥有超过13年的IT从业经验,负责基于AWS的云计算方案架构咨询和设计,推广AWS云平台技术和各种解决方案。在加入AWS之前,曾在中地数码,浪潮,惠普等公司担任软件开发工程师,DBA和解决方案架构师。在服务器,存储,数据库优化方面拥有多年的经验,同时对大数据,Openstack及AI方面也进行一定的研究和积累。