读取关注点"多数派"
对于与多文档事务无关的读取操作,读取关注点 "多数派"
保证读取的数据已被副本集多数成员确认。读取的文档是持久的,并保证不会回滚。
对于 多文档事务中的操作,只有在事务以 写入关注点 "多数派" 提交时,读取关注点 "多数派"
才提供其保证。否则,"多数派"
读取关注点不提供关于事务中读取的数据的任何保证。
无论读取关注点级别如何,节点上最新的数据可能不会反映系统中最新的数据版本。
有关主节点失败时发生的情况的更多信息,请参阅 自动故障转移。
性能
每个副本集成员都在内存中维护一个在多数提交点上的数据视图;多数提交点由主节点计算。为了满足“多数”读关注,节点从该视图返回数据,其性能与其他读关注相当。
可用性
读关注 "majority"
可与或无因果一致性会话和事务一起使用。
警告
如果您使用的是三成员主-辅助仲裁器(PSA)架构,请考虑以下情况
如果辅助不可用或延迟,写关注
"majority"
可能会导致性能问题。有关减轻这些问题的建议,请参阅 使用自管理 PSA 副本集减轻性能问题。如果您使用的是全局默认
"majority"
且写关注小于多数的大小,您的查询可能返回过时的(未完全复制的)数据。
示例
考虑以下写操作的时序:将 0 写入三成员副本集
注意
为了简化,示例假设
在 Write 0 之前的所有写操作都已成功复制到所有成员。
Write prev 是 Write 0 之前的上一个写操作。
Write 0 之后没有发生其他写操作。
时间 | 事件 | 最近的写操作 | 最近的 w: "多数" 写操作 |
---|---|---|---|
t 0 | 主节点应用 Write 0 | 主节点: Write 0 副节点 1: Write prev 副节点 2: Write prev | 主节点: Write prev 副节点 1: Write prev 副节点 2: Write prev |
t 1 | 副节点 1 应用 write 0 | 主节点: Write 0 副节点 1: Write 0 副节点 2: Write prev | 主节点: Write prev 副节点 1: Write prev 副节点 2: Write prev |
t 2 | 副节点 2 应用 write 0 | 主节点: Write 0 副节点 1: Write 0 副节点 2: Write 0 | 主节点: Write prev 副节点 1: Write prev 副节点 2: Write prev |
t 3 | 主节点知道 Write 0 已成功复制到副节点 1 并向客户端发送确认 | 主节点: Write 0 副节点 1: Write 0 副节点 2: Write 0 | 主节点: Write 0 副节点 1: Write prev 副节点 2: Write prev |
t 4 | 主节点知道 Write 0 已成功复制到副节点 2 | 主节点: Write 0 副节点 1: Write 0 副节点 2: Write 0 | 主节点: Write 0 副节点 1: Write prev 副节点 2: Write prev |
t 5 | 副节点 1 收到通知(通过常规复制机制)以更新其最近的 w: "多数" 写操作的快照 | 主节点: Write 0 副节点 1: Write 0 副节点 2: Write 0 | 主节点: Write 0 副节点 1: Write 0 副节点 2: Write prev |
t 6 | 副节点 2 收到通知(通过常规复制机制)以更新其最近的 w: "多数" 写操作的快照 | 主节点: Write 0 副节点 1: Write 0 副节点 2: Write 0 | 主节点: Write 0 副节点 1: Write 0 副节点 2: Write 0 |
然后,以下表格总结了在时间 T
时,具有 "多数"
读取关注点的读取操作看到的数据状态。
读取目标 | 时间 T | 数据状态 |
---|---|---|
主节点 | 在 t 3 之前 | 数据反映 Write prev |
主节点 | 在 t 3 之后 | 数据反映 Write 0 |
副节点 1 | 在 t 5 之前 | 数据反映 Write prev |
副节点 1 | 在 t 5 之后 | 数据反映 Write 0 |
副节点 2 | 在或至 t 6 | 数据反映 Write prev |
副节点 2 | 在 t 6 之后 | 数据反映 Write 0 |
存储引擎支持
提示
对于WiredTiger存储引擎,可使用"majority"
读取关注级别。
命令serverStatus
返回storageEngine.supportsCommittedReads
字段,指示存储引擎是否支持"majority"
读取关注级别。
读取关注"majority"
和事务
注意
您可以在事务级别设置读取关注,而不是在单个操作级别。有关设置事务读取关注的信息,请参阅事务和读取关注。
在多文档事务中的操作,只有当事务与"majority"
写入关注一起提交时,读取关注"majority"
才提供其保证。否则,"majority"
读取关注不会对事务中读取的数据提供任何保证。
读取关注点 "majority"
和聚合
可以为包含 读取关注点 级别的聚合操作指定 "majority"
,该聚合操作包含一个 $out
阶段。
读取自己的写入
如果写入请求已确认,可以使用 因果一致会话 来读取自己的写入。
主-从-仲裁副本集
从 MongoDB 5.0 开始,由于存储引擎的改进,enableMajorityReadConcern
和 --enableMajorityReadConcern
无法更改,总是设置为 true
。
在MongoDB的早期版本中,enableMajorityReadConcern
和 --enableMajorityReadConcern
是可配置的,可以设置为 false
以防止存储缓存压力使具有三成员主-次-仲裁员(PSA)架构的部署停滞。
如果您使用的是三成员主-辅助仲裁器(PSA)架构,请考虑以下情况
如果辅助不可用或延迟,写关注
"majority"
可能会导致性能问题。有关减轻这些问题的建议,请参阅 使用自管理 PSA 副本集减轻性能问题。如果您使用的是全局默认
"majority"
且写关注小于多数的大小,您的查询可能返回过时的(未完全复制的)数据。