读关注 (read concern) "majority"
对于与多文档事务无关的读操作,读关注 "majority"
保证读取的数据已得到副本集大多数成员的确认。读取的文档是持久性的,并且保证不会回滚。
对于多文档事务中的操作,仅当事务提交时附带写关注“majority”,读关注 "majority"
才提供保证。否则,"majority"
读关注不保证事务中的数据读取。
无论读关注级别如何,节点上的最新数据可能无法反映系统中数据的最新版本。
有关主节点发生故障时会出现什么情况的更多信息,请参阅自动故障转移。
性能
每个副本集成员均会在内存中维护处于大多数提交点的数据的视图,而大多数提交点将由主节点算出。为完成读关注 "majority"
,此节点会从该视图返回数据,性能与其他读关注相当。
可用性
无论有没有因果一致的会话和事务,均可使用读关注 "majority"
。
警告
如使用主节点-从节点-仲裁节点 (PSA) 三成员架构,请考虑以下因素:
如果从节点不可用或滞后,写关注
"majority"
可能会导致性能问题。有关如何缓解这些问题的建议,请参阅缓解自管理 PSA 副本集的性能问题。如果使用的是全局默认值
"majority"
,并且写关注小于该默认值的大小,则查询可能会返回过时(未完全复制)的数据。
例子
考虑以下对三节点副本集执行 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 |
然后,下表汇总了具有 "majority"
读关注的读取操作在时间 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 应用后的状态 |
存储引擎支持
读关注 "majority"
适用于 WiredTiger 存储引擎。
提示
serverStatus
命令会返回 storageEngine.supportsCommittedReads
字段,而该字段可表示存储引擎是否支持 "majority"
读关注。
读关注"majority"
和事务
注意
您可以在事务级别设置读关注,而不是在单个操作级别。要为事务设置读关注,请参阅事务和读关注(read concern)。
对于多文档事务中的操作,仅当事务提交时附带写关注“majority”,读关注 "majority"
才提供保证。否则,"majority"
读关注不保证事务中的数据读取。
读关注"majority"
和聚合
您可以为包含 $out
阶段的聚合指定读关注级别 "majority"
。
读取自己的写入
如果写入请求确认,您可以使用因果一致的会话来读取您自己的写入。
主从仲裁副本集
从 MongoDB 5.0 开始,由于改进了存储引擎,enableMajorityReadConcern
和 --enableMajorityReadConcern
不可更改,并始终设置为 true
。
在 MongoDB 的早期版本中,enableMajorityReadConcern
和 --enableMajorityReadConcern
均可配置,可以设置为 false
,以防止由三个节点组成的主-从-仲裁 (PSA) 架构的部署因存储缓存压力而停止运行。
如使用主节点-从节点-仲裁节点 (PSA) 三成员架构,请考虑以下因素:
如果从节点不可用或滞后,写关注
"majority"
可能会导致性能问题。有关如何缓解这些问题的建议,请参阅缓解自管理 PSA 副本集的性能问题。如果使用的是全局默认值
"majority"
,并且写关注小于该默认值的大小,则查询可能会返回过时(未完全复制)的数据。