分布式查询
从副本集读取操作
默认情况下,客户端从副本集的主节点读取;然而,客户端可以指定一个读取偏好,将读取操作定向到其他成员。例如,客户端可以配置读取偏好以从辅助节点或从最近的成员读取
以减少多数据中心部署的延迟,
通过分配高读取量(相对于写入量)来提高读取吞吐量,
执行备份操作,以及/或
在选举新的主节点之前允许读取。
从副本集的辅助节点读取的操作可能不会反映主节点的当前状态。将读取操作定向到不同服务器的读取偏好可能会导致非单调读取。
客户端可以使用因果一致性会话,这提供包括单调读取在内的各种保证。
副本集上的写入操作
在副本集中,所有写操作都发送到集的主节点。主节点应用写操作并在主节点的操作日志或oplog上记录操作。oplog是针对数据集的操作的可重复序列。集的次要成员持续复制oplog并在异步过程中将操作应用于自身。
对分片集群的读取操作
分片集群允许您以对应用程序几乎透明的的方式在集群中的mongod
实例之间分区数据集。有关分片集群的概述,请参阅本手册的分片部分。
对于分片集群,应用程序向与集群关联的一个mongos
实例发出操作。
当读取操作指向特定分片时,分片集群上的读取操作效率最高。对分片集合的查询应包含集合的分片键。当查询包含分片键时,mongos
可以使用来自配置数据库的集群元数据来将查询路由到分片。
如果查询不包含分片键,mongos
必须将查询定向到集群中的所有分片。这些分散收集查询可能效率低下。在较大的集群上,分散收集查询对于常规操作来说不可行。
对于副本集分片,从副本集的次要成员读取操作可能无法反映主节点的当前状态。将读取操作直接导向不同服务器的读取偏好可能会导致非单调读取。
注意
客户端可以使用因果一致性会话,这提供了各种保证,包括单调读取。
分片副本集的所有成员,而不仅仅是主节点,都维护有关数据块元数据的元数据。这防止了在不使用读取关注
"available"
的情况下,从次要成员读取操作返回孤立数据。在早期版本中,无论读取关注如何,从次要成员的读取都可能返回孤立文档。
分片集群上的写入操作
对于分片集群中的分片集合,mongos
将应用程序的写入操作直接导向负责数据集特定部分的分片。mongos
使用来自配置数据库的集群元数据来路由写入操作到适当的分片。
MongoDB根据分片键的值将分片集合中的数据分成范围。然后,MongoDB将这些数据块分布到分片。分片键决定了数据块到分片的分布。这可能影响集群中写入操作的性能。
如果分片键的值在每次插入时增加或减少,所有插入操作都针对单个分片。因此,单个分片的容量成为分片集群插入容量的限制。