

MongoDB Manual (Version 4.2)> MongoDB CRUD Operations > Write Concern
写关注描述了MongoDB请求的对单机版mongod或副本集 或 分片集群的写操作的确认级别。在分片群集中,mongos
实例会将写关注传递给分片。本文我们将从下方几个方面了解MongoDB写关注。
写关注规范
确认行为
为写关注计算 Majority 数量
注意:对于多文档事务,写关注是相对于事务级别而不是单个操作级别。不要为事务中的各个写操作显式设置写关注点。
写关注规范
写关注可以包含以下字段:{ w: <value>, j: <boolean>, wtimeout: <number> }
使用w选项来请求确认写入操作已传播到指定数量的
mongod
实例或具有指定标签的mongod
实例。j 选项,用于请求确认已将写操作写入磁盘日志中
wtimeout 选项指定一个时间限制,以防止无限期地阻塞写操作。
w
选项
w
选项请求确认写入操作已传播到指定数量的mongod
实例或具有指定标签的mongod
实例。
使用w
选项,可以使用以下w: <value>
写关注点:
| 值 | 描述 |
|---|---|
<number> | 请求确认写操作已传播到指定数量的mongod实例。例如:请求确认写操作已传播到单机版 mongod或副本集中的主数据库。 w: 1是MongoDB默认的写关注。如果写操作在复制到其他任何从节点前已下线,则可以数据回滚。不要求确认写操作。但是,w: 0可能会将有关套接字异常和网络错误的信息返回给应用程序。如果写操作在复制到其他任何从节点前已下线,则可以数据回滚。如果指定 w: 0但指定j: true,则j: true优先于请求自单机版 mongod或副本集主节点的确认。如果 w大于1,则需要来自主节点和足够多保存有数据的从节点确认,以满足指定的写关注。例如,对于一个一主两从含有3个成员的副本集来说。指定 w: 2将需要主节点和一个从节点的确认。指定 w: 3将需要主节点和两个从节点的确认。注意:隐藏的,延迟的和优先级为0的成员都可以确认 w:写操作。延迟的从节点可以不早于已配置的 slaveDelay返回写确认。有关 mongod实例何时确认写入的信息,请参见确认行为。 |
"majority" | 请求确认写操作已传播到所计算的大多数带有数据的投票成员{(}即,主节点和从节点的members[n\].votes大于0}。例如,考虑一个具有3个投票成员的副本集,即主-从-从(P-S-S)。对于此副本集,计算出的多数为2,并且写入必须传播到主节点和一个从节点,以向客户端确认写关注。注意: 隐藏的,延迟的和优先级为0以及 members[n\].votes大于0的成员都可以确认 "majority"写操作。延迟的从节点可以不早于已配置的 slaveDelay返回写确认。在写操作 w: "majority"确认返回给客户端之后,客户端可以使用 "majority"读关注读取该写操作的结果。有关 mongod实例何时确认写入的信息,请参见确认行为。 |
<custom write concern name> | 请求确认写入操作已传播到满足settings.getLastErrorModes中定义的自定义写关注 标记的成员。有关示例,请参阅自定义多数据中心写关注。如果自定义的写关注仅要求来自主节点和主节点下线之前写操作已复制到任何从节点的确认,则数据可以回滚。有关 mongod实例何时确认写入的信息,请参见确认行为。 |
也可以看
默认的MongoDB 读关注/写关注
副本集协议版本
j
选项
j
选项要求MongoDB确认写操作已写入磁盘日志中。
j | 如果j: true,则请求确认将写入w: 中指定的 mongod实例磁盘日志中。 j: true本身并不能保证不会因副本集主节点的故障转移而回滚写操作。在版本3.2中进行了更改:*使用 j: true,MongoDB仅在包括主节点请求数量的成员写入日志后才返回。以前,副本集中的 j: true写关注仅要求主节点写入日志,而与w: 写关注无关。 |
注意:
给一个不运行日志的
mongod
实例指定包含j: true
的写关注到会产生错误。如果启用日志功能,则
w: "majority"
可能意味着j: true
。writeConcernMajorityJournalDefault
副本集配置设置确定行为。有关详细信息,请参见确认行为。
超时
此选项为写关注指定了一个以毫秒为单位时间限制。wtimeout
仅适用于w
值大于1
。
wtimeout
导致写操作在指定的限制后返回错误,即使最终需要的写关注成功。当这些写操作返回时,MongoDB不会撤消在写关注超出wtimeout
时间限制之前执行成功的数据修改。
如果您未指定wtimeout
选项,并且无法达到写关注级别,则写操作将无限期阻塞。将wtimeout
值指定为0
等效于没有wtimeout
选项的写关注。
确认行为
w 选项和j 选项确定mongod
实例何时确认写操作。
单机版
一个单机版的mongod
在应用了内存中的写入之后或写入磁盘日志后,都会确认写操作。下表列出了单机版的确认行为以及相关的写关注:
未指定j | j:true | j:false | |
|---|---|---|---|
w: 1 | 内存 | 硬盘日志 | 内存 |
w: "majority" | 硬盘 如果运行了日志 | 硬盘日志 | 内存 |
注意:
将writeConcernMajorityJournalDefault
设置为false
时,MongoDB不会在确认写入之前等待 w: "majority"
要写入磁盘的日志。这样,在给定副本集中大多数节点瞬时丢失(例如崩溃和重新启动)的情况下,majority
写操作可能会回滚。
副本集
指定给定的w 值确定返回成功之前必须确认写入的副本集成员的数量。对于每个合格的副本集成员,j 选项确定成员是在内存中应用写操作之后还是在写入磁盘日志后确认。
w: "majority"复制集的任何带有数据的投票成员都可以对
"majority"
写操作进行写确认。下表列出了成员何时可以基于j 值确认写入:j
未指定确认取决于 writeConcernMajorityJournalDefault
的值:如果为true
,则确认需要将操作写入磁盘日志(j: true
)。writeConcernMajorityJournalDefault
的值默认为true
。如果为false
,则确认要求在内存中进行写操作(j: false
)。j: true 确认需要将写操作写入磁盘日志。 j: false 确认需要在内存中进行写操作。 注意: 将
writeConcernMajorityJournalDefault
设置为false
时,MongoDB不会在确认写入之前等待w: "majority"
要写入磁盘的日志。这样,在给定副本集中大多数节点瞬时丢失(例如崩溃和重新启动)的情况下,majority
写操作可能会回滚。注意: 隐藏的,延迟的和优先级为0以及
members[n\].votes
大于0的成员都可以确认"majority"
写操作。延迟的从节点可以不早于已配置的slaveDelay
返回写确认。w: <number>副本集的任何有数据的成员都可以对w: 写操作进行写确认.
下表列出了成员何时可以基于j 值确认写入:
j
未指定确认需要在内存中进行写操作( j: false
)。j: true 确认需要将写操作写入磁盘日志。 j: false 确认需要在内存中进行写操作。
注意:隐藏的,隐藏的和优先级为0的的成员可以确认w:
写操作。延迟的从节点可以不早于已配置的slaveDelay
返回写确认。
计算写关注的"多数"( Majority )
提示
从版本4.2.1开始,rs.status()
返回writeMajorityCount
字段,其中包含计算出的多数数量。
写关注"majority"
是通过以下值中的较小者计算得出的:
所有投票成员(包括仲裁员)中的大多数
所有有数据的投票成员的数量。
警告
如果计算出的多数数量等于所有带有数据的投票成员的人数(例如,由3个成员组成的主-从-仲裁的部署方式),则写关注"majority"
可能会超时,或者如果带有数据的投票节点已关闭或无法访问。如果可能,请使用带有数据的投票节点而不是仲裁节点。
例如:
具有3个投票成员的副本集,主-从-从(P-S-S):
计算得出的多数数量为2,最小值为2和3。则写必须传播到主节点和任一从节点,以向客户端确认写关注
"majority"
完成。所有投票成员中多数数量为2。
所有有数据投票的成员人数为3。
副本集包含3个投票成员,主-从-仲裁(P-S-A)
计算得出的多数数量为2,最小值为2和2。由于写只能应用于保存数据的节点,因此该写入必须传播到主节点和从节点,以向客户端确认写关注
"majority"
完成。所有投票成员中大多数为2。
所有有数据投票的成员人数为2。
提示
避免对(P-S-A)或其他要求所有保存数据的投票成员都可以确认写入的拓扑结构使用 "majority"
写。使用者想要保证在使用"majority"
读关注时的可靠性,则应该部署一个不要求所有保存数据的投票成员都可以确认写入的拓扑结构(例如P-S-S)。
原文链接:
https://docs.mongodb.com/v4.2/reference/write-concern/
译者:张琦
MongoDB中文社区翻译小组成员,Java 开发工程师。
往期翻译:
The mongo Shell
— mongo 命令行
— 配置 mongo shell
— 查看 mongo shell帮助文档
MongoDB CRUD操作
— MongoDB中的CRUD操作
— 批量写操作
— 读关注
数据模型
— MongoDB数据建模介绍
事务
— 事务
— 事务操作
索引
— 2dsphere索引
— 哈希索引
— 索引属性
— 在集合上创建索引
— 度量索引使用情况
安全
— 安全检查列表
— 启用访问控制
— 身份验证
— 审计
—— 配置审计
—— 配置审计过滤器
—— 系统事件审计消息
— 网络和配置强化
— 安全参考
—— system.roles 集合
—— system.users 集合
—— 资源文档
—— 权限操作
复制
— 副本集成员
— 副本集Oplog
— 副本集数据同步
— 副本集部署架构
分片
— 分片键
管理
— 产品说明
— 操作检查表
— 开发检查表
— 性能
— 备份方法
存储
—— 内存存储引擎
— 常见问答:MongoDB 存储

喜欢我们,
请分享、点赞、在看三连哦~




