Docs 菜单

分布式查询

默认情况下,客户端可从副本集的主节点读取;但是,客户端可以指定读取偏好,将读取操作定向到其他成员。例如,客户端可以将读取偏好配置为从从节点或最近的成员读取,以便:

  • 减少多数据中心部署的延迟,

  • 通过分配高读取容量(相对于写入容量)来提高读取吞吐量,

  • 执行备份操作,和/或

  • 允许读取,直到选出新的主节点

Read operations to a replica set. Default read preference routes the read to the primary. Read preference of ``nearest`` routes the read to the nearest member.
点击放大

从副本集的从节点成员执行的读取操作可能无法反映主节点的当前状态。 将读取操作传送到不同服务器的读取偏好可能会导致非单调读取。

客户端可以使用因果一致的会话,这提供了各种保障,包括单调读取。

您可以按连接或按操作配置读取偏好。有关读取偏好或读取偏好模式的更多信息,请参阅读取偏好读取偏好模式

副本集中的所有写操作都会转到副本集的主节点。主节点执行写操作,并将操作记录在主节点的操作日志或 oplog 上。oplog 是对数据集进行操作的可重复序列。集合的二级成员不断复制 oplog,并在异步过程中对自己进行操作。

Diagram of default routing of reads and writes to the primary.
点击放大

有关副本集和写入操作的更多信息,请参阅复制写关注

分片集群允许您以对应用程序几乎透明的方式在 mongod 实例集群之间对数据集进行分区。有关分片集群的概述,请参阅本手册的分片部分。

对于分片集群,应用程序会将操作发送给与集群关联的其中一个 mongos 实例。

Diagram of a sharded cluster.
点击放大

在传送到特定分片时,对分片集群的读取操作效率最高。对分片集合的查询应包含集合的分片键。在查询包含分片键时,mongos 可以使用配置数据库中的集群元数据将查询路由到分片。

Read operations to a sharded cluster. Query criteria includes the shard key. The query router ``mongos`` can target the query to the appropriate shard or shards.

如果查询不包含分片键,mongos 必须将查询传送到集群中的所有 分片。这些分散聚集 查询可能效率低下。在较大的集群上,分散聚集查询对于常规操作是不可行的。

Read operations to a sharded cluster. Query criteria does not include the shard key. The query router ``mongos`` must broadcast query to all shards for the collection.

对于副本集分片,从副本集从节点进行的读取操作可能不会反映主节点的当前状态。将读取操作传送到不同服务器的读取偏好可能会导致非单调读取。

注意

  • 客户端可以使用因果一致的会话,这提供了各种保障,包括单调读取。

  • 分片副本集的所有节点(不仅仅是主节点)都保留有关数据段元数据的元数据。如果不使用读关注 "available",这可以防止从从节点进行的读取返回孤立数据。在早期版本中,无论读关注如何,从从节点进行的读取都可能会返回孤立文档。

有关分片集群中读取操作的更多信息,请参阅 mongos分片键部分。

对于分片集群中的分片集合,mongos 将写入操作从应用程序传送到负责数据集的特定部分 的分片。mongos 使用配置数据库中的集群元数据将写入操作路由到相应的分片。

Diagram of a sharded cluster.
点击放大

MongoDB 根据分片键的值将分片集合中的数据划分为多个范围。然后,MongoDB 将这些数据段分发到分片。分片键确定如果将数据段分发到分片。这可能会影响集群中的写入操作性能。

Diagram of the shard key value space segmented into smaller ranges or chunks.

重要

影响单个文档的更新操作必须包含分片键_id 字段。在某些情况下,如果具有分片键,影响多个文档的更新则效率会更高,但可以广播到所有分片。

如果分片键的值随着每次插入而增加或减少,则所有插入操作都针对单个分片。因此,单个分片的容量会成为分片集群插入容量的上限。

有关更多信息,请参阅分片批量写入操作

从 MongoDB 5.3 开始,在范围迁移期间,不会为孤立文档的更新生成 change stream 事件。