分布式查询

在本页面

读取副本 Sets 的操作

默认情况下,clients 从副本集中读取;但是,clients 可以指定阅读偏好以将读取操作指向其他成员。对于 example,clients 可以配置读取首选项以从辅助节点或从最近的成员读取:

  • 减少 multi-data-center 部署中的延迟,

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

  • 执行备份操作,and/or

  • 允许读取直到新的小学选举产生

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

来自副本_set 的辅助成员的读取操作可能不会反映主要的当前 state。读取将操作定向到不同服务器的首选项可能会导致 non-monotonic 读取。

更改 version 3.6:从 MongoDB 3.6 开始,客户端可以使用因果关系一致会话,它提供各种保证,包括单调读取。

您可以在 per-connection 或 per-operation 的基础上配置读取首选项。有关读取首选项或读取首选项模式的更多信息,请参阅阅读偏好读取首选模式

在副本 Sets 上编写操作

副本 sets中,所有写操作都转到集合。主要应用写入操作并在主要操作 log 或OPLOG上记录操作。 oplog 是对数据集的可重现操作序列。 次要集合的成员不断复制 oplog 并在异步 process 中将操作应用于自身。

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

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

读取碎片集群的操作

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

对于分片 cluster,applications 对与 cluster 关联的mongos实例之一发出操作。

分片 cluster 的图。

当定向到特定分片时,对分片群集的读取操作最有效。对分片集合的查询应包括集合的碎片 key。当查询包含分片 key 时,mongos可以使用配置数据库中的 cluster 元数据来将查询路由到分片。

读取分片 cluster 的操作。查询条件包括 shard key。查询 routermongos可以将查询定位到适当的分片或分片。

如果查询不包含分片 key,则mongos必须将查询定向到 cluster 中的所有分片。这些分散收集查询可能效率低下。在较大的集群上,分散集合查询对于例行操作是不可行的。

读取分片 cluster 的操作。查询条件不包括分片 key。查询 routermongos必须 broadcast 查询集合的所有分片。

对于副本集分片,副本_set 的辅助成员的读取操作可能不会反映主要的当前 state。读取将操作定向到不同服务器的首选项可能会导致 non-monotonic 读取。

注意

  • Clients 可以使用因果关系一致会话,它提供各种保证,包括单调读取。

  • 分片副本集的所有成员(而不仅仅是主分区)维护有关块元数据的元数据。如果不使用读取关注点“可用”,这可以防止来自辅助节点的读取返回孤儿数据。在早期版本中,无论读取问题如何,来自辅助节点的读取都可以 return 孤立的文档。

有关分片群集中的读取操作的详细信息,请参阅mongos碎片钥匙部分。

在 Sharded Clusters 上编写操作

对于分片 cluster中的分片集合,mongos将写操作从 applications 引导到负责数据集特定部分的分片。 mongos使用配置数据库中的 cluster 元数据来将写操作路由到适当的分片。

分片 cluster 的图。

MongoDB 根据碎片 key的值将分片集合中的数据分区为范围。然后,MongoDB 将这些块分发给分片。 shard key 确定块到分片的分布。这可能会影响 cluster 中写操作的 performance。

shard key value 空间的图表被分割成更小的范围或块。

重要影响单个文档的更新操作**必须包括碎片 key_id字段。影响多个文档的更新在某些情况下更有效,如果它们具有碎片 key,但可以 broadcast 到所有分片。

如果每个 insert 的 shard key 的 value 增加或减少,则所有 insert 操作都会针对单个分片。因此,单个分片的容量将成为分片 cluster 的 insert 容量的限制。

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

也可以看看 可重试的写入