读取关注点"available"
具有 "available"
读取关注点的查询返回数据,但不保证数据已写入大多数副本集成员(即可能被回滚)。
对于分片集群,
"available"
读取关注点提供了对分区的更大容错能力。具有
"available"
读取关注点的查询不需要检查是否正确接收查询的正确分片。在网络分区的情况下,这些查询路由到网络分区发生之前认为适当的分片。它们不会等待来自可能不可用的服务器的一致性保证。如果分片正在执行数据分块迁移,具有
"available"
的查询可以返回孤儿文档.警告
mongos
不保证具有"available"
读取关注点的查询路由到正确的分片。接收查询的分片返回数据,但此分片可能不是请求数据的权威所有者。这可能导致查询返回不正确或意外的结果。
对于未分片的集合(包括独立部署或副本集部署中的集合),
"local"
和"available"
读取关注点行为相同。
无论读取关注点级别如何,节点上最新的数据可能不会反映系统中最新的数据版本。
可用性
读取关注点 "available"
是不可用于因果一致会话和事务。
示例
考虑以下写操作的时序:将写操作 0 写入三成员副本集
注意
为了简化,示例假设
写操作 0 之前的所有写操作都已成功复制到所有成员。
写操作 prev 是写操作 0 之前的上一个写操作。
写操作 0 之后没有发生其他写操作。
时间 | 事件 | 最新写操作 | 最新的 "majority" 写操作 |
---|---|---|---|
t 0 | 主节点应用写操作 0 | 主节点:写操作 0 从节点 1:写操作 prev 从节点 2:写操作 prev | 主节点:写操作 prev 从节点 1:写操作 prev 从节点 2:写操作 prev |
t 1 | 从节点 1 应用写操作 0 | 主节点:写操作 0 从节点 1:写操作 0 从节点 2:写操作 prev | 主节点:写操作 prev 从节点 1:写操作 prev 从节点 2:写操作 prev |
t 2 | 从节点 2 应用写操作 0 | 主节点:写操作 0 从节点 1:写操作 0 从节点 2:写操作 0 | 主节点:写操作 prev 从节点 1:写操作 prev 从节点 2:写操作 prev |
t 3 | 主节点意识到成功复制到从节点 1 并向客户端发送确认 | 主节点:写操作 0 从节点 1:写操作 0 从节点 2:写操作 0 | 主节点:写操作 0 从节点 1:写操作 prev 从节点 2:写操作 prev |
t 4 | 主节点意识到成功复制到从节点 2 | 主节点:写操作 0 从节点 1:写操作 0 从节点 2:写操作 0 | 主节点:写操作 0 从节点 1:写操作 prev 从节点 2:写操作 prev |
t 5 | 从节点 1 收到通知(通过常规复制机制)以更新其最新 w: "majority" 写操作的快照 | 主节点:写操作 0 从节点 1:写操作 0 从节点 2:写操作 0 | 主节点:写操作 0 从节点 1:写操作 0 从节点 2:写操作 prev |
t 6 | 从节点 2 收到通知(通过常规复制机制)以更新其最新 w: "majority" 写操作的快照 | 主节点:写操作 0 从节点 1:写操作 0 从节点 2:写操作 0 | 主节点:写操作 0 从节点 1:写操作 0 从节点 2:写操作 0 |
以下表格总结了在时间 T
时,具有 "available"
读取关注点的读操作所能看到的数据状态。
读取目标 | 时间 T | 数据状态 |
---|---|---|
主节点 | 在 t 0 之后 | 数据反映了写操作 0。 |
从节点 1 | 在 t 1 之前 | 数据反映了写操作 prev。 |
从节点 1 | 在 t 1 之后 | 数据反映了写操作 0。 |
从节点 2 | 在 t 2 之前 | 数据反映了写操作 prev。 |
从节点 2 | 在 t 2 之后 | 数据反映了写操作 0。 |