Amazon DocumentDB:工作方式

Amazon DocumentDB(与 MongoDB 兼容) 是一项完全托管的 MongoDB 兼容数据库服务。通过 Amazon DocumentDB,您可以运行相同的应用程序代码,并使用与 MongoDB 相同的驱动程序和工具。Amazon DocumentDB 与 MongoDB 3.6 和 4.0 兼容。

使用 Amazon DocumentDB时,首先要创建一个集群。集群由零个或多个数据库实例以及管理这些实例的数据的集群卷组成。Amazon DocumentDB 集群卷 是一个跨多个可用区的虚拟数据库存储卷。每个可用区都有一个集群数据副本。

一个 Amazon DocumentDB集群由两部分组成:

  • 集群卷 — 使用云原生存储服务在三个可用区中复制数据六次,从而提供高度持久且可用的存储。一个 Amazon DocumentDB集群只有一个集群卷,最多可存储 64 TB 数据。

  • 实例 — 提供数据库处理能力,以及向集群存储卷写入数据和从中读取数据的能力。一个 Amazon DocumentDB 集群可以有 0–16 个实例。

实例具有以下两种角色之一:

  • 主实例 — 支持读写操作,并对集群卷执行所有数据修改。每个 Amazon DocumentDB集群都有一个主实例。

  • 副本实例 — 仅支持读取操作。除主实例之外,每个 Amazon DocumentDB 集群最多可拥有 15 个副本。拥有多个副本使您可以分配读取工作负载。此外,通过将副本置于单独的可用区中,您还可以提高集群可用性。

下图说明了 Amazon DocumentDB集群中的集群卷、主实例和副本之间的关系:


         显示 Amazon DocumentDB 终端节点(包括集群、读取器和实例终端节点)的示意图。

集群实例无需为相同的实例类,可以根据需要预置和终止它们。此体系结构允许您独立于集群的存储扩展集群的计算容量。

当您的应用程序将数据写入主实例时,主实例会执行对集群卷的持久写入。然后,它将该写入的状态(而不是数据)复制到每个活动副本。Amazon DocumentDB副本不参与处理写入,因此 Amazon DocumentDB副本对于读取扩展是有利的。来自 Amazon DocumentDB副本的读取最终具有一致性,且副本滞后时间最短 — 通常少于主实例写入更新后的 100 毫秒。保证按照将数据写入主实例的顺序读取副本中的数据。副本滞后取决于数据更改的速率,高写入活动的时间段可能会增加副本滞后。有关更多信息,请参阅Amazon DocumentDB 指标中的 ReplicationLag 指标。

Amazon DocumentDB 终端节点

Amazon DocumentDB提供多种连接选项,以便为各种使用案例提供服务。要连接到 Amazon DocumentDB集群中的实例,您需要指定实例的终端节点。终端节点 是主机地址和端口号,用冒号分隔。

我们建议您使用集群终端节点以副本集模式(请参阅 连接至 Amazon DocumentDB 作为副本集)连接到集群,除非您有用于连接读取器终端节点或实例终端节点的特定使用案例。要将请求路由到您的副本,请选择一项驱动程序读取首选项设置,以便在满足应用程序的读取一致性要求的同时,最大程度地提高读取扩展能力。secondaryPreferred 读取首选项将启用副本读取,并释放主实例以执行更多工作。

可从 Amazon DocumentDB集群使用以下终端节点。

集群终端节点

集群终端节点 连接到集群的当前主实例。集群终端节点可用于读写操作。Amazon DocumentDB集群只有一个集群终端节点。

集群终端节点为集群的读取/写入连接提供故障转移支持。如果集群的当前主实例失败并且您的集群至少有一个活动的只读副本,则集群终端节点会自动将连接请求重定向到新的主实例。在连接到 Amazon DocumentDB 集群时,我们建议您使用集群终端节点以副本集模式(请参阅 连接至 Amazon DocumentDB 作为副本集)连接到您的集群。

以下是示例 Amazon DocumentDB集群终端节点:

  1. sample-cluster.cluster-123456789012.us-east-1.docdb.amazonaws.com:27017

