作为副本集连接到 Amazon DocumentDB - Amazon DocumentDB
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

作为副本集连接到 Amazon DocumentDB

在针对 Amazon DocumentDB 进行开发时(具有 MongoDB 兼容性),我们建议您以副本集形式连接到集群,并使用驱动程序的内置读取首选项功能将读取操作分布到副本实例。本节更深入地介绍了这意味着什么,并介绍了如何使用适用于 Python 的开发工具包作为副本集连接到 Amazon DocumentDB 集群作为示例。

Amazon DocumentDB 有三个终端节点,您可以使用它们连接到集群:

  • 集群终端节点

  • 读取器终端节点

  • 实例终端节点

在大多数情况下,在连接到 Amazon DocumentDB 时,我们建议您使用集群终端节点。这是指向集群中的主实例的别名记录,如下图所示。

使用 SSH 隧道时,我们建议您使用集群终端节点连接到集群,而不要尝试以副本集模式(即在连接字符串中指定 replicaSet=rs0)进行连接,因为这会导致错误。

注意

有关 Amazon DocumentDB 终端节点的更多信息,请参阅。Amazon DocumentDB D.


         包括集群、读取器和实例终端节点在内的 Amazon DocumentDB 终端节点的图表。

使用集群终端节点,您可以在副本集模式下连接到集群。然后您可以使用内置的读取首选项驱动程序功能。在以下示例中,指定/?replicaSet=rs0表示您要以副本集形式连接到的开发工具包。如果你省略/?replicaSet=rs0',客户端将所有请求路由到群集终端节点,即您的主实例。

## Create a MongoDB client, open a connection to Amazon DocumentDB as a ## replica set and specify the read preference as secondary preferred client = pymongo.MongoClient('mongodb://<user-name>:<password>@mycluster.node.us-east-1.docdb.amazonaws.com:27017/?replicaSet=rs0')

作为副本集进行连接的优势在于,它使您的 SDK 能够自动发现集群地形,包括在群集中添加或移除实例时。然后,您可以通过将读取请求路由到副本实例来更有效地使用集群。

当您作为副本集进行连接时,可以指定readPreference连接。如果指定了读取首选项secondaryPreferred,客户端会将读取查询路由到副本并将查询写入主实例(如下图所示)。这是对群集资源的更好利用。有关更多信息,请参阅读取首选项选项

## Create a MongoDB client, open a connection to Amazon DocumentDB as a ## replica set and specify the read preference as secondary preferred client = pymongo.MongoClient('mongodb://<user-name>:<password>@mycluster.node.us-east-1.docdb.amazonaws.com:27017/?replicaSet=rs0&readPreference=secondaryPreferred')

         显示 Amazon DocumentDB readPreference 选项的图表:secondaryPreferred。

对 Amazon DocumentDB 副本的读取操作具有最终一致性。他们返回数据的顺序与在主数据上写入的顺序相同,而且复制滞后通常不到 50 毫秒。您可以使用 Amazon CloudWatch 指标监控集群的副本滞后。DBInstanceReplicaLagDBClusterReplicaLagMaximum. 有关更多信息,请参阅使用 CloudWatch 监控 Amazon DocumentDB

与传统的单片数据库体系结构不同,Amazon DocumentDB 将存储和计算分开。鉴于这种现代体系结构,我们鼓励您在副本实例上读取扩展。副本实例上的读取不会阻止从主实例复制写入操作。您可以在群集中添加多达 15 个只读副本实例,并扩展到每秒数百万次读取。

作为副本集进行连接并将读取分发到副本的关键好处是,它增加了群集中可用于应用程序的总体资源。作为最佳实践,我们建议您以副本集形式连接。此外,我们最常建议在以下情况下使用:

  • 你在主机上使用了近 100% 的 CPU。

  • 缓冲区缓存命中率接近零。

  • 您已达到单个实例的连接或光标限制。

扩展集群实例大小是一种选择,在某些情况下,这可能是扩展集群的最佳方法。但是,您还应考虑如何更好地使用集群中已有的副本。这使您可以在不增加使用更大实例类型的成本的情况下增加规模。我们还建议您监控这些限制并提醒这些限制(即CPUUtilizationDatabaseConnections, 和BufferCacheHitRatio) 使用 CloudWatch 警报,以便您知道资源何时被大量使用。

有关更多信息,请参阅以下主题:

使用群集连接

请考虑使用集群中所有连接的情况。例如,r5.2xlarge实例的连接数限制为 4,500(以及 450 个打开的游标)。如果您创建了三个实例的 Amazon DocumentDB 集群,并且只使用集群终端节点连接到主实例,则打开的连接和游标的集群限制分别为 4,500 和 450。如果您正在构建的应用程序要使用许多在容器中启动的工作程序,那么可能会达到这些限制。容器同时打开多个连接,使集群饱和。

相反,您可以作为副本集连接到 Amazon DocumentDB 集群,然后将读取内容分发到副本实例。然后,您可以有效地将群集中可用连接和游标的数量增加三倍,分别为 13,500 和 1,350 个。向群集添加更多实例只会增加读取工作负载的连接和游标数量。如果您需要增加写入集群的连接数量,我们建议您增加实例大小。

注意

的连接数largexlarge, 和2xlarge实例随着实例大小高达 4,500 个而增加。每个实例的最大连接数4xlarge实例或更高的实例为 4,500 个。有关实例类型限制的更多信息,请参阅。实例限制.

一般而言,我们不建议使用 secondary 的读取首选项连接到集群。这是因为如果集群中没有副本实例,则读取操作将失败。例如,假设您具有两个实例的 Amazon DocumentDB 集群,其中包含一个主副本和一个副本。如果副本有问题,请从设置为的连接池中读取请求secondary失败。的优势secondaryPreferred是,如果客户端找不到要连接的合适的副本实例,它会回到主实例进行读取。

多个连接池

在某些情况下,应用程序中的读取需要具有写后读一致性,这只能从 Amazon DocumentDB 中的主实例提供。在这些情况下,您可以创建两个客户端连接池:一个用于写入,另一个用于需要后写一致性的读取。要做到这一点,您的代码将类似于下文。

## Create a MongoDB client, ## open a connection to Amazon DocumentDB as a replica set and specify the readPreference as primary clientPrimary = pymongo.MongoClient('mongodb://<user-name>:<password>@mycluster.node.us-east-1.docdb.amazonaws.com:27017/?replicaSet=rs0&readPreference=primary') ## Create a MongoDB client, ## open a connection to Amazon DocumentDB as a replica set and specify the readPreference as secondaryPreferred secondaryPreferred = pymongo.MongoClient('mongodb://<user-name>:<password>@mycluster.node.us-east-1.docdb.amazonaws.com:27017/?replicaSet=rs0&readPreference=secondaryPreferred')

另一种选择是创建单个连接池并覆盖给定集合的读取首选项。

##Specify the collection and set the read preference level for that collection col = db.review.with_options(read_preference=ReadPreference.SECONDARY_PREFERRED)

摘要

为了更好地使用集群中的资源,我们建议您使用副本集模式连接到您的集群。如果它适合您的应用程序,则可以通过将读取内容分发到副本实例来读取扩展应用程序。