文档菜单
文档首页
/
MongoDB 手册
/ /

读取关注点"多数派"

本页内容

  • 性能
  • 可用性
  • 示例
  • 存储引擎支持
  • 读取关注点"多数派" 和事务
  • 读取关注点 "多数派" 和聚合
  • 读取自己的写入
  • 主-副-仲裁副本集
"多数派"

对于与多文档事务无关的读取操作,读取关注点 "多数派" 保证读取的数据已被副本集多数成员确认。读取的文档是持久的,并保证不会回滚。

对于 多文档事务中的操作,只有在事务以 写入关注点 "多数派" 提交时,读取关注点 "多数派" 才提供其保证。否则,"多数派" 读取关注点不提供关于事务中读取的数据的任何保证。

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

有关主节点失败时发生的情况的更多信息,请参阅 自动故障转移。

每个副本集成员都在内存中维护一个在多数提交点上的数据视图;多数提交点由主节点计算。为了满足“多数”读关注,节点从该视图返回数据,其性能与其他读关注相当。

读关注 "majority" 可与或无因果一致性会话和事务一起使用。

警告

如果您使用的是三成员主-辅助仲裁器(PSA)架构,请考虑以下情况

  • 如果辅助不可用或延迟,写关注 "majority" 可能会导致性能问题。有关减轻这些问题的建议,请参阅 使用自管理 PSA 副本集减轻性能问题。

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

考虑以下写操作的时序:将 0 写入三成员副本集

注意

为了简化,示例假设

  • 在 Write 0 之前的所有写操作都已成功复制到所有成员。

  • Write prev 是 Write 0 之前的上一个写操作。

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

Timeline of a write operation to a three member replica set
时间
事件
最近的写操作
最近的 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 时,具有 "多数" 读取关注点的读取操作看到的数据状态。

Timeline of a write operation to a three member replica set.
读取目标
时间 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",该聚合操作包含一个 $out 阶段。

如果写入请求已确认,可以使用 因果一致会话 来读取自己的写入。

从 MongoDB 5.0 开始,由于存储引擎的改进,enableMajorityReadConcern--enableMajorityReadConcern 无法更改,总是设置为 true

在MongoDB的早期版本中,enableMajorityReadConcern--enableMajorityReadConcern 是可配置的,可以设置为 false 以防止存储缓存压力使具有三成员主-次-仲裁员(PSA)架构的部署停滞。

如果您使用的是三成员主-辅助仲裁器(PSA)架构,请考虑以下情况

返回

"可用"