以下是使用此集群终端节点的示例连接字符串:

  1. mongodb://username:password@sample-cluster.cluster-123456789012.us-east-1.docdb.amazonaws.com:27017

有关查找集群终端节点的信息,请参阅查找集群的终端节点

读取器终端节点

读取器终端节点 跨集群中的所有可用副本对只读连接进行负载平衡。尝试通过与读取器终端节点的连接执行写入操作会导致错误。Amazon DocumentDB集群只有一个读取器终端节点。

如果集群只包含一个(主)实例,则读取器终端节点将连接到该主实例。将副本实例添加到 Amazon DocumentDB 集群时,读取器终端节点会在新副本处于活动状态后打开与新副本的只读连接。

以下是 Amazon DocumentDB集群的示例读取器终端节点:

  1. sample-cluster.cluster-ro-123456789012.us-east-1.docdb.amazonaws.com:27017

以下是使用读取器终端节点的示例连接字符串:

  1. mongodb://username:password@sample-cluster.cluster-ro-123456789012.us-east-1.docdb.amazonaws.com:27017

读取器终端节点对只读连接而不是读取请求进行负载平衡。如果某些读取器终端节点连接的使用频率高于其他连接,则读取请求可能无法在集群实例之间以相同方式取得平衡。建议以副本集形式连接到集群终端节点并利用 secondaryPreferred 读取首选项以分配请求。

有关查找集群终端节点的信息,请参阅查找集群的终端节点

实例终端节点

实例终端节点 连接到集群中的特定实例。当前主实例的实例终端节点可用于读取和写入操作。但是,尝试对只读副本的实例终端节点执行写入操作会导致错误。Amazon DocumentDB集群的每个活动实例有一个实例终端节点。

对于可能不适合使用集群终端节点或读取器终端节点的场景,实例终端节点提供对特定实例的连接的直接控制。示例使用案例是配置周期性只读分析工作负载。您可以配置大于普通副本实例的实例,使用其实例终端节点直接连接到新的较大实例,运行分析查询,然后终止实例。使用实例终端节点可防止分析流量影响其他集群实例。

下面是 Amazon DocumentDB集群中单个实例的示例实例终端节点:

  1. sample-instance.123456789012.us-east-1.docdb.amazonaws.com:27017

下面是使用此实例终端节点的示例连接字符串:

  1. mongodb://username:password@sample-instance.123456789012.us-east-1.docdb.amazonaws.com:27017

注意

由于故障转移事件,实例的主要角色或副本角色可能会发生变化。您的应用程序永远不应该假设特定的实例终端节点是主实例。我们不建议连接到生产应用程序的实例终端节点。相反,我们建议您使用集群终端节点以副本集模式(请参阅 连接至 Amazon DocumentDB 作为副本集)连接到您的集群。要想对实例故障转移优先级进行更高级的控制,请参阅了解 Amazon DocumentDB集群容错能力

有关查找集群终端节点的信息,请参阅查找实例的终端节点

副本集模式

您可以通过指定副本集名称 Amazon DocumentDB 以副本集模式连接到 rs0 集群终端节点。 在副本集模式下连接可以指定“Read Concern”、“Write Concern”和“Read Preference”选项。有关更多信息,请参阅读取一致性

下面是以副本集模式连接的示例连接字符串:

  1. mongodb://username:password@sample-cluster.cluster-123456789012.us-east-1.docdb.amazonaws.com:27017/?replicaSet=rs0

在副本集模式下连接时,您的 Amazon DocumentDB集群将作为副本集显示给您的驱动程序和客户端。在 Amazon DocumentDB集群中添加和删除的实例会自动反映在副本集配置中。

每个 Amazon DocumentDB 集群包含一个具有默认名称 rs0 的副本集。 无法修改副本集名称。

在副本集模式下连接到集群终端节点是常规用途的推荐方法。

注意

Amazon DocumentDB 集群中的所有实例都在同一 TCP 端口上侦听连接。

TLS Support

有关使用传输层安全性 (TLS) 连接到 Amazon DocumentDB的更多详细信息,请参阅加密传输中的数据

Amazon DocumentDB 存储

