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 方面也进行一定的研究和积累。
本文转载自 AWS 技术博客。
原文链接:
https://amazonaws-china.com/cn/blogs/china/dms-mongodb-database-migration-dynamodb/
活动推荐:
2023年9月3-5日,「QCon全球软件开发大会·北京站」 将在北京•富力万丽酒店举办。此次大会以「启航·AIGC软件工程变革」为主题,策划了大前端融合提效、大模型应用落地、面向 AI 的存储、AIGC 浪潮下的研发效能提升、LLMOps、异构算力、微服务架构治理、业务安全技术、构建未来软件的编程语言、FinOps 等近30个精彩专题。咨询购票可联系票务经理 18514549229(微信同手机号)。
评论