Docs 菜单
Docs 主页
/
MongoDB Manual
/ /

读关注 (read concern) "majority"

在此页面上

  • 性能
  • 可用性
  • 例子
  • 存储引擎支持
  • 读关注 "majority" 和事务
  • 读关注 "majority" 和聚合
  • 读取自己的写入
  • 主从仲裁副本集
"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
主节点: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
主节点知道已成功复制到从节点 1,并向客户端发送确认
主节点:Write 0
从节点 1:Write 0
从节点 2:Write 0
主节点:Write 0
从节点 1:Write prev
从节点 2:Write prev
t 4
主节点感知到数据已成功复制到从节点 2
主节点:Write 0
从节点 1:Write 0
从节点 2:Write 0
主节点:Write 0
从节点 1:Write prev
从节点 2:Write prev
t 5
从节点 1 收到通知(通过常规复制机制),要求更新其最新 w: "majority" 写入的快照
主节点:Write 0
从节点 1:Write 0
从节点 2:Write 0
主节点:Write 0
从节点 1:Write 0
从节点 2:Write prev
t 6
从节点 2 收到通知(通过常规复制机制),要求更新其最新 w: "majority" 写入的快照
主节点:Write 0
从节点 1:Write 0
从节点 2:Write 0
主节点:Write 0
从节点 1:Write 0
从节点 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" 读关注。

注意

您可以在事务级别设置读关注,而不是在单个操作级别。要为事务设置读关注,请参阅事务和读关注(read concern)。

对于多文档事务中的操作,仅当事务以写关注“majority”提交时,读关注"majority"才提供保证。否则, "majority"读关注无法保证事务中读取的数据。

您可以为包含 阶段的聚合指定"majority" 读关注$out 级别 。

3.6 版本中的更改

从 MongoDB 3.6 开始,如果写入请求确认,您可以使用因果一致的会话来读取您自己的写入。

MongoDB 3之前的版本。 6 ,为了读取您自己的写入,您必须使用{ w: "majority" }写关注发出写入操作,然后使用primary读取偏好以及"majority""linearizable"读关注发出读取操作。

从 MongoDB 5.0 开始,由于改进了存储引擎,enableMajorityReadConcern--enableMajorityReadConcern 不可更改,并始终设置为 true

在 MongoDB 的早期版本中,enableMajorityReadConcern--enableMajorityReadConcern 均可配置,可以设置为 false,以防止由三个节点组成的主-从-仲裁 (PSA) 架构的部署因存储缓存压力而停止运行。

如使用主节点-从节点-仲裁节点 (PSA) 三成员架构,请考虑以下因素:

  • 如果从节点不可用或滞后,写关注 "majority" 可能会导致性能问题。有关如何缓解这些问题的建议,请参阅缓解 PSA 副本集的性能问题

  • 如果您使用的是全局默认值"majority" ,并且写关注小于大多数的大小,则您的查询可能会返回过时(未完全复制)的数据。

← 读关注 (read concern) "available"