Amazon DocumentDB 数据存储在集群卷 中,该集群卷是使用固态驱动器 (SSD) 的单个虚拟卷。集群卷由六个数据副本组成,可在单个 AWS 区域中的多个可用区之间自动复制。此复制有助于确保您的数据具有高持久性,减少数据丢失的可能性。它还有助于确保在故障转移期间您的集群具有更高可用性,因为您的数据副本已存在于其他可用区中。这些副本可以继续向 Amazon DocumentDB集群中的实例提供数据请求服务。

数据存储的计费方式

随着数据量的增加,Amazon DocumentDB会自动增加集群卷的大小。集群卷可增大到最大 64 个 Amazon DocumentDB;但是,您只需为在 TiB 集群卷中使用的空间付费。Amazon DocumentDB在删除 Amazon DocumentDB 数据时(例如,删除表或分区),整个分配的空间保持不变。在将来数据量增加时,可以自动重用可用空间。

注意

由于存储成本基于存储“高水位”(在任何时间点为 Amazon DocumentDB 集群分配的最大容量),因此,您可以避免采用创建大量临时信息的 ETL 做法以控制成本,或者避免在删除不需要的旧数据之前加载大量新数据的 ETL 做法。

如果从 Amazon DocumentDB 集群中删除数据导致分配大量未使用的空间,则重置高水位需要使用 mongodumpmongorestore 等工具执行逻辑数据转储和还原以转储和还原到新集群。 创建和还原快照不会 减少分配的存储空间,因为基础存储的物理布局在还原的快照中保持不变。

注意

使用 mongodumpmongorestore 等实用程序会导致发生 I/O 费用,具体取决于所读取和写入存储卷的数据量。

有关 Amazon DocumentDB 数据存储和 I/O 定价的信息,请参阅 Amazon DocumentDB(与 MongoDB 兼容) 定价定价FAQs。

Amazon DocumentDB 复制

在 Amazon DocumentDB 集群中,每个副本实例都公开一个独立的终端节点。这些副本终端节点提供对集群卷中数据的只读访问。它们使您能够在多个复制实例上扩展数据的读取工作负载。它们还有助于提高数据读取的性能,并提高 Amazon DocumentDB集群中数据的可用性。Amazon DocumentDB副本也是故障转移目标,如果 Amazon DocumentDB集群的主实例失败,这些副本会快速得到提升。

Amazon DocumentDB 可靠性

Amazon DocumentDB 的设计具有可靠、持久和容错的特点。(为了提高可用性,您应该配置 Amazon DocumentDB 集群,使其在不同的可用区中具有多个副本实例。)Amazon DocumentDB 包括几个自动功能,使其成为可靠的数据库解决方案。

存储自动修复

Amazon DocumentDB在三个可用区中维护数据的多个副本,从而大大降低了因存储故障而丢失数据的可能性。Amazon DocumentDB自动检测集群卷中的故障。如果集群卷的某个区段发生故障,Amazon DocumentDB会立即修复该区段。它使用集群卷包含的其他卷中的数据以帮助确保已修复区段中的数据是最新的。因此,Amazon DocumentDB将避免数据丢失,并减少执行时间点还原以从实例故障恢复的需求。

自动恢复缓存预热

Amazon DocumentDB在与数据库不同的进程中管理其页面缓存,以便页面缓存可以独立于数据库而存在。万一发生数据库故障,页面缓存仍保留在内存中。这可确保在数据库重新启动时使用最新状态对缓冲池进行预热。

崩溃恢复

Amazon DocumentDB设计为几乎立即从崩溃中恢复,并继续提供应用程序数据。Amazon DocumentDB在并行线程上异步执行崩溃恢复,以便在发生崩溃后数据库几乎可立即打开并可供使用。

资源监管

Amazon DocumentDB 保护运行服务中的关键进程所需的资源,例如运行状况检查。为此,当实例遇到高内存压力时,Amazon DocumentDB 将限制请求。因此,一些操作可能会排队以等待内存压力下降。如果内存压力继续,排队操作可能会超时。您可以使用以下 CloudWatch 指标监控服务限制操作是否由于内存不足而产生:LowMemThrottleQueueDepthLowMemThrottleMaxQueueDepthLowMemNumOperationsThrottledLowMemNumOperationsTimedOut。 有关更多信息,请参阅Amazon DocumentDB使用 CloudWatch 监控 。如果您发现 LowMem CloudWatch 指标导致实例持续出现内存压力,我们建议您扩展实例,以便为工作负载提供额外的内存。

