对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

服务器选择算法

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

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

注意

包含读取操作的事务必须使用读取偏好(read preference)primary。给定ACID 事务中的所有操作必须路由到同一成员。

服务器选择在每次操作时都会发生一次,并受读取偏好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 实例之间随机平衡。

注意

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 毫秒。