身兼数职的Amazon DocumentDB,还有什么不为人知的功能?

Amazon DocumentDB(兼容MongoDB)是一项快速、可扩展、具备高可用性的全托管文档数据库服务,可支持MongoDB工作负载。今天,我们宣布Amazon DocumentDB正式获得MongoDB 4.0兼容能力。通过此次升级,现在您可以使用原子性、一致性、隔离性与持久性(ACID)事务,为数据库或集群打开变更流游标等等。关于Amazon DocumentDB 4.0的完整发行版说明,请参阅MongoDB 4.0兼容性

在本文中,我们将共同了解Amazon DocumentDB 4.0当中的新增功能,并向您展示如何在Amazon Cloud9环境之上使用Amazon DocumentDB 4.0及事务

想要了解更多亚马逊云科技最新技术发布和实践创新,敬请关注在上海、北京、深圳三地举办的2021亚马逊云科技中国峰会!点击图片报名吧~

Amazon DocumentDB 4.0中的新特性

以下是Amazon DocumentDB 4.0引入的各项主要功能特性。要查看新功能的完整列表,请参阅MongoDB 4.0兼容性

ACID事务–Amazon DocumentDB现可支持跨多个文档、语句、集合及数据库执行事务。事务支持使您能够跨Amazon DocumentDB集群内的一个或多个文档执行ACID操作,从而简化应用开发流程。关于更多详细信息,请参阅事务

1.变更流–现在,您可以在集群层级 (client.watch()或 mongo.watch()) 或者数据库层级(db.watch())开启变更流。您也可以指定一个 startAtOperationTime以打开变更流游标,并将变更流的保留周期延长至7天(之前最多为24小时)。关于更多详细信息,请参阅在Amazon DocumentDB上使用变更流

2.Amazon DMS–现在,您可以使用Amazon Database Migration Service (Amazon DMS)将MongoDB 4.0工作负载迁移至Amazon DocumentDB 4.0。Amazon DMS现可支持以MongoDB 4.0为源、以Amazon DocumentDB 4.0为目标,并可以Amazon DocumentDB 3.6为源完成由3.6版本到4.0版本的升级。关于更多详细信息,请参阅 将Amazon DocumentDB 作为Amazon Database Migration Service的目标

3.监控–通过添加事务,现在您可以使用五项新的Amazon CloudWatch指标:

TransactionsOpen, TransactionsOpenMax, TransactionsAborted, TransactionsStarted 以及 TransactionsCommitted, 外加 currentOp, ServerStatus与 profiler等新字段。关于更多详细信息,请参阅使用Amazon CloudWatch监控Amazon DocumentDB

4.性能与索引–新版本中还包含多项性能与索引改进:可在 $lookup聚合阶段使用索引、可直接由索引(所涉及查询)提供带有投射的find()查询、可通过findAndModify API使用hint()、对$addToSet操作符做出性能优化,同时改进并缩小了总体索引大小。关于更多详细信息,请参阅发布说明

5.操作符–我们增加了对以下新聚合操作符的支持: $ifNull, $replaceRoot, $setIsSubset, $setInstersection, $setUnion以及 $setEquals。关于更多详细信息,请参阅支持的MongoDB API、操作与数据类型

6.基于角色的访问控制(RBAC)–使用ListCollection与ListDatabase命令,您现在可以选择使用authorizedCollections与authorizedDatabases参数以允许用户列出其有权访问的集合与数据库,因此不再需要为此分别使用listCollections与listDatabase角色。用户还可以直接结束自己的游标,无需使用KillCursor角色。关于更多详细信息,请参阅使用基于角色的访问控制(内置角色)限制数据库访问行为

Amazon DocumentDB4.0与事务入门指南

第一步是在您的默认Amazon Virtual Private Cloud(Amazon VPC)当中创建一个Amazon Cloud9环境外加一套Amazon DocumentDB集群。关于创建默认VPC的操作说明,请参阅Amazon VPC入门指南。本文将演示如何使用mongo shell从Amazon Cloud9环境接入Amazon DocumentDB集群并运行事务。在创建Amazon资源时,我们建议您遵循Amazon身份与访问管理(IAM)最佳实践。

下图所示,为本演练中的最终架构。

