Amazon DocumentDB 弹性集群:工作原理 - Amazon DocumentDB
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon DocumentDB 弹性集群:工作原理

本节的主题提供有关支持 Amazon DocumentDB 弹性集群的机制和功能的信息。

Amazon DocumentDB 弹性集群分片

Amazon DocumentDB 弹性集群使用基于哈希的分片跨分布式存储系统进行数据分区。分片(也称为分区)将大型数据集拆分为跨多个节点的小型数据集,使您能够横向扩展数据库超出垂直扩展限值。弹性集群使用 Amazon DocumentDB 中计算和存储的分离或“解耦”,使您能够相互独立地扩展。弹性集群不是通过在计算节点之间移动小块数据进行集合重新分区,而是在分布式存储系统中高效复制数据。

图:弹性集群分布模型

分片定义

分片命名法的定义:

  • 分片 — 一个分片为弹性集群提供计算。默认情况下,一个分片会有两个节点。您可以配置最多 32 个分片,每个分片可以有最多 64 个 vCPU。

  • 分片密钥 — 分片密钥是已分片集合的 JSON 文档中的一个必填字段,弹性集群使用该字段向匹配的分片分配读写流量。

  • 分片集合 — 分片集合是其数据跨数据分区中弹性集群分布的一个集合。

  • 分区 — 分区是已分片数据的逻辑部分。创建已分片集合时,数据将根据分片密钥自动组织到每个分片内的分区中。每个分片都有多个分区。

跨已配置分片分配数据

创建具有许多唯一值的分片密钥。良好分片密钥可以将您的数据跨底层分片均匀分配,从而让您的工作负载有最佳吞吐量和性能。以下示例是使用名为“user_id”的分片密钥的员工姓名数据:

图:弹性集群添加日期

DocumentDB 使用哈希分片跨底层分片进行数据分区。其他数据按相同方式插入和分配:

图:弹性集群添加日期

当您通过添加额外分片横向扩展数据库时,Amazon DocumentDB 会自动重新分配数据:

图:弹性集群添加日期

弹性集群迁移

Amazon DocumentDB 支持将分片的 MongoDB 数据迁移到弹性集群。支持离线、在线和混合迁移方法。有关更多信息,请参阅 迁移到 Amazon DocumentDB

弹性集群扩展

Amazon DocumentDB 弹性集群可以增加弹性集群中分片数目(横向扩展)以及应用于每个分片的 vCPU 数目(纵向扩展)。您还可以根据需要减少分片数目和计算容量 (vCPU)。

有关扩展的最佳实践,请参阅 扩展弹性集群

注意

还提供集群级的扩展。有关更多信息,请参阅 扩展 Amazon DocumentDB 集群

弹性集群可靠性

Amazon DocumentDB 的设计具有可靠、持久和容错的特点。为提高可用性,弹性集群按每个分片部署两个节点分片,跨不同可用区布置。Amazon DocumentDB 包括多种自动功能,使其成为很可靠的数据库解决方案:有关更多信息,请参阅 Amazon DocumentDB 可靠性

弹性集群存储和可用性

Amazon DocumentDB 数据存储在集群卷中,该集群卷是使用固态驱动器 (SSD) 的单个虚拟卷。一个集群卷由六个数据副本组成,这些副本会在单个 Amazon 区域的多个可用区之间自动复制。此复制有助于确保您的数据具有高持久性,减少数据丢失的可能性。它还有助于确保在故障转移期间您的集群具有更高可用性,因为您的数据副本已存在于其他可用区中。有关存储、高可用性和复制的更多详细信息,请参阅Amazon DocumentDB:工作方式

Amazon DocumentDB 4.0 与弹性集群之间的功能差异

Amazon DocumentDB 4.0 与弹性集群之间存在以下功能差异。

  • 来自 topcollStats 的结果按分片分区。对于分片集合,数据分布在多个分区之间,并collScans从分区汇总collStats报告。

  • 当改变集群分片计数时,来自已分片集合的 topcollStats 的集合统计数据将重置。

  • 备份内置角色现在支持 serverStatus。操作 - 具有备份角色的开发人员和应用程序可以收集有关 Amazon DocumentDB 集群状态的统计量。

  • SecondaryDelaySecs 字段替换 replSetGetConfig 输出中的 slaveDelay

  • hello 命令替换 isMaster - hello 返回描述弹性集群角色的一个文档。

  • 弹性集群中的 $elemMatch 运算符仅匹配某数组第一个嵌套级别中的文档。在 Amazon DocumentDB 4.0 中,运算符在返回已匹配文档之前遍历所有级别。例如:

db.foo.insert( [ {a: {b: 5}}, {a: {b: [5]}}, {a: {b: [3, 7]}}, {a: [{b: 5}]}, {a: [{b: 3}, {b: 7}]}, {a: [{b: [5]}]}, {a: [{b: [3, 7]}]}, {a: [[{b: 5}]]}, {a: [[{b: 3}, {b: 7}]]}, {a: [[{b: [5]}]]}, {a: [[{b: [3, 7]}]]} ]); // Elastic Clusters > db.foo.find({a: {$elemMatch: {b: {$elemMatch: {$lt: 6, $gt: 4}}}}}, {_id: 0}) { "a" : [ { "b" : [ 5 ] } ] } // Docdb 4.0: traverse more than one level deep > db.foo.find({a: {$elemMatch: {b: {$elemMatch: {$lt: 6, $gt: 4}}}}}, {_id: 0}) { "a" : [ { "b" : [ 5 ] } ] } { "a" : [ [ { "b" : [ 5 ] } ] ] }
  • Amazon DocumentDB 4.0 中的“$”投影返回带所有字段的所有文档。对于弹性集群,带“$”投影的 find 命令返回匹配查询参数的文档,该参数仅含有匹配“$”投影的字段。

  • 对于弹性集群,带 $regex$options 查询参数的 find 命令返回一个错误:“无法同时在 $regex 和 $options 中设置选项”。

  • 对于弹性集群,以下情况时,$indexOfCP 现在返回“-1”:

    • 未在 string expression 中找到子字符串,或

    • start 是一个大于 end 的数字,或

    • start 是一个大于字符串字节长度的数字。

    在 Amazon DocumentDB 4.0 中,当 start 位置是一个大于 end 或字符串字符串字节长度的数字时,$indexOfCP 返回“0”。

  • 对于弹性集群,_id fields(例如:{"_id.nestedField" : 1})中的投影操作返回仅包含已投影字段的文档。而在 Amazon DocumentDB 4.0 中,嵌套字段投影命令不筛选出任何文档。