连接至 Amazon DocumentDB 作为副本集

当您正在开发时 Amazon DocumentDB(与 MongoDB 兼容)我们建议您使用驱动程序的内置读取首选项功能将您的群集连接到副本集并将读取分发给复制副本实例。本部分深入了解这意味着什么意思,并描述如何连接到您的 Amazon DocumentDB 群集作为副本集,使用 SDK for Python 作为示例。

Amazon DocumentDB 有三个端点可用于连接到群集:

  • 集群终端节点

  • 读取方终端节点

  • 实例端点

在大多数情况下, Amazon DocumentDB,建议您使用群集端点。这是指向群集中主实例的名称,如下图所示。

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

注意

有关 Amazon DocumentDB 端点,参见 Amazon DocumentDB 终端节点.


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

使用群集端点,您可以在副本集模式下连接到群集。然后,您可以使用内置读取偏好驱动器功能。在以下示例中,指定 /?replicaSet=rs0 表示要连接为副本集的SDK。如果你忽略 /?replicaSet=rs0',客户端将所有请求路由到群集端点,即主实例。

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

作为复制副本集的优势在于,它可以使SDK自动发现群集拓扑,包括从群集中添加或删除实例。然后,您可以通过将读取请求路由到复制副本实例,更高效地使用群集。

当您连接为副本集时,可以指定 readPreference 关于连接。如果您指定读取首选项 secondaryPreferred,客户端将读取的查询路由到您的主要实例的副本和写入查询(如下图所示)。这就是更好的群集资源使用方法。有关更多信息,请参阅 读取首选项选项.

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


         图示显示 Amazon DocumentDB ReadPreference:第二偏好。

从 Amazon DocumentDB 副本最终一致。它们会以一个主要的顺序返回数据,并且通常小于50ms复制延迟。您可以使用 Amazon CloudWatch 度量 DBInstanceReplicaLagDBClusterReplicaLagMaximum…有关详细信息,请参阅 使用 Amazon DocumentDB 监控 CloudWatch.

与传统单片数据库架构不同, Amazon DocumentDB 分离存储和计算。考虑到这种现代化架构,我们鼓励您在复制副本实例上读取称重器。在复制副本实例上读取不会阻止从主实例复制的写入。您可以在群集中添加多达15个读取副本实例,并且每秒可以向外扩展到数百万读取数。

作为复制副本集和分发对复制副本的读取的关键好处,就是它增加了可用于应用程序的群集中的整体资源。我们建议将其作为一个最佳实践的副本集连接。此外,我们最常在以下情景中建议您:

  • 您在主要的CPU上使用近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. 在这些情况下,您可以创建两个客户端连接池:一个用于写入,一个用于需要读取后读取一致性的读取。为此,您的代码会看起来像以下。

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

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

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

Summary

要更好地使用群集中的资源,建议使用副本集模式连接到群集。如果适用于您的应用程序,您可以通过将读取分发到复制副本实例,读取应用程序的扩展名。