利用 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 DMS 在线迁移 MongoDB 到 Amazon Aurora的更多相关文章
- 使用Apache Hudi + Amazon S3 + Amazon EMR + AWS DMS构建数据湖
1. 引入 数据湖使组织能够在更短的时间内利用多个源的数据,而不同角色用户可以以不同的方式协作和分析数据,从而实现更好.更快的决策.Amazon Simple Storage Service(amaz ...
- MongoDB副本集配置系列五:副本集的在线迁移
MongoDB副本集的在线迁移 查看当前集群的状态: { "setName" : "gechongrepl", "setVersion" : ...
- 一篇文章带你看懂AWS re:Invent 2018大会,揭秘Amazon Aurora
本文由云+社区发表 | 本文作者: 刘峰,腾讯云NewSQL数据库产品负责人.曾职于联想研究院,Teradata北京研发中心,从事数据库相关工作8年.2017年加入腾讯数据库产品中心,担任NewSQL ...
- 利用mysql-proxy 代理无法迁移数据库
一.什么是数据库迁移? 随着业务的增长或机器老化等原因,不可避免会碰到将数据库从一台机器迁移到另一台机器(集群)的问题.数据库迁移可分为冷迁(离线)和热迁(在线实时). 二.如何无缝迁移? 以旧库 1 ...
- 基于本地存储的kvm虚拟机在线迁移
基于本地存储的kvm虚拟机在线迁移 kvm虚拟机迁移分为4种(1)热迁移基于共享存储(2)热迁移基于本地存储(3)冷迁移基于共享存储(4)冷迁移基于本地存储 这里介绍的是基于本地存储的热迁移 动态块迁 ...
- Oracle 12C 新特性之表分区或子分区的在线迁移
Oracle 12c 中迁移表分区或子分区到不同的表空间不再需要复杂的过程.与之前版本中未分区表进行在线迁移类似,表分区或子分区可以在线或是离线迁移至一个不同的表空间.当指定了 ONLINE 语句,所 ...
- Redis Cluster高可用集群在线迁移操作记录【转】
之前介绍了redis cluster的结构及高可用集群部署过程,今天这里简单说下redis集群的迁移.由于之前的redis cluster集群环境部署的服务器性能有限,需要迁移到高配置的服务器上.考虑 ...
- OpenStack平台虚拟机实例在线迁移失败问题
一.在线迁移时提示如下的报错 二.原因分析 通过kolla-ansible部署queens版本时,因为OEM的机器设备的UUID记录的一致,导致迁移时识别的是自身机器的UUID,导致迁移失败 三.问题 ...
- Redis Cluster 4.0高可用集群安装、在线迁移操作记录
之前介绍了redis cluster的结构及高可用集群部署过程,今天这里简单说下redis集群的迁移.由于之前的redis cluster集群环境部署的服务器性能有限,需要迁移到高配置的服务器上.考虑 ...
随机推荐
- sublime3插件BracketHighlighter的配置
BracketHighlighter插件能为Sublime Text提供括号,引号这类高亮功能,但安装此插件后,默认没有高亮,只有下划线表示,不是很醒目,需要配置:1.在Sublime Text中用p ...
- git中ignore文件配置
在项目中我们有一些文件是不能公开的,或者说是每个人需要单独配置的,那么这个时候使用 git 就不能上传这些文件.此时就需要对 .gitignore 文件进行配置. git 的忽略原则:参考 廖雪峰的g ...
- HSA AMD异构计算架构
当前的CPU和GPU是分立设计的处理器,不能高效率地协同工作,编写同时运行于CPU和GPU的程序也是相当麻烦.由于CPU和GPU拥有独立的地址空间,应用程序不得不明确地控制数据在CPU和GPU之间的流 ...
- JavaScript 一些实用技巧
快速创建从0到n的数字 let arr1 = [...(new Array(n)).keys()]; let arr2 = Array.from({length:n},(v, k) => k); ...
- kali无法安装nvidia显卡驱动
按照各位大神的博客安装nvidia显卡驱动一直失败,重启之后无法正常进入系统,恢复模式可以进入,一直以为自己是不是哪里步骤不对,后面来回重装了几次系统. 最后意识到虚拟机里用的是虚拟网卡,并非宿主机的 ...
- | C语言I作业01
C语言I作业01 标签:18软件 李煦亮 1.1 你对软件工程专业了解是怎样? 对软件工程的了解是从人工智能频繁地出现在各大新闻,新闻报道了许多高校针对人工智能开设了相关课程或者专业,软件工程是开设的 ...
- redis的setIfAbsent
setIfAbsent(K key, V value) 如果键不存在则新增,存在则不改变已经有的值.
- zk脑裂
一.为什么zookeeper要部署基数台服务器?二.zookeeper脑裂(Split-Brain)问题2.1.什么是脑裂?2.2.什么原因导致的?2.2.zookeeper是如何解决的?一.为什么z ...
- asp.net core 日志记录到elk
关于ELK的安装大家可以参考ubuntu18 docker中部署ELK 和 caas/docker-elk , 首先需要在ELK中创建一个index patterns 首先我们创建一个aspnet ...
- Django 定义视图函数
Django 定义视图函数 一.接收内容及文件处理 1.接收分类 # 获取数据 request.GET # 提交数据 request.POST # 获取文件 request.FILES 2.check ...