利用 AWS DMS 在线迁移 MongoDB 到 Amazon Aurora

2019 年 9 月 25 日

利用 AWS DMS 在线迁移 MongoDB 到 Amazon Aurora

将数据从一种数据库迁移到另一种数据库通常都非常具有挑战性,特别是考虑到数据一致性、应用停机时间、以及源和目标数据库在设计上的差异性等因素。这个过程中,运维人员通常都希望借助于专门的数据迁移(复制)工具来降低操作的复杂性和对业务的影响。AWS 数据迁移服务(AWS DMS)可帮助 AWS 用户快速、安全、无缝地将 MongoDB、Oracle、MySQL 和 Microsoft SQL Server 等数据库迁移到 AWS。 源数据库在迁移期间仍然可以运行,因此最大程度地减少了依赖于数据库的应用程序的停机时间。

MongoDB 是一个流行的跨平台的面向文档的 NoSQL 数据库,拥有非常多的应用场景和很大的用户群体。但是某些情况下用户需要将 MongoDB 迁移或者复制到关系数据库,比如将文档数据从 MongoDB 复制到 MySQL 来进行复杂关连分析处理,或者由于在数据库选型方面分析不够,错选了数据库类型而需要迁移到关系数据库。

在本文中,我们将讨论将 MongoDB 4.0 数据平滑迁移到 Amazon Aurora MySQL 兼容版的方法。Amazon Aurora 是一种与 MySQL 和 PostgreSQL 兼容的关系数据库,专为云而打造,既具有传统企业数据库的性能和可用性,又具有开源数据库的简单性和成本效益。本文中描述的方法使用 AWS DMS 转换源数据,近乎零停机时间来执行迁移。

设置 MongoDB 4.0 源数据库

安装并配置MongoDB 4.0 ,然后将standalone 的MongoDB 转换成replica set(rs),因为我们要进行的是full load + CDC 的复制,DMS 需要访问MongoDB 的操作日志(oplog),为了创建oplog,需要部署一个rs。

1. 配置 yum,创建 /etc/yum.repos.d/mongodb-org-4.0.repo,以便直接使用 yum 安装 MongoDB:

