Docs 菜单

Docs 主页开发应用程序MongoDB Manual

读取偏好

在此页面上

  • 读取偏好模式
  • 行为
  • 读取偏好模式
  • 配置读取偏好
  • 读取偏好和事务
  • 其他注意事项

读取偏好描述 MongoDB 客户端如何将读取操作路由到副本集的节点。

针对副本集的读取操作。默认读取偏好会将此读取操作路由到主节点。"nearest" 读取偏好会将该读取操作路由到最近的节点。
点击放大

默认情况下,应用程序将其读取操作定向到副本集主节点(即读取偏好模式“主节点”)。但是,客户端可以指定读取偏好以将读取操作发送到从节点。

读取偏好由读取偏好模式和可选的标签集列表maxStalenessSeconds选项和对冲读选项组成。对冲读选项可用于分片集群,用于使用非 primary读取偏好的读取。

下表给出读取偏好模式的简要摘要:

注意

primary读取偏好(read preference)模式支持分片集群上的对冲读

读取偏好模式
说明
primary

默认模式。从当前副本集主节点读取的所有操作。

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

在大多数情况下,操作将从主节点读取,但如果主节点不可用,则操作将从从节点成员读取。

读取偏好primaryPreferred支持对分片集群进行对冲读

所有操作均会从副本集的辅助成员中读取。

读取偏好secondary支持对分片集群进行对冲读

操作通常从副本集的从节点成员读取数据。如果副本集只有一个主节点成员,并且没有其他成员,则操作将从主节点成员读取数据。

读取偏好secondaryPreferred支持对分片集群进行对冲读

根据指定的延迟阈值,从符合条件的随机副本集成员读取操作,无论该成员是主节点成员还是从节点成员。 该操作在计算延迟时会考虑以下因素:

读取偏好nearest支持分片集群上的对冲,并默认启用对冲读选项。

有关读取偏好模式的详细说明,请参阅读取偏好模式。

提示

另请参阅:

  • primary之外的所有读取偏好模式都可能返回过时数据,因为从节点在异步过程中从节点复制操作。 [ 1 ]如果您选择使用非primary模式,请确保应用程序可以容忍过时数据。

  • 读取偏好不影响数据的可见性;即客户端可以在写入结果被确认或传播到大多数副本集节点之前看到写入结果。有关详细信息,请参阅读取隔离、一致性和新近度

  • 读取偏好不会影响因果一致性。因果一致性会话为具有 "majority" 读关注的读取操作以及具有 "majority" 写关注的写入操作提供的因果一致性保证适用于 MongoDB 部署的所有节点。

primary

所有读取操作仅使用当前副本集主节点[1] 这是默认的读取模式。如果主节点不可用,则读取操作会产生错误或抛出异常。

primary读取偏好模式与使用标签集列表maxStalenessSeconds的读取偏好模式不兼容。如果指定标签集列表或带有primarymaxStalenessSeconds值,驱动程序将产生错误。

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

primaryPreferred

在大多数情况下,操作都是从副本集的主节点读取。但是,如果主节点不可用(例如在故障转移期间),则操作将从满足读取偏好的 maxStalenessSeconds 和标签集列表的从节点读取。

primaryPreferred读取偏好包含maxStalenessSeconds 值且没有可供读取的主节点时,客户端会通过将从节点的最后一次写入与最近一次写入的从节点进行比较来估计每个从节点的陈旧程度。然后,客户端会将读取操作定向到其估计延迟小于或等于maxStalenessSeconds的从节点。

当读取偏好包含标签集列表(标签集数组)时且没有可读取的主节点时,客户端会尝试查找具有匹配标签的从节点(按顺序尝试标签集,直到找到匹配项)。如果找到匹配的从节点,则客户端会从最近的匹配从节点群组中随机选择一个从节点。如果从节点没有匹配的标签,读取操作就会出错。

当读取偏好包含 maxStalenessSeconds标签集列表时,客户端首先按过时程度筛选,然后按指定标签筛选。

使用primaryPreferred模式的读取操作可能会返回过时的数据。使用maxStalenessSeconds选项避免从客户端估计过于陈旧的从节点读取数据。

注意

读取偏好primaryPreferred支持对分片集群进行对冲读

secondary

操作只能从副本集的从节点读取。如果没有可用的从节点,则此读取操作会出现错误或异常。

大多数副本集至少有一个从节点,但在某些情况下可能没有可用的从节点。例如,如果节点处于恢复状态或不可用状态,则由主节点、从节点和仲裁节点构成的副本集可能没有任何从节点。

secondary读取偏好包含maxStalenessSeconds 值时,客户端会通过将从节点的上次写入与主节点的上次写入进行比较来估计每个从节点的陈旧程度。然后,客户端会将读取操作定向到其估计延迟小于或等于maxStalenessSeconds的从节点。如果没有主节点,客户端将使用具有最近写入操作的从节点进行比较。

