Docs 菜单
Docs 主页
/
MongoDB Manual
/ /

读关注 (read concern) "available"

具有 "available" 读关注的查询从实例中返回数据,但不保证数据已写入到大多数副本集节点(即可能会回滚)。

  • 对于分片集群 "available"读关注为分区提供了更高的容忍度。

    具有 "available" 读关注的查询不需要进行检查,以确保正确的分区收到了查询。

    事件出现网络分区,这些查询会在网络分区发生之前路由到分片认为合适的分片。 它们不会等待来自可能不可用的服务器的一致性ACID 一致性保证。 如果分片正在进行数据数据块迁移,则使用"available"的查询可能会返回孤立文档。

    警告

    mongos 不能保证读关注为 "available" 的查询会路由到正确的分片。接收查询的分片返回数据,但此分片可能不是所请求数据的权威所有者。

    这可能会导致查询返回不正确或意想不到的结果。

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

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

提示

另请参阅:

读关注"available" 不可用于因果一致的会话和事务。

考虑以下对三节点副本集执行 Write 0 写入操作的时间轴:

注意

为简单起见,该示例预设以下条件:

  • Write 0 之前的所有写入均已成功复制到所有成员。

  • Write prev 是 Write 0 前一次的写入操作。

  • Write 0 之后没有发生其他写入操作。

对一个三节点组成的副本集执行写入操作的时间轴
时间
事件
最新写入
最新 w: "majority" 写入

t 0

主节点应用 Write 0

Primary: Write 0
Secondary 1: Write prev
Secondary 2: Write prev
Primary: Write prev
Secondary 1: Write prev
Secondary 2: Write prev

t 1

从节点 1 应用 write 0

Primary: Write 0
Secondary 1: Write 0
Secondary 2: Write prev
Primary: Write prev
Secondary 1: Write prev
Secondary 2: Write prev

t 2

从节点 2 应用 write 0

Primary: Write 0
Secondary 1: Write 0
Secondary 2: Write 0
Primary: Write prev
Secondary 1: Write prev
Secondary 2: Write prev

t 3

主节点知道已成功复制到从节点 1,并向客户端发送确认

Primary: Write 0
Secondary 1: Write 0
Secondary 2: Write 0
Primary: Write 0
Secondary 1: Write prev
Secondary 2: Write prev

t 4

主节点感知到数据已成功复制到从节点 2

Primary: Write 0
Secondary 1: Write 0
Secondary 2: Write 0
Primary: Write 0
Secondary 1: Write prev
Secondary 2: Write prev

t 5

从节点 1 收到通知(通过常规复制机制),要求更新其最新 w: "majority" 写入的快照

Primary: Write 0
Secondary 1: Write 0
Secondary 2: Write 0
Primary: Write 0
Secondary 1: Write 0
Secondary 2: Write prev

t 6

从节点 2 收到通知(通过常规复制机制),要求更新其最新 w: "majority" 写入的快照

Primary: Write 0
Secondary 1: Write 0
Secondary 2: Write 0
Primary: Write 0
Secondary 1: Write 0
Secondary 2: Write 0

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

对一个三节点组成的副本集执行写入操作的时间轴。
读取目标
时间 T
数据状态

主节点

t 0之后

数据反映写入 0

从节点 1

t1 之前

数据反映为 Write prev 应用后的状态

从节点 1

在 t 1 之后

数据反映为 Write 0 应用后的状态

从节点 2

t 2 之前

数据反映为 Write prev 应用后的状态

从节点 2

在 t 2 之后

数据反映为 Write 0 应用后的状态

后退

"local"