读优先
默认情况下,客户端从主节点读取数据;但是,客户端可以指定读取首选项,以将读取操作发送到从节点。
异步复制到从节点意味着向从节点读取数据可能会返回与主节点不一致的数据。包含读取操作的多文档事务必须使用读取主节点优先。给定事务中的所有操作必须路由到同一成员。
数据可见性
根据读取的关注点,客户端可以在持久化写入前查看写入结果:
- 不管写的 write concern (opens new window)如何设置,其他使用
"local"
(opens new window)或"available"
(opens new window)的读配置的客户端都可以向发布客户端确认写操作之前看到写操作的结果。 - 使用
"local"
(opens new window)或"available"
(opens new window)读取配置的客户端可以读取数据,这些数据随后可能会在副本集故障转移期间回滚。
对于多文档事务中的操作,当事务提交时,在事务中进行的所有数据更改都将保存,并在事务外部可见。也就是说,事务在回滚其他事务时将不会提交其某些更改。在提交事务前,事务外部看不到在事务中进行的数据更改。
但是,当事务写入多个分片时,并非所有外部读操作都需要等待已提交事务的结果在所有分片上可见。例如,如果提交了一个事务,并且在分片 A 上可以看到写 1,但是在分片 B 上还看不到写 2,则在 "local"
(opens new window)读配置级别,外部读取可以读取写 1 的结果而看不到写 2。
镜像读取
从 MongoDB 4.4 开始,MongoDB 提供镜像读取以预热可选从节点(即优先级大于 0 的成员)的缓存。使用镜像读取(默认情况下已启用),主节点可以镜像它接收到的一部分操作,并将其发送给可选择的从节点的子集。子集的大小是可配置的。
下一节:当 MongoDB 需要存储海量数据时,单节点不足以存储全量数据,且可能无法提供令人满意的吞吐量。所以,可以通过 MongoDB 分片机制来支持水平扩展。