文档菜单
文档首页
/
MongoDB 手册
/ /

分布式查询

本页内容

  • 副本集的读取操作
  • 副本集上的写入操作
  • 分片集群的读取操作
  • 分片集群上的写入操作
  • 更改流和孤立文档

默认情况下,客户端从副本集的主节点读取;然而,客户端可以指定一个读取偏好,将读取操作定向到其他成员。例如,客户端可以配置读取偏好以从辅助节点或从最近的成员读取

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

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

  • 执行备份操作,以及/或

  • 在选举新的主节点之前允许读取。

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版本开始,在范围迁移过程中,对于孤儿文档的更新不会生成变更流事件。

返回

原子性与事务