复制代码
[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc

2. 安装 MongoDB 包

复制代码
sudo yum install -y mongodb-org

3. 配置 bindIP,MongoDB server 默认只允许 loopback 连接,为了允许从 VPC 或者 internet 连接,做以下设置:

a. 编辑 /etc/mongod.conf 文件,找到以下行:

复制代码
# network interfaces
net:
port: 27017
bindIp: 127.0.0.1 # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.

b. 修改 bindIP 为 ec2 实例的 public IP 或者 private IP:

复制代码
bindIp: x.x.x.x

c. 保存 /etc/mongod.conf 文件,重启 mongod:

复制代码
sudo service mongod restart

4.将standalone 的MongoDB 转成replica set:

a. 关闭 mongod 服务

复制代码
service mongod stop

b. 重启 mongod:

复制代码
mongod --port 27017 --dbpath /srv/mongodb/db0 --replSet rs0 --bind_ip localhost,<hostname(s)|ip address(es)>

用 hostname 和 ip 地址替换以上参数
c. 用 mongo shell 连接 mongod:

复制代码
mongo --host rs0/x.x.x.x:27017

d. 用 initate() 初始化新的 replica set

5. 向 MongoDB 里导入数据:

a. 使用 wget 命令下载包含样例数据的 Json 文件

复制代码
wget http://media.mongodb.org/zips.json

b. 使用 mongoimport 命令导入数据到一个新的数据库(zipsdb)

复制代码
mongoimport --host rs0/x.x.x.x:27017 --db zipsdb --file zips.json

c. 检查导入的数据:

复制代码
mongo --host rs0/x.x.x.x:27017
show dbs
use zipsdb
db.zips.count()

到此为止,我们成功安装了 MongoDB 4.0 社区版,设置了 replica set 为 CDC 做准备,并且导入了测试数据到 zipsdb 数据库,数据库中有一个名为 zips 的 collection。

在 AWS 账号下启动一个 Aurora 集群,作为目标数据库

通过 AWS 控制台 launch 一个 Aurora MySQL 集群,具体参考创建数据库集群

利用 DMS 进行 MongoDB 在线迁移

将 MongoDB 用作源时,AWS DMS 支持两种迁移模式。用 AWS 管理控制台通过 Metadata mode (元数据模式) 参数指定迁移模式,或在创建 MongoDB 终端节点时指定额外的连接属性 nestingLevel。所选的迁移模式将影响目标数据的结果格式,如下所述。

文档模式:

在文档模式下,MongoDB 文档按“原样”迁移,这意味着文档数据将并入目标表中一个名为 _doc 的列中。文档模式是您将 MongoDB 用作源终端节点时的默认设置。

表模式:

在表模式中,AWS DMS 将 MongoDB 文档中的每个顶级字段转换为目标表中的一个列。如果有嵌套字段,则 AWS DMS 会将嵌套值平展到单个列中。随后,AWS DMS 将关键字段和数据类型添加到目标表的列集。

本文中使用表模式进行迁移,架构示意如下:

创建复制实例

AWS DMS 使用复制实例连接到源数据存储,读取源数据并设置数据格式以供目标数据存储使用。复制实例还会将数据加载到目标数据存储中。

AWS DMS 始终在基于 Amazon Virtual Private Cloud (Amazon VPC) 的 VPC 中创建复制实例。您可以指定复制实例所在的 VPC。可以使用您账户和 AWS 区域的默认 VPC,也可以创建新的 VPC。源和目标终端节点连接到 VPC 或者位于 VPC 内部,以此来访问位于 VPC 内部的复制实例。本文中源、目标数据库和复制实例在一个 VPC 内部,因此可以使用 private IP 连接。实例配置如下,可以根据 task 的大小选择合适的实例类型,对于重要的任务也可以使用 Multi AZ 部署方式。

以下屏幕截图是创建复制实例的示例:

创建源 MongoDB endpoint

以下屏幕截图创建一个源 endpoint 指向前面创建的 replica set 中的 zipsdb,Metadata mode 设置为 table。

创建目标 Aurora endpoint

以下屏幕截图创建了一个 target 类型的 endpoint,指向 Aurora 集群的 writer 节点。

创建迁移任务

创建 DMS 迁移任务,指定源端点为前面创建的源 MongoDB 端点“mongo-rs”,任务类型为“migrating existing data and replicate ongoning changes”,打开 cloudwatch 日志便于诊断任务执行情况。

在 Table mappings 部分,选通过 selection rules 设置需要复制的 schema 和 table,在 transformation rules 里设置如何改变/转换 schema,table 或者 column。在下面任务设置截图里,通过 selection rules,选择将源 MongoDB 里的 zipsdb.zips 表箱目标 Aurora 库里复制。

跟踪任务运行情况

Full load
任务启动之后很快进入“Load complete,replication ongoing”状态,表示完成了 full load,进入持续复制阶段。

以上屏幕截图显示当前已经完成了 29353 行数据的 full load。让我们在源、目标端验证一下。

源端记录总数:

目标端复制后的 database 和 table,以及记录总数:

经过 full load 之后,目标端 Aurora 中已经复制了 MongoDB 的 database 和 collection 到相应的 database 和 table,一条 document 对应 zips 表里的一行。

CDC
在源 MongoDB 我们进行以下 CRUD 操作,然后在目标端 Aurora MySQL 确认同步情况。

1. 新增一条记录到 zips 表:

在 Aurora 检查该文档复制情况:

2. 在 MongoDB 更新该文档:

在目标端 Aurora MySQL 确认同步情况:

3. 在源端 delete 该文档:

在目标端 MySQL 表中确认记录删除:

DMS 任务复制统计数据

可以发现,源端所做的 DML(2 Insert,2 Deletes,2 Updates)已经被实时捕获并复制到目标端。

总结

本文我们讨论了使用 AWS DMS 进行连续数据捕获(CDC)近乎实时的复制最新版本的 MongoDB 4.0 的文档数据到 Aurora MySQL 兼容版的表中。截至目前 AWS DMS 官方文档中虽然声明只支持 MongoDB 2.6.x 和 3.x,但是本文的演示证明 AWS DMS 对 MongoDB 4.0 也是完美支持的。如果有复杂的关连分析需求,使用 DMS 将 MongoDB 的文档实时复制到 Aurora MySQL 将使您可以借助关系数据库弥补 MongoDB 在这个方面的不足,亦或者您需要在 MongoDB 向关系数据库迁移的过程中保持业务系统在线,尽可能降低停机时间,DMS 的 CDC 功能可让您的迁移过程举重若轻。

作者介绍:

汪允璋
AWS 解决方案架构师。负责基于 AWS 的云计算方案架构的咨询和设计,致力于 AWS 云服务在国内和全球的应用和推广,目前主攻数据库和大数据方面的研究。在加入 AWS 前,拥有多年外企售前及运营商 IT 架构、运维经验。

本文转载自 AWS 技术博客。

原文链接:
https://amazonaws-china.com/cn/blogs/china/use-aws-dms-mongodb-amazon-aurora/

2019 年 9 月 25 日 17:08 166
用户头像

发布了 1167 篇内容, 共 19.0 次阅读, 收获喜欢 9 次。

关注

评论

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

CAP

Kiroro

架构师训练营第六周作业

王铭铭

猿灯塔:spring Boot Starter开发及源码刨析(六)

猿灯塔

架构师训练营第六周总结

王铭铭

喜讯!众盟科技获ADMIC 2020金璨奖“年度汽车数字化营销供应商”殊荣

人称T客

CAP

东哥

CAP

第六章总结

武鹏

Doris临时失效处理过程的UML时序图

周冬辉

Kafka 是如何建模数据的?

tison

大数据 kafka

聊聊服务灾备

老胡爱分享

分布式架构 服务设计

「架构师训练营」第 6 周作业 - 总结

森林

「架构师训练营」第 6 周作业 - CAP

森林

第六周作业

Larry

架构师训练营第六周学习总结

whiter

极客大学架构师训练营

架构学习第六周作业

乐天

华为云MVP朱有鹏:做IoT开发乐趣无穷,年轻开发者更要厚积薄发

华为云开发者社区

人工智能 物联网中台 物联网 IoT 华为云

聊聊Dubbo(一):为何选择

猿灯塔

总结

Kiroro

架构师训练营」第 6 周作业

edd

极客大学架构师训练营

简述 CAP 原理

柳旭

解析软件系统稳定性的三大秘密

华为云开发者社区

开发者 软件开发 稳定性 系统 探索与实践

分布式RDBMS和NoSQL

LEAF

【架构师训练营】第六周总结

Mr.hou

极客大学架构师训练营

CAP原理简介

elfkingw

架构师训练营第6周总结:数据库分片,Hbase和ZooKeeper

hifly

zookeeper Cassandra 极客大学架构师训练营 HBase

第六章作业

武鹏

详解 Flink 实时应用的确定性

Apache Flink

flink

架构师训练营第六周命题作业

whiter

极客大学架构师训练营

Week06

熊威

分布式KV存储临时失效时序图

LEAF

缓存穿透、缓存击穿、缓存雪崩,看这篇就够了

码农神说

缓存 缓存穿透 缓存击穿 缓存雪崩 数据缓存

利用 AWS DMS 在线迁移 MongoDB 到 Amazon Aurora-InfoQ