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