亚马逊AWS官方博客

利用在线方案高效完成 Amazon DocumentDB 迁移

Original URL: https://amazonaws-china.com/cn/blogs/database/migrating-to-amazon-documentdb-with-the-online-method/

 

Amazon DocumentDB(兼容MongoDB)是一项快速、可扩展且可用性高的全托管文档数据库服务,能够全面支持MongoDB工作负载。您可以在Amazon DocumentDB之上直接使用与MongoDB 3.6完全相同的应用程序代码、驱动程序及工具,借此运行、管理并调整工作负载规模,而不必分神于底层基础设施的运营工作。作为一套文档数据库,Amazon DocumentDB让JSON数据的存储、查询以及索引变得更加简便易行。

从MongoDB迁移至Amazon DocumentDB,主要有三种方案可供选择:离线、在线与混合。若需了解更多细节信息,请参阅迁移至Amazon DocumentDB文档。

在本文中,我们将探讨如何利用在线方法将托管在本地设施或EC2实例中的自我管理MongoDB集群迁移至Amazon DocumentDB。在线方法能够最大程度减少停机时间,确保DMS得以持续从源MongoDB操作日志中读取oplog,由此产生的一切变更也将以近实时方式被应用于源Amazon DocumentDB集群。关于在线方法的具体演示,请参阅视频:面向Amazon DocumentDB进行实时迁移

如果您希望尽量缩短停机时间,而且源数据集相对较小(不超过1 TB),那么在线方法绝对是最佳选项。但如果您的数据集大于1 TB,则应考虑选择混合或离线方案,充分发挥由mongorestore带来的并行化与速度优势。关于离线迁移方法的更多细节信息,请参阅利用离线方法从MongoDB迁移至Amazon DocumentDB

本文将向大家介绍如何通过在线方法将数据从托管在Amazon EC2实例上的MongoDB副本集,迁移至Amazon DocumentDB集群当中。

先决条件

在着手迁移之前,请首先完成以下准备工作:

  1. 验证您的源版本与配置
  2. 设置并选定Amazon DocumentDB集群的大小
  3. 设置一个EC2实例

验证您的源版本与配置

如果您的MongoDB源使用的MongoDB版本低于3.6,则应首先升级源部署版本及应用驱动程序。只有将版本升级至MongoDB 3.6或更高,才能实现面向Amazon DocumentDB的正常迁移。您可以在mongo shell当中输入以下代码以确定源部署的当前版本:

mongoToDocumentDBOnlineSet1:PRIMARY> db.version()
3.4.4

另外,请验证源MongoDB集群(或实例)是否已经被配置为副本集。您可以使用以下代码以确定MongoDB集群是否被配置为副本集:

db.adminCommand( { replSetGetStatus : 1 } )

如果输出结果为类似于“”errmsg” : “not running with –replSet””的错误消息,则代表该集群尚未被配置为副本集。

设置并调整您的源Amazon DocumentDB集群大小

在本文的示例中,目标Amazon DocumentDB集群已经被设置为副本集,并运行在单一db.r5.large实例之上。当您对该集群进行大小调整时,可选择适合自身生产集群需求的实例类型。关于Amazon DocumentDB实例及成本的更多细节信息,请参阅Amazon DocumentDB(兼容MongoDB)服务计费说明

设置EC2实例

要连接到Amazon DocumentDB集群以迁移索引,并在迁移过程中执行其他任务,您需要在集群所处的同一VPC当中创建EC2实例,而后安装mongo shell。关于具体操作方法,请参阅Amazon DocumentDB入门教程。要验证与Amazon DocumentDB的连接是否正常,请输入以下CLI命令:

[ec2]$ mongo --ssl --host docdb-cluster-endpoint \
--sslCAFile rds-ca-2019-root.pem --username myuser \
--password mypassword
…
rs0:PRIMARY> db.runCommand('ping')

{ "ok" : 1 }

如果大家在接入源实例或者Amazon DocumentDB集群时遇到问题,请检查二者的安全组配置,以确保EC2实例有权限在正确的端口(默认为27017)上连接到它们。关于故障排查的更多细节信息,请参阅对Amazon DocumentDB进行故障排查。

Amazon DocumentDB使用传输层安全(TLS)加密。要经由TLS加密集合建立连接,您需要下载证书颁发机构(CA)文件以使用mongo shell进行连接,具体代码如下所示:

[ec2 ]$ curl -O https://s3.amazonaws.com/rds-downloads/rds-ca-2019-root.pem

您也可以禁用TLS协议。若需了解更多细节信息,请参阅加密传输数据。

在线迁移分步教程

以下示意图为在线迁移流程中的五个具体步骤,具体包括:

  1. 应用程序持续向源内写入
  2. 使用Amazon DocumentDB索引工具进行索引转储
  3. 使用Amazon DocumentDB索引工具还原索引
  4. 使用AWS DMS执行全数据加载与数据复制
  5. 将应用程序端点变更至Amazon DocumentDB集群

第一步:应用程序持续向源内写入

在利用在线方案向Amazon DocumentDB迁移时,您的应用程序将持续向源MongoDB数据库执行写入。第五步将具体探讨停止写入,并将应用程序指向变更至目标Amazon DocumentDB集群的方法。

第二步:使用Amazon DocumentDB索引工具进行索引转储

在开始迁移之前,您需要在目标Amazon DocumentDB集群上创建与源MongoDB集群相同的索引。尽管AWS DMS能够全面处理数据迁移,但索引的迁移仍然需要我们手动完成。要迁移这些索引,首先要求您创建新的EC2实例,而后使用Amazon DocumentDB索引工具将现有索引从MongoDB集群内导出。您可以直接从Amazon DocumentDB工具GitHub repo处克隆该工具,并按照README.md中的指示分步操作。

