Docs 菜单

Docs 主页开发应用程序MongoDB Manual

服务器选择算法

在此页面上

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

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

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

注意

包含读操作的分布式事务必须使用读取偏好 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 读取偏好(read preference) 模式的 对冲读mongos 。也就是说,如果使用非 读取偏好(readprimary preference) , 可以向另一个成员发送额外的读取操作(如果可用)以对冲读取操作。为对冲读取操作而发送的额外读取使用 的maxTimeMSmaxTimeMSForHedgedReads

以下操作支持对冲读:

要使用对冲读:

读取偏好模式
选择进程
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 毫秒。
← 读取偏好使用案例