Distributed Queries

在本页面

读取副本集的操作

默认情况下,Client 端从副本集的primary读取;但是,Client 端可以指定read preference来将读取操作定向到其他成员。例如,Client 端可以将读取首选项配置为从次要成员或最近成员读取:

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

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

  • 执行备份操作,和/或

  • 允许读取直到新的小学选出

将操作读取到副本集。默认读取首选项将读取路由到主数据库。 ``最近''的读取首选项会将读取路由到最近的成员。

来自副本集的次要成员的读取操作可能无法反映主要数据库的当前状态。将读取操作定向到不同服务器的读取首选项可能会导致非单调读取。

在 3.6 版中进行了更改:从 MongoDB 3.6 开始,Client 端可以使用causally consistent会话,这提供了各种保证,包括单调读取。

您可以基于每个连接或每个操作配置读取首选项。有关读取首选项或读取首选项模式的更多信息,请参见Read Preference读取首选项模式

对副本集进行写操作

replica sets中,所有写操作都转到集合的primary。主要对象应用写操作,并将操作记录在主要对象的操作日志或oplog上。操作日志是对数据集的可重复操作序列。该集合中的Secondary个成员连续复制操作日志,并在异步过程中对其自身应用操作。

读写主数据库的默认路由图。

有关副本集和写入操作的更多信息,请参见ReplicationWrite Concern

读取分片群集的操作

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

对于分片群集,应用程序向与该群集关联的mongos实例之一发出操作。

分片群集的示意图。

当分片群集上的读取操作定向到特定分片时,效率最高。分片集合的查询应包含集合的shard key。当查询中包含分片键时,mongos可以使用config database中的群集元数据将查询路由到分片。

将操作读取到分片群集。查询条件包括分片键。查询 Routermongos 可以将查询定位到适当的一个或多个分片。

如果查询不包含分片键,则mongos必须将查询定向到集群中的* all *分片。这些“分散收集”查询可能效率低下。在较大的集群上,分散收集查询对于常规操作是不可行的。

将操作读取到分片群集。查询条件不包含分片键。查询 Routermongos 必须将查询 Broadcast 到所有分片以进行收集。

对于副本集分片,从副本集的次要成员进行的读取操作可能无法反映主副本集的当前状态。将读取操作定向到不同服务器的读取首选项可能会导致非单调读取。

Note

从 MongoDB 3.6 开始,

  • Client 端可以使用causally consistent会话,这提供了各种保证,包括单调读取。

  • 碎片副本集的所有成员(不仅是主要副本副本)都维护有关块元数据的元数据。如果不使用读取关注对象"available",这可以防止从辅助对象读取的内容返回orphaned data。在较早的版本中,无论是否考虑读取问题,从次要对象进行的读取都可能返回孤立文档。

有关分片群集中读取操作的更多信息,请参见mongosShard Keys部分。

在分片群集上的写入操作

对于sharded cluster中的分片集合,mongos将应用程序的写入操作定向到负责数据集特定部分的分片。 mongos使用来自config database的群集元数据将写入操作路由到适当的分片。

分片群集的示意图。

MongoDB 基于shard key的值将分片集合中的数据划分为* ranges。然后,MongoDB 将这些块分配给分片。分片键确定块到分片的分布。这可能会影响群集中写操作的性能。

分片键值空间细分为较小范围或块的图。

Important

影响**文档*的更新操作必须包含shard key_id字段。如果更新具有shard key,则在某些情况下影响多个文档的更新效率更高,但可以 Broadcast 到所有分片。

如果分片键的值在每次插入时增加或减少,则所有插入操作都将针对单个分片。结果,单个分片的容量成为分片 Cluster 的插入容量的限制。

有关更多信息,请参见Sharding批量写入操作