读取首选项选项

Amazon DocumentDB使用云原生共享存储服务,该服务在三个可用区中复制数据六次,以提供高级别的持久性。Amazon DocumentDB不依赖于将数据复制到多个实例来实现持久性。无论集群是包含单个实例还是 15 个实例,集群的数据都具有持久性。

写入持久性

Amazon DocumentDB 使用一种独特的、分布式、容错、自我修复的存储系统。此系统跨三个 AWS 可用区复制六份 (V=6) 数据,以提供高可用性和持久性。在写入数据时,Amazon DocumentDB 在确认写入客户端之前,确保所有写入都已在大多数节点上持久记录。如果您运行的是三节点 MongoDB 副本集,则与 {w:3, j:true} 相比,使用写关注 Amazon DocumentDB 将提供最佳配置。

对 Amazon DocumentDB 集群的写入必须由集群的写入器实例处理。尝试写入读取器会导致错误。来自 Amazon DocumentDB 主实例的已确认写入具有持久性,无法回滚。默认情况下,Amazon DocumentDB 具有高持久性,不支持非持久性写入选项。您无法修改持久性级别(即写关注)。Amazon DocumentDB 忽略 w=anything (任何内容),实际上是 w:3 和 j:true。您无法减少它。

在 Amazon DocumentDB 架构中,存储与计算是分离的,因此具有单个实例的集群拥有很高的持久性。持久性在存储层处理。因此,具有单个实例和具有三个实例的 Amazon DocumentDB 集群实现了相同级别的持久性。您可以根据特定用例配置集群,同时仍为数据提供高持久性。

对 Amazon DocumentDB集群的写入操作在单个文档中是原子操作。

Amazon DocumentDB 不支持 wtimeout 选项,并且如果指定了值,将不会返回错误。对 Amazon DocumentDB主实例的写入操作保证不会无限期阻塞。

读取隔离

从 Amazon DocumentDB实例读取只返回查询开始之前已持久存在的数据。读取从不返回在查询开始执行后修改的数据,即,任何情况下都不会进行脏读取。

读取一致性

从 Amazon DocumentDB集群读取的数据具有持久性,将不会回滚。您可以通过指定请求或连接的读取首选项来修改 Amazon DocumentDB读取的读取一致性。Amazon DocumentDB不支持非持久性读取选项。

从 Amazon DocumentDB 集群的主实例读取在正常操作条件下具有强一致性,并且具有先写后读一致性。如果在写入与后续读取之间发生故障转移事件,系统可能短暂返回不具有强一致性的读取。从只读副本的所有读取最终是一致的,以相同的顺序返回数据,并且通常具有小于 100 毫秒的副本滞后。

Amazon DocumentDB读取首选项

仅当 Amazon DocumentDB以副本集模式从集群终端节点读取数据时,才支持设置读取首选项。设置读取首选项会影响 MongoDB 客户端或驱动程序将读取请求路由到 Amazon DocumentDB 集群中的实例的方式。您可以为特定查询设置读取首选项,也可以将其设置为 MongoDB 驱动程序中的常规选项。(有关如何设置读取首选项的说明,请查阅客户端或驱动程序文档。)

如果您的客户端或驱动程序未在副本集模式下连接到 Amazon DocumentDB集群终端节点,则指定读取首选项的结果并不明确。

Amazon DocumentDB 不支持将标记集设置为读取首选项。

