写点什么

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

  • 2021 年 12 月 22 日
  • 本文字数:5865 字

    阅读完需:约 19 分钟

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



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


  • Amazon DocumentDB(兼容 MongoDB)

https://aws.amazon.com/cn/documentdb/

  • MongoDB 4.0 兼容性

https://docs.aws.amazon.com/documentdb/latest/developerguide/compatibility.html


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



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


Amazon DocumentDB 4.0 中的新特性


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


  • MongoDB 4.0 兼容性

https://docs.aws.amazon.com/documentdb/latest/developerguide/compatibility.html


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


  • 事务

https://docs.aws.amazon.com/documentdb/latest/developerguide/transactions.html


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


  • 在 Amazon DocumentDB 上使用变更流

https://docs.aws.amazon.com/documentdb/latest/developerguide/change_streams.html


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 的目标


  • Amazon Database Migration Service

https://aws.amazon.com/cn/dms/

  • 将 Amazon DocumentDB 作为 Amazon Database Migration Service 的目标

https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.DocumentDB.html


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

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


  • Amazon CloudWatch

https://aws.amazon.com/cn/cloudwatch/

  • 使用 Amazon CloudWatch 监控 Amazon DocumentDB

https://docs.aws.amazon.com/documentdb/latest/developerguide/cloud_watch.html


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


  • 发布说明

https://docs.aws.amazon.com/documentdb/latest/developerguide/release-notes.html


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


  • 支持的 MongoDB API、操作与数据类型

https://docs.aws.amazon.com/documentdb/latest/developerguide/mongo-apis.html


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


  • 使用基于角色的访问控制(内置角色)限制数据库访问行为

https://docs.aws.amazon.com/documentdb/latest/developerguide/role_based_access_control.html


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 Virtual Private Cloud

https://amazonaws-china.com/vpc/

  • Amazon VPC

https://docs.aws.amazon.com/vpc/latest/userguide/vpc-getting-started.html


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



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


  • 创建 Virtual Private Cloud (VPC)

https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/VPCs.CreatingVPC.html


创建 Amazon Cloud9 环境


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


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


  • Amazon Cloud9 控制台

https://console.aws.amazon.com/cloud9/home


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 集群。


  • Amazon Elastic Compute Cloud

https://amazonaws-china.com/ec2


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


  • Amazon EC2 控制台

https://console.aws.amazon.com/ec2/


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 4.0 集群


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


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


  • Amazon DocumentDB 控制台

https://signin.aws.amazon.com/signin?redirect_uri=https%3A%2F%2Fconsole.aws.amazon.com%2Fdocdb%2Fhome%3Fstate%3DhashArgs%2523%26isauthcode%3Dtrue&client_id=arn%3Aaws%3Aiam%3A%3A015428540659%3Auser%2Fchimera&forceMobileApp=0&code_challenge=G6fnzoPXi8Glfzm0IvPp4BNZLZBd__iXdDnvBPvggzI&code_challenge_method=SHA-256


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。



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/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


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


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


  • 管理 Amazon DocumentDB Cluster TLS 设置

https://docs.aws.amazon.com/documentdb/latest/developerguide/security.encryption.ssl.html#security.encryption.ssl.managing


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


wget https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem
复制代码


  • 下载 CA 证书

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



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



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


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


  • Amazon DocumentDB 故障排查

https://docs.aws.amazon.com/documentdb/latest/developerguide/troubleshooting.html


在接入 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 )资源


  • MongoDB 4.0 兼容性

https://docs.aws.amazon.com/documentdb/latest/developerguide/compatibility.html

  • 事务

https://docs.aws.amazon.com/documentdb/latest/developerguide/transactions.html

  • Amazon DocumentDB (兼容 MongoDB )资源

https://aws.amazon.com/documentdb/resources/


本篇作者


Joseph Idziorek

亚马逊云科技首席产品经理


用户头像

还未添加个人签名 2019.09.17 加入

还未添加个人简介

评论

发布
暂无评论
身兼数职的Amazon DocumentDB,还有什么不为人知的功能?