Docs 菜单
Docs 主页
/
MongoDB Manual
/ /

分布式查询

在此页面上

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

默认,客户端从副本集的主节点 (primary node in the replica set)节点读取;但是,客户端可以指定读取偏好(read preference),将读取操作定向到其他成员。 示例,客户端可以将读取偏好配置为从节点或最近的节点读取,以便:

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

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

  • 执行备份操作,和/或

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

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

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

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

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

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

读取和写入主节点的默认路由示意图。
点击放大

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

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

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

分片集群图表。
点击放大

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

对分片集群的读取操作。 查询条件包括分片键。 查询路由器“mongos”可以将查询定位到适当的一个或多个分片。

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

对分片集群的读取操作。查询条件不包括分片键。 查询路由器 ''mongos'' 必须将查询广播到集合的所有分片。

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

注意

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

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

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

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

分片集群图表。
点击放大

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

分片键值空间被分割为较小范围或数据块的示意图。

重要

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

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

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

提示

另请参阅:

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

后退

原子性和事务