以下代码负责将源MongoDB集群中的索引转储至EC2实例上的指定目录(本文示例中的用户名与密码仅作演示用途,大家在实际操作中应注意保证密码强度):

python migrationtools/documentdb_index_tool.py --dump-indexes 
--dir ~/index.js/ 
--host ec2-user.us-west-2.compute.amazonaws.com 
--auth-db admin 
--username user
--password password
 
2020-02-11 21:46:50,432: Successfully authenticated to database: admin
2020-02-11 21:46:50,432: Successfully connected to instance ec2-user.us-west-2.compute.amazonaws.com:27017
2020-02-11 21:46:50,432: Retrieving indexes from server...
2020-02-11 21:46:50,440: Completed writing index metadata to local folder: /home/ec2-user/index.js/

索引导出成功之后,下一步工作是在您的Amazon DocumentDB集群内还原这些索引。

第三步:使用Amazon DocumentDB索引工具还原索引

要对上一步中导出至目标集群的索引进行还原,您需要使用Amazon DocumentDB索引工具。

以下代码可从EC2实例对Amazon DocumentDB集群进行索引还原:

python migrationtools/documentdb_index_tool.py --restore-indexes
--dir ~/index.js/ 
--host docdb-2x2x-02-02-19-07-xx.cluster-xxxxxxxx.us-west-2.docdb.amazonaws.com:27017
--tls --tls-ca-file ~/rds-ca-2019-root.pem 
--username user 
--password password
 
2020-02-11 21:51:23,245: Successfully authenticated to database: admin
2020-02-11 21:51:23,245: Successfully connected to instance docdb-2x2x-02-02-19-07-xx.cluster-xxxxxxxx.us-west-2.docdb.amazonaws.com:27017

2020-02-11 21:51:23,264: zips-db.zips: added index: _id

为了确认索引还原是否正确,请使用mongo shell接入Amazon DocumentDB集群并列出指定的索引集合,具体代码如下所示:

mongo --ssl
--host docdb-2020.cluster-xxxxxxxx.us-west-2.docdb.amazonaws.com:27017
--sslCAFile rds-ca-2019-root.pem --username documentdb --password documentdb
db.zips.getIndexes()

第四步:使用AWS DMS执行全数据加载与数据复制

AWS DMS是一项托管服务,用于帮助用户将数据库高效安全地迁移至AWS服务。AWS DMS通过两种方式实现数据库迁移:全数据加载与变更数据捕获(CDC)。这一在线迁移方案利用AWS DMS对全部数据进行复制,而后利用CDC将变更复制至Amazon DocumentDB。若需了解更多AWS DMS的使用方式信息,请参阅AWS数据库迁移服务分步教程

整个在线迁移流程分为以下几个步骤:

  • 创建一个AWS DMS复制实例。具体操作,请参阅AWS DMS复制实例使用指南。 在数据迁移当中,本文使用52.medium实例类型。AWS DMS利用该复制实例运行数据迁移任务,将来自MongoDB源的数据迁移至Amazon DocumentDB目标集群。 此外,AWS DMS可在最长六个月周期内为特定迁移目标提供特定类型的免费复制实例。关于更多细节信息,请参阅AWS数据库迁移服务:免费DMS
  • 创建MongoDB源与Amazon DocumentDB目标终端节点。关于更多细节信息,请参阅AWS DMS终端节点使用指南。 以下截图所示,为本文示例中MongoDB集群与目标Amazon DocumentDB集群的终端节点。
  • 创建一项复制任务,用于将数据从源端点迁移至目标终端节点。
    • 将任务类型选定为“Full data load followed by ongoing data replication”(在数据复制完成后加载全部数据)。
    • 在创建时启用“Start task”(启动任务)选项。 在任务创建后,复制过程会立即开始。以下截图展示了数据库迁移任务的当前状态,可以看到任务已经完成全部加载,且当前正在执行持续复制。如果您选定其中的mongodbtodocumentbd-online-fullandongoing任务,即可查看更多细节信息。在“Table statistics”(表统计信息)部分可查看完整的数据负载统计信息,以及源与目标数据库之间的当前复制进度,具体请参阅以下截图。 要验证双方的文档数量是否匹配,您可在源数据库与目标数据库当中分别运行db.collection.count()命令。 您也可以通过Amazon CloudWatch指标查看迁移状态,并创建相应仪表板以显示迁移进度。以下截图所示为来自源数据库的CDC变更传入速率。

第五步:将应用程序端点变更至Amazon DocumentDB集群

在数据全部加载完成且CDC流程开始持续复制之后,您就可以变更应用程序中的数据库连接字符串以实际使用新的Amazon DocumentDB集群了。关于更多细节信息,请参阅了解Amazon DocumentDB端点Amazon DocumentDB最佳实践

总结

本文介绍了如何使用在线方法将数据从MongoDB迁移至Amazon DocumentDB。若需了解更多细节信息,请参阅使用离线方法从MongoDB迁移至Amazon DocumentDB,以及在Amazon DocumentDB(兼容MongoDB)上直接迁移

如果您有任何疑问或者建议,请在下方评论中表达您的观点。

 


本篇作者

Vijay Injam

Amazon Web Services公司NoSQL数据架构师。

Jeff Duffy

Amazon Web Services公司NoSQL专业高级经理,专注于Amazon DocumentDB相关事务。

Joseph Idziorek

Amazon Web Services公司首席产品经理。