身兼数职的Amazon DocumentDB,还有什么不为人知的功能?_第1张图片

在本演练中,请使用特定区域内的默认VPC。关于更多详细信息,请参阅创建Virtual Private Cloud (VPC)

创建Amazon Cloud9环境

要创建Amazon Cloud9环境,请完成以下操作步骤:

1.在Amazon Cloud9控制台上,选择 Create environment。

2.在Environment name and description之下的 Name部分,为环境输入名称。本文将环境命名为Amazon DocumentDB Cloud9。

3.选择Next step。

4.在Configure settings部分,直接使用全部默认选项。

5.选择Next step。

6.在Review部分, 选择Create environment。

Amazon Cloud9环境的置备最多可能需要3分钟。在完成之后,您会看到以下命令提示符。

您将被重新定向至命令提示符,在这里安装mongo shell并接入Amazon DocumentDB集群。

创建安全组

在此步骤中,您将使用Amazon Elastic Compute Cloud(Amazon EC2)创建一个新的安全组,借此从Amazon Cloud9环境中的端口27017(Amazon DocumentDB的默认端口)连接至Amazon DocumentDB集群。

1.在Amazon EC2控制台的Network & Security之下, 选择Security groups。

2.选择Create security group。

3.在Security group name部分,输入demoDocDB。

4.在 VPC部分,接受使用您的默认VPC。

5.在Description部分,输入相应描述。

6.在Inbound rules部分, 选择Add rule。

7.在Type部分, 选择Custom TCP Rule。

8.在Port Range部分,输入27017。源安全组为您刚刚为Amazon Cloud9环境创建的安全组。

9.要查看可用安全组列表,请在目标字段内输入cloud9。

10.选择名称为amazon-cloud9-的安全组。

11.接受所有默认选项,而后选择Create security group。

下图所示,为您在此步骤中创建的安全组,以及在创建Amazon Cloud9环境时创建的Amazon Cloud9安全组。

身兼数职的Amazon DocumentDB,还有什么不为人知的功能?_第2张图片

创建一套 Amazon DocumentDB 4.0集群

要创建您的Amazon DocumentDB 4.0集群,请完成以下操作步骤:

1.在Amazon DocumentDB控制台上的Clusters页面中,选择Create。

2.在Engine version部分, 选择默认版本 (4.0.0)。

3.在Create Amazon DocumentDB cluster页面的Instance class部分, 选择 t3.medium。

4.在Number of instances部分, 选择1。用于将成本控制在最低水平。

5.其他设置全部保留为默认选项。

6.在Authentication部分,输入用户名与密码。

7.开启Show advanced settings。

8.在Network settings部分的VPC security groups当中, 选择demoDocDB。

身兼数职的Amazon DocumentDB,还有什么不为人知的功能?_第3张图片

9.选择Create cluster。

Amazon DocumentDB现在开始配置您的集群,这可能需要几分钟才能完成。当集群与实例状态皆显示为Available时,您即可接入该集群。在Amazon DocumentDB设置集群的过程中,请完成剩余步骤以接入Amazon DocumentDB集群。

安装4.0 mongo shell

现在,您可以安装mongo shell,并使用这款命令行实用工具接入并查询您的Amazon DocumentDB集群。

1.在Amazon Cloud9r控制台的Your environments之下, 选择Amazon DocumentDBCloud9。选择Open IDE。

2.要安装4.0 mongo shell,请在命令提示符中使用以下命令创建repo文件:echo -e “[mongodb-org-4.0] \nname=MongoDB Repository\nbaseurl=https://repo.mongodb.org/yum/...\ngpgcheck=1 \nenabled=1 \ngpgkey=https://www.mongodb.org/stati...” | sudo tee /etc/yum.repos.d/mongodb-org-4.0.repo

3.完成之后,使用以下命令安装mongo shell:sudo yum install-y mongodb-org-shell

传输层安全(TLS)协议将在Amazon DocumentDB集群上默认启用。关于更多详细信息,请参阅管理Amazon DocumentDB Cluster TLS设置

要加密传输数据,请为Amazon DocumentDB下载CA证书,具体代码如下:

wget https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem

接入您的Amazon DocumentDB集群