支持的读取首选项

  • primary— 指定 primary 读取首选项有助于确保将所有读取请求路由到集群的主实例。如果主实例不可用,则读取操作将失败。primary 读取首选项可产生先写后读一致性,适用于先写后读一致性优先于高可用性和读取扩展的使用案例。

    以下示例指定 primary 读取首选项:

    1. db.example.find().readPref('primary')
  • primaryPreferred— 指定 primaryPreferred 读取首选项会在正常操作期间将读取请求路由到主实例。如果发生主实例故障转移,则客户端会将请求路由到副本。primaryPreferred 读取首选项会在正常操作期间产生先写后读一致性,并在故障转移事件期间产生最终一致性读取。primaryPreferred 读取首选项适用于先写后读一致性优先于读取扩展但仍需要高可用性的使用案例。

    以下示例指定 primaryPreferred 读取首选项:

    1. db.example.find().readPref('primaryPreferred')
  • secondary—指定 secondary 读取首选项可确保只将读取请求路由到副本,不会路由到主实例。如果集群中没有副本实例,则读取请求将失败。secondary 读取首选项会产生最终一致性读取,适用于主实例写入吞吐量优先于高可用性和先写后读一致性的使用案例。

    以下示例指定 secondary 读取首选项:

    1. db.example.find().readPref('secondary')
  • secondaryPreferred— 指定 secondaryPreferred 读取首选项可确保只将读取路由到只读副本,不会路由到主实例。如果集群中没有活动的副本实例,则读取请求将路由到主实例。当读取由只读副本提供服务时,secondaryPreferred 读取首选项会产生最终一致性读取。当读取由主实例提供服务时,它会产生先写后读一致性(禁止故障转移事件)。secondaryPreferred 读取首选项适用于读取扩展和高可用性优先于先写后读一致性的使用案例。

    以下示例指定 secondaryPreferred 读取首选项:

    1. db.example.find().readPref('secondaryPreferred')
  • nearest— 指定 nearest 读取首选项将仅基于测量的客户端与 Amazon DocumentDB 集群中所有实例之间的延迟来路由读取请求。当读取由只读副本提供服务时,nearest 读取首选项会产生最终一致性读取。当读取由主实例提供服务时,它会产生先写后读一致性(禁止故障转移事件)。nearest 读取首选项适用于实现尽可能低的读取延迟和高可用性优先于先写后读取一致性和读取扩展的使用案例。

    以下示例指定 nearest 读取首选项:

    1. db.example.find().readPref('nearest')

高可用性

Amazon DocumentDB通过将副本用作主实例的故障转移目标来支持高度可用的集群配置。如果主实例失败,则 Amazon DocumentDB副本将被提升为新的主实例,且出现短暂中断,在此期间,对主实例发出的读写请求将失败,并会出现异常。

如果您的 Amazon DocumentDB集群不包含任何副本,则会在失败期间重新创建主实例。但是,提升 Amazon DocumentDB 副本要比重新创建主实例快得多。因此,我们建议您创建一个或多个 Amazon DocumentDB 副本作为故障转移目标。

旨在用作故障转移目标的副本应与主实例具有相同的实例类。它们应在不同于主实例的可用区中进行配置。您可以控制哪些副本作为首选故障转移目标。有关配置 Amazon DocumentDB以实现高可用性的最佳实践,请参阅了解 Amazon DocumentDB集群容错能力

扩展读取

Amazon DocumentDB 副本是读取扩展的理想选择。它们完全专用于集群卷上的读取操作,即副本不处理写入。数据复制发生在集群卷中,而不是在实例之间。因此,每个副本的资源都专用于处理查询,而不是复制和写入数据。

如果您的应用程序需要更多读取容量,则可以快速向集群添加副本(通常在不到十分钟的时间内完成)。如果您的读取容量要求减少,则可以删除不需要的副本。使用 Amazon DocumentDB副本,您只需为所需的读取容量付费。

Amazon DocumentDB通过使用“Read Preference (读取首选项)”选项支持客户端读取扩展。有关更多信息,请参阅Amazon DocumentDB读取首选项

TTL 删除

在特定时间范围内无法保证从通过后台进程实现的 TTL 索引区域中进行删除,只能尽力而为。实例大小、实例资源利用率、文档大小和总体吞吐量等因素会影响 TTL 删除的时间。

TTL 监视器每次删除您的文档都会产生 IO 成本,这将增加您的账单费用。如果吞吐量和 TTL 删除率提高,您应预计到账单费用会因 IO 使用量的增加而增多。

当您在现有集合上创建 TTL 索引时,必须先删除所有过期的文档,然后再创建索引。当前 TTL 实现已针对删除集合中的一小部分文档进行了优化,这通常是从头开始在集合上启用 TTL 的情况,如果需要一次删除大量文档,则可能会导致 IOPS 高于必需的数量。

