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

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

Amazon DocumentDB 工作方式

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

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

Amazon DocumentDB 集群由两部分组成:

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

  • 实例— 提供数据库处理能力,以及向集群存储卷写入数据和从中读取数据的能力。一个 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 D

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

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

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

集群端点

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

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

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

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

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

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

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

读取器终端节点

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

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

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

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

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

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

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

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

实例终端节点

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

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

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

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

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

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 (读取首选项)”选项。有关更多信息,请参阅 读取一致性

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

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 D

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

数据存储的计费方式

随着数据量的增加,Amazon DocumentDB 会自动增加集群卷的大小。Amazon DocumentDB 集群卷的最大大小可增大到 64 TiB;但是,您只需为在 Amazon DocumentDB 集群卷中使用的空间付费。从 Amazon DocumentDB 4.0 开始,当例如,例如,例如,通过删除集合或索引时,整个分配的空间将减少相当数量。因此,您可以通过删除不再需要的集合、索引和数据库来减少存储费用。使用 Amazon DocumentDB 3.6,在删除数据时(例如,删除集合或索引),整个分配的空间保持不变。在将future 数据量增加时,可以自动重用可用空间。

注意

在 Amazon DocumentDB 3.6 中,存储成本基于存储 “高水位”(在任何时间点为 Amazon DocumentDB 集群分配的最大容量),即在任何时间点为 Amazon DocumentDB 集群分配的最大容量。您可以避免采用创建大量临时信息的 ETL 做法以控制成本,或者避免在删除不需要的旧数据之前加载大量新数据的 ETL 做法。如果从 Amazon DocumentDB 集群中删除数据导致分配大量未使用的空间,则重置高水位需要使用之类的工具执行逻辑数据转储和还原以转储和还原到新集群mongodump要么mongorestore. 创建和还原快照不会 减少分配的存储,因为基础存储的物理布局在还原的快照中保持不变。

注意

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

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

Amazon DocumentDB D

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

Amazon DocumentDB D

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

存储自动修复

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

自动恢复缓存预热

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

崩溃恢复

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

资源监管

Amazon DocumentDB 保护在服务中运行关键流程(例如运行状况检查)所需的资源。为此,当实例遇到高内存压力时,Amazon DocumentDB 将限制请求。因此,某些操作可能会排队等待内存压力消退。如果内存压力持续存在,排队的操作可能会超时。您可以使用以下命令监视服务是否因内存不足而限制操作 CloudWatch 指标:LowMemThrottleQueueDepthLowMemThrottleMaxQueueDepthLowMemNumOperationsThrottledLowMemNumOperationsTimedOut. 有关更多信息,请参阅使用监控 Amazon DocumentDB 数据库 CloudWatch. 如果您发现由于以下原因导致实例持续承受内存压力 LowMem CloudWatch 指标,我们建议您纵向扩展实例,以便为您的工作负载提供更多内存。

读取首选项选项

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

写入持久性

Amazon DocumentDB 使用一种独特的、分布式、容错、自我修复的存储系统。此系统跨三个 (V=6) 数据副本 (V=6) 数据Amazon可用区,以提供高可用性和持久性。在写入数据时,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 集群的主实例读取在正常操作条件下具有强一致性,并且具有 read-after-write 一致性。如果在写入与后续读取之间发生故障转移事件,系统可能短暂返回不具有强一致性的读取。从只读副本的所有读取最终是一致的,以相同的顺序返回数据,并且通常具有小于 100 毫秒的副本滞后。

Amazon DocumentDB Re

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

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

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

支持的读取首选项
  • primary—指定primary读取首选项有助于确保将所有读取请求路由到集群的主实例。如果主实例不可用,则读取操作将失败。一个primary读取偏好产量 read-after-write 一致性,适用于优先级较高的用例 read-after-write 一致性超过高可用性和读取扩展。

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

    db.example.find().readPref('primary')

     

  • primaryPreferred—指定primaryPreferred读取首选项会在正常操作条件下,将读取请求路由到主实例。如果发生主实例故障转移,则客户端会将请求路由到副本。一个primaryPreferred读取偏好产量 read-after-write 在正常操作期间保持一致性,并在故障转移事件期间产生最终一致性读取。一个primaryPreferred读取首选项适用于优先级较高的用例 read-after-write 一致性超过读取扩展,但仍需要高可用性。

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

    db.example.find().readPref('primaryPreferred')

     

  • secondary—指定secondary读取首选项可确保只将读取请求路由到副本,从不路由到主实例。如果集群中没有副本实例,则读取请求将失败。一个secondary读取首选项会产生最终一致性读取,适用于主实例写入吞吐量优先于高可用性和 read-after-write 一致性。

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

    db.example.find().readPref('secondary')

     

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

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

    db.example.find().readPref('secondaryPreferred')

     

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

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

    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 通过使用 “读取首选项” 选项支持客户端读取扩展。有关更多信息,请参阅 Amazon DocumentDB Re

TTL 删除

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

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

在现有集合上创建 TTL 索引时,必须先删除所有过期的文档,然后才能创建索引。当前的 TTL 实现经过优化,可以删除集合中的一小部分文档,如果从一开始就在集合上启用 TTL,则这种情况很常见;如果需要一次性删除大量文档,则可能会导致比必要的 IOPS 更高。

如果您不想创建 TTL 索引来删除文档,则可以根据时间将文档归入各个集合中,并在不再需要文档时将其删除。例如:您可以每周创建一个集合,然后将其丢弃,而不会产生 IO 成本。这样做比使用 TL 索引更具成本效益。

应计费的资源

识别应计费的Amazon DocumentDB 资源

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

要查找您账户中应计费的资源并删除这些资源,您可以使用 Amazon Web Services Management Console或 Amazon CLI。

使用 Amazon Web Services Management Console

使用Amazon Web Services Management Console,您可以查找为给定预置的 Amazon DocumentDB 集群、实例和快照Amazon Web Services 区域.

查找集群、实例和快照
  1. 登录到Amazon Web Services Management Console,然后打开亚马逊 DocumentDB 控制台https://console.aws.amazon.com/docdb.

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

    
                            区域选择器中显示 N Virginia (弗吉尼亚北部) 的控制台屏幕截图。
  3. 在导航窗格中,选择您感兴趣的应计费资源类型:集群实例,或者快照.

    
                            导航窗格中显示集群、实例和快照的控制台屏幕截图。
  4. 右侧窗格中列出了该区域的所有已预置的集群、实例或快照。您将需要为集群、实例和快照付费。

使用 Amazon CLI

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

查找集群和实例

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

对于 Linux、macOS 或 Unix:

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

对于 Windows:

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

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

"DBClusterIdentifier": "docdb-2019-01-09-23-55-38", "DBInstanceIdentifier": "docdb-2019-01-09-23-55-38", "DBInstanceIdentifier": "docdb-2019-01-09-23-55-382", "DBClusterIdentifier": "sample-cluster", "DBClusterIdentifier": "sample-cluster2",
查找快照

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

对于 Linux、macOS 或 Unix:

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

对于 Windows:

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

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

[ [ "rds:docdb-2019-01-09-23-55-38-2019-02-13-00-06", "automated" ], [ "test-snap", "manual" ] ]

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

删除不需要的应计费资源

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