当读取偏好包含标签集列表(标签集数组)时,客户端会尝试查找具有匹配标签的从节点成员(按顺序尝试标签集,直到找到匹配项)。如果找到匹配的从节点,则客户端会从最近的匹配从节点群组中随机选择一个从节点。如果从节点没有匹配的标签,读取操作就会出错。

当读取偏好包含 maxStalenessSeconds标签集列表时,客户端首先按过时程度筛选,然后按指定标签筛选。

使用secondary模式的读取操作可能会返回过时的数据。使用maxStalenessSeconds选项避免从客户端估计过于陈旧的从节点读取数据。

注意

读取偏好secondary支持对分片集群进行对冲读

secondaryPreferred

操作通常从副本集的从节点成员读取数据。如果副本集只有一个主节点成员,并且没有其他成员,则操作将从主节点成员读取数据。

secondaryPreferred读取偏好包含maxStalenessSeconds 值时,客户端会通过将从节点的上次写入与主节点的上次写入进行比较来估计每个从节点的陈旧程度。然后,客户端会将读取操作定向到其估计延迟小于或等于maxStalenessSeconds的从节点。如果没有主节点,客户端将使用具有最近写入操作的从节点进行比较。如果不存在估计延迟小于或等于maxStalenessSeconds的从节点,则客户端会将读取操作定向到副本集的主节点。

当读取偏好包含标签集列表(标签集数组)时,客户端会尝试查找具有匹配标签的从节点成员(按顺序尝试标签集,直到找到匹配项)。如果找到匹配的从节点,则客户端会从最近的匹配从节点群组中随机选择一个从节点。如果不存在具备匹配标签的从节点,则客户端忽略标签并从主节点读取。

当读取偏好包含 maxStalenessSeconds标签集列表时,客户端首先按过时程度筛选,然后按指定标签筛选。

使用secondaryPreferred模式的读取操作可能会返回过时的数据。使用maxStalenessSeconds选项避免从客户端估计过于陈旧的从节点读取数据。

注意

读取偏好secondaryPreferred支持对分片集群进行对冲读

nearest

驱动程序从网络延迟处于可接受延迟窗口内的成员处读取数据。 nearest模式下的读取在路由读取操作时不考虑成员是主节点还是从节点:主节点和从节点被同等对待。

设置此模式可最大限度地减少网络延迟对读取操作的影响,而不会优先考虑当前或过时的数据。

当读取偏好包含 maxStalenessSeconds 值时,客户端会通过将从节点的最后一次写入与主节点的最后一次写入(如果可用)进行比较来估计每个从节点的陈旧程度;或者,如果没有主节点,则会将其与执行最近一次写入的从节点进行比较。然后,客户端会过滤掉其估计延迟大于 maxStalenessSeconds 的所有从节点,并将此读取操作随机定向到网络延迟不超过可接受延迟窗口的其余节点(主节点或从节点)。

如果指定标签集列表,则客户端会尝试查找与指定标签集列表匹配的副本集节点,并将读取定向到最近的群组中的任意节点。

当读取偏好包含 maxStalenessSeconds标签集列表时,客户端首先按过时程度筛选,然后按指定标签过滤。然后,客户端从剩余的 mongod 实例中,随机将读取定向到处于可接受延迟时间范围内的实例。读取偏好节点选择文档详细描述了该过程。

使用nearest模式的读取操作可能会返回过时的数据。使用maxStalenessSeconds选项避免从客户端估计过于陈旧的从节点读取数据。

注意

默认情况下,读取偏好nearest指定对分片集群上的读取使用对冲读

提示

另请参阅:

要了解特定读取偏好设置的使用案例,请参阅读取偏好使用案例

使用 MongoDB 驱动程序时,您可以使用驱动程序的读取偏好 API 指定读取偏好。请参阅驱动程序API 文档。您还可以在连接到副本集或分片集群时设置读取偏好(对冲读选项除外)。有关示例,请参阅连接字符串。

对于给定的读取偏好,MongoDB 驱动程序使用相同的节点选择逻辑

使用mongosh时,请参阅cursor.readPref()Mongo.setReadPref()

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

对于包含 $out$merge 阶段的聚合管道操作,无论读取偏好设置如何,管道都会在主节点上运行。

对于 mapReduce 操作,只有不写入数据的“内联” mapReduce 操作支持读取偏好。否则,mapReduce 操作将在主节点上运行。

[1]12某些情况下,副本集中的两个节点可能会暂时认为自己是主节点,但最多只有其中一个节点能够完成带有{ w: "majority" }写关注的写入。可以完成{ w: "majority" }写入的节点是当前主节点,另一个节点是尚未识别其降级(通常是由于网络分区)的前主节点。发生这种情况时,尽管已请求读取偏好primary ,但连接到前主节点的客户端可能会观察到过时数据,并且对前主节点的新写入操作最终将回滚。
← 副本集的写关注