如果您不想创建 TTL 索引来删除文档,则可以改为根据时间将文档分段到集合中,并在不再需要文档时删除这些集合。例如:您可以每周创建一个集合,并删除它,而不会产生 IO 成本。这可能会比使用 TTL 索引更具成本效益。

应计费的资源

确定应计费的 Amazon DocumentDB 资源

作为一项完全托管的数据库服务,Amazon DocumentDB 将对实例、存储、I/O、备份和数据传输收费。有关更多信息,请参阅 Amazon DocumentDB(与 MongoDB 兼容) 定价

要查找您账户中应计费的资源并删除这些资源,您可以使用 AWS 管理控制台或 AWS CLI。

使用 AWS 管理控制台

使用 AWS 管理控制台,您可以查找为给定 AWS 区域预置的 Amazon DocumentDB 集群、实例和快照。

查找集群、实例和快照

  1. 通过以下网址登录 AWS 管理控制台并打开 Amazon DocumentDB 控制台:https://console.aws.amazon.com/docdb

  2. 要在非默认区域中查找应计费资源,请在屏幕右上角处,选择要搜索的 AWS 区域。

    ![

    1. 区域选择器中显示 N Virginia (弗吉尼亚北部) 的控制台屏幕截图。
    2. ](/projects/DocumentDB-20201111-zh/7e7cc493874d342f5d409da3bf8be343.png)
  3. 在导航窗格中,选择您感兴趣的应计费资源的类型: 集群实例快照

    ![

    1. 导航窗格中显示集群、实例和快照的控制台屏幕截图。
    2. ](/projects/DocumentDB-20201111-zh/197494d20b96f542609f1721eba086d2.png)
  4. 右侧窗格中列出了该区域的所有已预置的集群、实例或快照。您将需要为集群、实例和快照付费。

使用 AWS CLI

使用 AWS CLI,您可以查找为给定 AWS 区域预置的 Amazon DocumentDB 集群、实例和快照。

查找集群和实例

以下代码将列出指定区域的所有集群和实例。如果要在默认区域中搜索集群和实例,可以省略 --region 参数。

对于 Linux、macOS 或 Unix:

  1. aws docdb describe-db-clusters \
  2. --region us-east-1 \
  3. --query 'DBClusters[?Engine==`docdb`]' | \
  4. grep -e "DBClusterIdentifier" -e "DBInstanceIdentifier"

对于 Windows:

  1. aws docdb describe-db-clusters ^
  2. --region us-east-1 ^
  3. --query 'DBClusters[?Engine==`docdb`]' | ^
  4. grep -e "DBClusterIdentifier" -e "DBInstanceIdentifier"

此操作的输出将类似于下文。

  1. "DBClusterIdentifier": "docdb-2019-01-09-23-55-38",
  2. "DBInstanceIdentifier": "docdb-2019-01-09-23-55-38",
  3. "DBInstanceIdentifier": "docdb-2019-01-09-23-55-382",
  4. "DBClusterIdentifier": "sample-cluster",
  5. "DBClusterIdentifier": "sample-cluster2",

查找快照

以下代码将列出指定区域的所有快照。如果要在默认区域中搜索快照,可以省略 --region 参数。

对于 Linux、macOS 或 Unix:

  1. aws docdb describe-db-cluster-snapshots \
  2. --region us-east-1 \
  3. --query 'DBClusterSnapshots[?Engine==`docdb`].[DBClusterSnapshotIdentifier,SnapshotType]'

对于 Windows:

  1. aws docdb describe-db-cluster-snapshots ^
  2. --region us-east-1 ^
  3. --query 'DBClusterSnapshots[?Engine==`docdb`].[DBClusterSnapshotIdentifier,SnapshotType]'

此操作的输出将类似于下文。

  1. [
  2. [
  3. "rds:docdb-2019-01-09-23-55-38-2019-02-13-00-06",
  4. "automated"
  5. ],
  6. [
  7. "test-snap",
  8. "manual"
  9. ]
  10. ]

您只需删除 manual 快照。Automated 快照会在您删除集群时被删除。

删除不需要的应计费资源

要删除集群,必须先删除集群中的所有实例。