亚马逊AWS官方博客

在 Amazon DocumentDB 中实现 MongoDB 4.0 兼容性与事务处理能力

Original Link: https://amazonaws-china.com/cn/blogs/database/introducing-amazon-documentdb-with-mongodb-compatibility-4-0/

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

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

Amazon DocumentDB 4.0中的新特性

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

  • ACID事务 Amazon DocumentDB现可支持跨多个文档、语句、集合及数据库执行事务。事务支持使您能够跨Amazon DocumentDB集群内的一个或多个文档执行ACID操作,从而简化应用开发流程。关于更多详细信息,请参阅 事务
  • 变更流  现在,您可以在集群层级 (client.watch() 或 mongo.watch()) 或者数据库层级(db.watch())开启变更流。您也可以指定一个 startAtOperationTime以打开变更流游标,并将变更流的保留周期延长至7天(之前最多为24小时)。关于更多详细信息,请参阅 在Amazon DocumentDB上使用变更流
  • AWS DMS – 现在,您可以使用 AWS Database Migration Service (AWS DMS)将MongoDB 4.0工作负载迁移至Amazon DocumentDB 4.0。AWS DMS现可支持以MongoDB 4.0为源、以Amazon DocumentDB 4.0为目标,并可以Amazon DocumentDB 3.6为源完成由3.6版本到4.0版本的升级。关于更多详细信息,请参阅 将Amazon DocumentDB 作为AWS Database Migration Service的目标
  • 监控  通过添加事务,现在您可以使用五项新的 Amazon CloudWatch 指标: TransactionsOpen, TransactionsOpenMax, TransactionsAborted, TransactionsStarted 以及 TransactionsCommitted, 外加 currentOp, ServerStatus与 profiler等新字段。关于更多详细信息,请参阅 使用CloudWatch监控Amazon DocumentDB
  • 性能与索引 新版本中还包含多项性能与索引改进:可在 $lookup 聚合阶段使用索引、可直接由索引(所涉及查询)提供带有投射的 find() 查询、可通过findAndModify API使用hint() 、对 $addToSet 操作符做出性能优化,同时改进并缩小了总体索引大小。关于更多详细信息,请参阅 发布说明
  • 操作符 我们增加了对以下新聚合操作符的支持: $ifNull, $replaceRoot, $setIsSubset, $setInstersection, $setUnion以及 $setEquals。关于更多详细信息,请参阅支持的MongoDB API、操作与数据类型
  • 基于角色的访问控制 (RBAC) – 使用 ListCollection 与 ListDatabase命令,您现在可以选择使用 authorizedCollections 与 authorizedDatabases参数以允许用户列出其有权访问的集合与数据库,因此不再需要为此分别使用 listCollections 与 listDatabase角色。用户还可以直接结束自己的游标,无需使用 KillCursor 角色。关于更多详细信息,请参阅 使用基于角色的访问控制(内置角色)限制数据库访问行为

Amazon DocumentDB 4.0与事务入门指南

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

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

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

创建AWS Cloud9环境

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

  1. AWS Cloud9 控制台上,选择 Create environment
  2. 在 Environment name and description之下的 Name部分,为环境输入名称。本文将环境命名为DocumentDBCloud9。
  3. 选择 Next step
  4. Configure settings部分,直接使用全部默认选项。
  5. 选择 Next step
  6. Review部分, 选择 Create environment

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

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

创建安全组

在此步骤中,您将使用Amazon Elastic Compute Cloud (Amazon EC2)创建一个新的安全组,借此从AWS Cloud9环境中的端口27017(Amazon DocumentDB的默认端口)连接至AMazno 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。源安全组为您刚刚为AWS Cloud9环境创建的安全组。
  9. 要查看可用安全组列表,请在目标字段内输入 cloud9。
  10. 选择名称为 aws-cloud9-<environment name>的安全组。
  11. 接受所有默认选项,而后选择 Create security group

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

创建一套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

  1. Network settings部分的VPC security groups当中, 选择 demoDocDB

  1. 选择 Create cluster

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

安装4.0 mongo shell

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

  1. 在AWS Cloud9r控制台的 Your environments之下, 选择 DocumentDBCloud9
  2. 选择 Open IDE
  3. 要安装4.0 mongo shell,请在命令提示符中使用以下命令创建repo文件:

echo -e “[mongodb-org-4.0] \nname=MongoDB Repository\nbaseurl=https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/4.0/x86_64/\ngpgcheck=1 \nenabled=1 \ngpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc” | sudo tee /etc/yum.repos.d/mongodb-org-4.0.repo

  1. 完成之后,使用以下命令安装mongo shell:

sudo yum install -y mongodb-org-shell

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

  1. 要加密传输数据,请为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集群。

  1. 选择您所创建的集群。
  2. 复制其对应的连接字符串。请忽略掉 <insertYourPassword> 部分,以便在接入时由mongo shell提示您输入密码。这样,您就不必以明文形式输入密码。


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

  1. 在输入密码时,您会看到 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 }

 

  • 提交事务并关闭会话:
mySession.commitTransaction()
mySession.endSession()

 

  • 要查看更新结果,请使用以下代码:

db.account.find()

您将得到以下输出结果:

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

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

 

资源清理

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

总结

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

本篇作者

Joseph Idziorek

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