InfoQ Geekathon 大模型技术应用创新大赛 了解详情
写点什么

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

  • 2019-11-15
  • 本文字数:0 字

    阅读完需:约 1 分钟

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(微信同手机号)。

2019-11-15 08:00584

评论

发布
暂无评论
发现更多内容

GitHub爆火!银四巨作:拼多多/蚂蚁/百度面经分享

比伯

Java 架构 面试 程序人生 技术宅

基于Vue和Quasar的前端SPA项目crudapi后台管理系统实战之布局菜单嵌套路由(三)

crudapi

Vue crud crudapi quasar 路由

初窥Ray框架

行者AI

深度学习

以太坊杀手?NA公链(Nirvana)Chain忠于挑战自己NAC公链

区块链第一资讯

500+解决方案已搭载,英特尔新至强出道不含糊

E科讯

[知识它]一篇文章或一本书是怎么写出来的

知识它

写作技巧 写文章 快速写作 写作方法

翻译:《实用的Python编程》08_00_Overview

codists

Python

飞桨框架2.0正式版重磅发布,一次端到端的“基础设施”革新

百度开发者中心

HugeGraph图数据库获Apache TinkerPop官方认证

百度开发者中心

华云大咖说 | 华云数据与海量数据携手共建国产云生态

华云数据

阿里最强 Python 自动化工具开源了!

星安果

Python 开源 自动化 阿里

关于机器学习的十大常见问题

澳鹏Appen

人工智能 机器学习 深度学习 大数据 数据

Javascript执行机制-任务队列

Sakura

为什么很多SaaS叫好不叫座?

ToB行业头条

SaaS tob

乡村振兴:AI+乡村的下一个命题

百度开发者中心

软件测试面试题【2021模拟面试整理版(含答案)】

程序员阿沐

面试 软件测试

「开源」首次被列入“十四五”规划,未来大有可为

百度开发者中心

Python实现植物大战僵尸

不脱发的程序猿

Python GitHub 开源 游戏开发 4月日更

Redis 客户端服务端命令数据交换

escray

redis 学习 极客时间 Redis 核心技术与实战 4月日更

中间件技术在百度云原生测试中的应用实践

百度开发者中心

中间件

San介绍以及在百度APP的实践

百度开发者中心

正点原子:STM32F103(战舰)、STM32F407(探索者)、STM32F103(MINI)原理图和PCB

不脱发的程序猿

开发板 stm32 硬件设计 4月日更 正点原子

大牛荐书 | 百度技术大牛都在读的7本书!

百度开发者中心

纹理打包器TexturePacker

空城机

UI 4月日更 Texture Packer 纹理打包器 pixi

为什么主动跨数据复制在5G时代非常重要?

VoltDB

数据分析 5G VoltDB 电信

阿里最新发布Spring Cloud ALiBaBa全解第三版开源!

Java架构追梦

Java 阿里巴巴 架构 面试 SpringCloud Alibaba

百度应用部署秘籍

百度开发者中心

开放原子超级链动态内核上线,十分钟可搭建一条区块链

百度开发者中心

kubectl top node报错及解决

箭上有毒

iOS 面试策略之算法基础1-3节

iOSer

ios 面试 算法 iOS算法

架构可视化支撑系统演进探索

华为云开发者联盟

架构 软件系统 架构可视化 辅助系统 架构可视化辅助系统

  • 扫码添加小助手
    领取最新资料包
数据库迁移服务DMS——手把手教你玩转MongoDB到DynamoDB之间数据库迁移_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章