阅读关注“可用”

3.6 版的新功能。

具有读取关注点“可用”的查询从实例返回数据,而不能保证该数据已被写入大多数副本集成员(即可以回滚)。

如果读取与“ 因果一致的会话”不关联,则“读取关注”为“可用”是针对次要读取的默认设置。

对于分片群集,"available"读取关注点提供了更大的分区容忍度,因为它不 await 确保一致性的保证。但是,如果分片正在进行块迁移,则具有"available"读取关注点的查询可能会返回孤立文档,因为"available"读取关注点与"local"读取关注点不同,不会与分片的主数据库或配置服务器联系以获取更新的metadata

对于未分片的集合(包括独立部署或副本集部署中的集合),"local""available"读关注点的行为相同。

无论read concern级别如何,节点上的最新数据都可能无法反映系统中数据的最新版本。

因果一致的会话

阅读关注available无法用于因果一致的会话。

Example

考虑以下写入三个成员副本集的操作 Write0 的时间轴:

Note

为了简化,该示例假定:

  • Write0 之前的所有写操作已成功复制到所有成员。

  • Writeprev 是 Write0 之前的上一次写入。

  • Write0 之后未发生其他写操作。

对三个成员副本集的写操作的时间轴。

TimeEvent最近写最新 w:“多数”写道
t0主要适用 Write0小学 :写 0

中学 1:写上一页
中学 2:写上一页
小学 :写上一页
中学 1:写上一页
中学 2:写上一页
t1中学 1 应用 write0小学 :写 0
中学 1:写 0
中学 2:写上一页
小学 :写上一页
中学 1:写上一页
中学 2:写上一页
t2辅助 2 应用 write0主要 :写 0
中学 1:写 0
中学 2:写 0
小学 :写上一个
中学 1:写上一页
中学 2:写上一页
t3Primary 知道成功复制到 Secondary1 并将确认发送给 Client 端Primary :写 0
中学 1:写 0
中学 2:写 0
小学 :写 0
中学 1:写上一页
中学 2:写上一页
t4Primary 知道成功复制到 Secondary2Primary :写 0
中学 1:写 0
中学 2:写 0
小学 :写 0
中学 1:写上一页
中学 2:写上一页
t5Secondary1 收到通知(通过常规复制机制)以更新其最新 w 的快照:“多数”写主要 :写 0
中学 1:写 0
中学 2:写 0
小学 :写 0
中学 1:写 0
中学 2:写上一页
t6Secondary2 收到通知(通过常规复制机制)以更新其最近 w 的快照:“多数”写主要 :写 0
中学 1:写 0
中学 2:写 0
小学 :写 0
中学 1:写 0
中学 2:写 0

然后,下表总结了在时间T时具有"available"读关注的读操作将看到的数据状态。

对三个成员副本集的写操作的时间轴。

Read Target时间T数据状态
PrimaryAfter t0数据反映 Write0.
Secondary1Before t1数据反映 Writeprev
Secondary1After t1数据反映 Write0
Secondary2Before t2数据反映 Writeprev
Secondary2After t2数据反映 Write0