Docs 菜单
Docs 主页
/
MongoDB Manual
/ /

服务器选择算法

在此页面上

  • 副本集阅读取偏好
  • 分片集群的读取偏好

MongoDB驱动程序使用服务器选择算法来选择要使用的副本集成员,或者当连接到多个 mongos实例时,选择使用哪个mongos实例。

服务器选择在每次操作中进行一次。

此页面上的信息适用于在以下环境中托管的部署:

  • MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务

注意

包含读操作的分布式事务必须使用读取偏好 primary。给定事务中的所有操作必须路由至同一节点。

服务器选择在每次操作时都会发生一次,并受读取偏好localThresholdMS 设置的控制,以确定节点的读取资格。对于每个操作,都会重新评估读取偏好。

读取偏好模式
选择进程
primary (默认)
  1. 驱动程序会选择主节点。

  1. 驱动程序会收集符合条件的从节点名单。读取偏好中指定的 maxStalenessSeconds标签集可进一步限制成员的资格。

  2. 如果合格节点的列表不为空,则驱动程序将确定哪个合格节点“最近”(即具有最低平均网络往返时间的节点),并通过添加此“最近”服务器和 localThresholdMS 的平均往返时间来计算延迟窗口。驱动程序使用此延迟窗口将符合条件的节点列表缩减为位于此窗口内的节点。

  3. 在位于延迟窗口内的合格节点的列表中,驱动程序随机选择一个符合条件的节点。

  1. 驱动程序会收集符合条件的成员列表(主节点和从节点)。读取偏好中指定的 maxStalenessSeconds标签集可进一步限制成员的资格。

  2. 如果符合条件的节点列表不为空,则驱动程序将确定哪个合格节点“最近”(即平均网络往返时间最短的节点),并通过添加此“最近”的服务器和 localThresholdMS 的平均往返时间来计算延迟窗口[1]。驱动程序使用此延迟窗口将符合条件的节点列表缩减为位于此窗口内的节点。

  3. 在位于延迟窗口内的合格节点的列表中,驱动程序随机选择一个符合条件的节点。

  1. 如果主节点可用,驱动程序将选择主节点。

  2. 如果主节点不可用,服务器选择将按照读取偏好 secondary 的流程选择符合条件的从节点。

  1. 按照读取偏好 secondary 的服务器选择进程,如果符合条件的从节点列表非空,则驱动程序会选择符合条件的从节点。

  2. 否则,如果列表为空,驱动程序将选择主节点。

如果连接种子列表中存在多个 mongos 实例,则驱动程序将确定哪个 mongos 是“最接近的”(即具有最低平均网络往返时间的节点),并通过添加此“最接近”的 mongos 实例和 localThresholdMS 的平均往返时间来计算延迟窗口。该驱动程序将在延迟窗口内的 mongos 实例之间随机进行负载平衡。

对于具有副本集分片的分片集群,mongos 在读取分片时会应用读取偏好。服务器选择受读取偏好replication.localPingThresholdMs 设置的控制。对于每个操作,都会重新评估读取偏好。

mongos 支持非 primary 读取偏好模式的对冲读操作。也就是说,如果使用非 primary 读取偏好,则 mongos 可以向其他节点发送额外读取,以对冲读取操作。为对冲读取操作而发送的额外读取使用 maxTimeMSForHedgedReadsmaxTimeMS值。

以下操作支持对冲读:

要使用对冲读:

读取偏好模式
选择进程
primary (默认)
  1. mongos 选择主节点。

  1. mongos 会汇总一份合格的从节点。读取偏好中指定的 maxStalenessSeconds标签集 可以进一步限制成员的资格。

  2. 如果符合条件的成员列表不为空,mongos 就会确定哪个符合条件的成员“最近”(即平均网络往返时间最短的成员),并将该“最近”服务器的平均往返时间与 replication.localPingThresholdMs(或 --localThreshold 命令行选项)相加,计算出延迟窗口。mongos 会利用这一延迟窗口,将符合条件的成员缩减至该窗口内的成员。

  3. 从位于延迟窗口内的合格节点的列表中,mongos 随机选择符合条件的节点。如果使用对冲读mongos 会选择第二个符合条件的节点(如果可用)。

  1. mongos 收集符合条件的成员列表(主节点和从节点)。读取偏好中指定的 maxStalenessSeconds标签集可进一步限制成员的资格。

  2. 如果符合条件的成员列表不为空,mongos 会确定哪个符合条件的成员“最近”(即平均网络往返时间最短的成员),并将该“最近”服务器的平均往返时间与 replication.localPingThresholdMs(或 --localThreshold 命令行选项)相加,计算出延迟窗口 [1]mongos 会利用这一延迟窗口,将符合条件的成员缩减至该窗口范围内的成员。

  3. 从位于延迟窗口内的合格节点的列表中,mongos 随机选择符合条件的节点。如果使用对冲读mongos 会选择第二个符合条件的节点(如果可用)。

  1. 如果主节点可用,mongos 将选择主节点。

  2. 如果主节点不可用,或者 mongos 正在使用对冲读取,则服务器选择遵循读取偏好 secondary 的流程。对于对冲读取,

    • 如果主节点可用,mongos 将选择一个符合条件的从节点(如有)。

    • 如果主节点不可用,mongos 会选择两个符合条件的从节点(如果有的话)。

  1. 按照读取偏好 secondary 的服务器选择进程,如果符合条件的从节点列表非空,则 mongos 会选择符合条件的从节点。如果使用对冲读mongos 会选择另一个从节点(如果可用)。

  2. 如果符合条件的从节点列表为空,或者 mongos 使用对冲读且只有一个符合条件的从节点可用,mongos 将选择主节点。

[1](1, 2) 默认阈值为 15 毫秒。

后退

对冲读 (Hedged Reads)