现在,您可以接入自己的Amazon DocumentDB集群了。

1.在Amazon DocumentDB控制台的Clusters page上找到您的集群。本文中使用 docdb-2020-10-09-21-45-11集群。

2.选择您所创建的集群。

3.复制其对应的连接字符串。请忽略掉部分,以便在接入时由mongo shell提示您输入密码。这样,您就不必以明文形式输入密码。

您的连接字符串应类似于以下截屏所示。

4.在输入密码时,您会看到rs0:PRIMARY> 提示,代表您已成功接入Amazon DocumentDB集群。

关于故障排查的更多详细信息,请参阅Amazon DocumentDB故障排查

在接入mongo shell之后,您可以使用以下命令确认当前版本(4.0.0):

db.version()

输出结果如下:

4.0.0

使用事务

现在,您已经使用mongo shell成功接入集群了,接下来即可使用事务。这里我们使用典型的事务用例,即某人的账户中借钱,并将这笔钱存入另一人的账户当中。由于此用例需要使用数据库内的两项单独操作,因此我们希望两项操作在同一事务内完成并遵循ACID原则。在本演练中,我们从Bob的银行账户向Alice的银行账户转账400美元。两个账户的初始余额都为500美元。

  • 为了从空集合开始,我们首先将账户集合删除:

db.account.drop()

您将得到以下输出结果:

{true, false}

  • 将数据插入集合以代表Bob的账户:
db.account.insert({"_id": 1, "name": "Bob", "balance": 500.00});

您将得到以下输出结果:

WriteResult({ "nInserted" : 1 })

  • 将数据插入集合以代表Alice的账户:
db.account.insert({“_id”: 2, “name”: “Alice”, “balance”: 500.00});

您将得到以下输出结果:

WriteResult({ “nInserted” : 1 })

  • 要启动一项事务,请为账户创建会话与会话对象:
var mySession =getMongo().startSession();6. var mySessionObject = mySession.getDatabase('test').getCollection('account');

mySession.startTransaction({readConcern: {level: 'snapshot'}, writeConcern: {w: 'majority'}});
  • 在此事务中,从Bob账户处借取400美元:
mySessionObject.updateOne({"_id": 2}, {"$inc": {"balance": 400}}); 

您将得到以下输出结果:

{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
  • 同样的,向Alice账户中增加400美元:
mySessionObject.updateOne({"_id": 1}, {"$inc": {"balance": -400}});

您将得到以下输出结果:

{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
  • 在此事务中,您可以使用以下代码查看两个账户的更新状态:
    mySessionObject.find()

您将得到以下输出结果:

{ "_id" : 2, "name" : "Alice", "balance" : 900 }

{ "_id" : 1, "name" : "Bob", "balance" : 100 }
  • 如果您在事务之外查看,则会发现更新结果尚未显示:

db.account.find()

您将得到以下输出结果:

{ "_id" : 1, "name" : "Alice", "balance" : 500 }

{ "_id" : 2, "name" : "Bob", "balance" : 500 }
  • 提交事务并关闭会话:
  • 要查看更新结果,请使用以下代码:

db.account.find()

您将得到以下输出结果:

{ "_id" : 2, "name" : "Alice", "balance" : 900 }

{ "_id" : 1, "name" : "Bob", "balance" : 100 }

资源清理

在完成演练之后,您应停止Amazon DocumentDB集群或将其删除以降低成本。在默认情况下,经过30分钟的闲置周期,您的Amazon Cloud9环境将停止运行基础EC2实例以帮助节约成本。

总结

本文向您介绍了Amazon DocumentDB中的MongoDB 4.0兼容性,同时展示了如何通过创建Amazon Cloud9环境、安装mongo 4.0 shell、创建Amazon DocumentDB集群、接入集群并通过简单用例使用Amazon DocumentDB 4.0与事务。关于更多详细信息,请参阅MongoDB 4.0兼容性与事务。关于最新发布内容与博文的详细信息,请参阅Amazon DocumentDB (兼容MongoDB )资源

本篇作者

身兼数职的Amazon DocumentDB,还有什么不为人知的功能?_第4张图片
Joseph Idziorek
亚马逊云科技首席产品经理

你可能感兴趣的