数据库迁移服务 DMS——手把手教你玩转 MongoDB 到 DynamoDB 之间数据库迁移

阅读数:19 2019 年 11 月 15 日 08:00

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

如下图所示:

数据库迁移服务DMS——手把手教你玩转MongoDB到DynamoDB之间数据库迁移

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 验证数据生成

运行如下命令:

数据库迁移服务DMS——手把手教你玩转MongoDB到DynamoDB之间数据库迁移

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

如下图:

数据库迁移服务DMS——手把手教你玩转MongoDB到DynamoDB之间数据库迁移B、登录到 mongodb 中,进行副本的初始化,如下图所示:

ubuntu@ip-172-31-60-214:~$ mongo localhost

MongoDB shell version: 2.6.12

connecting to: localhost

rs.initiate()

数据库迁移服务DMS——手把手教你玩转MongoDB到DynamoDB之间数据库迁移

C、验证部署配置

rs.conf()

数据库迁移服务DMS——手把手教你玩转MongoDB到DynamoDB之间数据库迁移

D、创建管理员角色

rs0:PRIMARY> use admin

switched to db admin

rs0:PRIMARY> db.createUser(

… {

… user: “root”,

… pwd: “rootpass”,

… roles: [ { role: “root”, db: “admin” } ]

… }

… )

如下图所示:

数据库迁移服务DMS——手把手教你玩转MongoDB到DynamoDB之间数据库迁移

E、停止 mongodb,然后重启 mongodb:

ubuntu@ip-172-31-60-214:~$ sudo mongod –dbpath /data –replSet rs0 –logpath /log/mongodb.log –smallfiles –oplogSize 50 -fork –auth

如下图所示:

数据库迁移服务DMS——手把手教你玩转MongoDB到DynamoDB之间数据库迁移

至此,Mongodb 的数据库准备工作完成。

3.5 使用 global 账号登录到 DMS 服务,如下图所示:

数据库迁移服务DMS——手把手教你玩转MongoDB到DynamoDB之间数据库迁移

A、创建复制实例:

指定 Name,Instance class,Allocated storage,VPC 选择创建,如下图所示:

数据库迁移服务DMS——手把手教你玩转MongoDB到DynamoDB之间数据库迁移

创建 mongodb 源端的 Endpoint,输入 Endpoint identifier,Source engine 指定为 mongodb,Servername 为 Mongodb 数据库主机 IP,Port,Authentication mode,username 等信息,如下所示:

数据库迁移服务DMS——手把手教你玩转MongoDB到DynamoDB之间数据库迁移

数据库迁移服务DMS——手把手教你玩转MongoDB到DynamoDB之间数据库迁移

注意在高级设置中指定 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

如下图所示:

数据库迁移服务DMS——手把手教你玩转MongoDB到DynamoDB之间数据库迁移

点击 test connection,验证成功,选择 create 完成创建。

此处主要角色的设置需要指定:dms-vpc-role,同时 attached 3 个 policy,如下图所示:

数据库迁移服务DMS——手把手教你玩转MongoDB到DynamoDB之间数据库迁移

endpoint 创建完成,如下所示:

数据库迁移服务DMS——手把手教你玩转MongoDB到DynamoDB之间数据库迁移

C、创建 task

点击 create task,输入如下信息:task name,source endpoint,target endpoint,migrate type,Enable loging,同时根据实际需求进行相应的任务设置。

创建 table mappings,点击 json tab,进行手动输入设置:

数据库迁移服务DMS——手把手教你玩转MongoDB到DynamoDB之间数据库迁移

数据库迁移服务DMS——手把手教你玩转MongoDB到DynamoDB之间数据库迁移

注意,json 文件内容需要根据各自创建的表进行手动创建。

数据库迁移服务DMS——手把手教你玩转MongoDB到DynamoDB之间数据库迁移

点击创建任务,任务创建完成。

D、验证数据导入成功

返回任务列表,选择 table statistics,查看表的导入是否成功,如下图所示:

数据库迁移服务DMS——手把手教你玩转MongoDB到DynamoDB之间数据库迁移

MongoDb 记录成功导入到 dynamodb 中,选择 log 可以通过 cloudwatch 查看 DMS 导入过程的记录。

登录到 DynamoDb 中,发现表成功创建,并且导入成功,如下图:

数据库迁移服务DMS——手把手教你玩转MongoDB到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}"

}

]

}

}

]

}

作者介绍

数据库迁移服务DMS——手把手教你玩转MongoDB到DynamoDB之间数据库迁移

王友升

AWS 解决方案架构师,拥有超过 13 年的 IT 从业经验,负责基于 AWS 的云计算方案架构咨询和设计,推广 AWS 云平台技术和各种解决方案。在加入 AWS 之前,曾在中地数码,浪潮,惠普等公司担任软件开发工程师,DBA 和解决方案架构师。在服务器,存储,数据库优化方面拥有多年的经验,同时对大数据,Openstack 及 AI 方面也进行一定的研究和积累。

本文转载自 AWS 技术博客。

原文链接:
https://amazonaws-china.com/cn/blogs/china/dms-mongodb-database-migration-dynamodb/

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

发布