Write Concern

在本页面

写关注描述了从 MongoDB 请求的对独立mongodreplica setssharded clusters的写操作的确认级别。在分片群集中,mongos实例会将写关注事项传递给分片。

写关注规范

写关注点可以包括以下字段:

{ w: <value>, j: <boolean>, wtimeout: <number> }
  • w选项以请求确认写入操作已传播到指定数量的mongod实例或具有指定标签的mongod实例。

  • j选项以请求确认已将写操作写入磁盘日志,并且

  • wtimeout选项以指定时间限制,以防止无限期地阻止写操作。

w Option

w选项请求确认写入操作已传播到指定数量的mongod实例或具有指定标签的mongod实例。

使用w选项,可以解决以下w: <value>个写问题:

ValueDescription
<number>请求确认写入操作已传播到指定数量的mongod实例。例如:


w: 1
请求确认写入操作已传播到独立mongod或副本集中的主副本。 w: 1是 MongoDB 的默认写关注点。
w: 0
不要求确认写入操作。但是,w: 0可能会将有关套接字异常和网络错误的信息返回给应用程序。
如果指定w: 0但包括j: true,则以j: true优先从独立mongod或副本集的主数据库请求确认。
w大于 1 时需要主服务器和许多其他承载数据的辅助服务器的确认,才能满足指定的写关注。例如,考虑一个没有arbiters的 3 成员副本集。指定w: 2要求主数据库和辅助数据库之一的确认。指定w: 3将需要来自主要和两个次级的确认。

Note





Hiddendelayedpriority 0成员可以确认w: <number>写操作。





延迟的辅助节点可以不早于已配置的slaveDelay返回写确认。



有关mongod个实例何时确认写入,请参见Acknowledgment Behavior
| "majority" |确认写入操作已传播到有数据投票成员(即members[n].votes大于0的主要和次要成员)的calculated majority
例如,考虑一个具有 3 个投票成员的副本集,即 Primary-Secondary-Secondary(P-S-S)。对于此副本集,calculated majority是 2,并且写操作必须传播到主要对象和一个辅助对象,以向 Client 端确认写问题。

[!NOTE|label:Note]




members[n].votes大于0Hiddendelayedpriority 0成员可以确认"majority"写入操作。





延迟的辅助节点可以不早于已配置的slaveDelay返回写确认。



在写操作以w: "majority"确认返回给 Client 端之后,Client 端可以使用"majority" readConcern 读取该写操作的结果。
有关mongod个实例何时确认写入,请参见Acknowledgment Behavior
| <custom write concern name> |请求确认写操作已传播到满足settings.getLastErrorModes中定义的自定义写关注点的tagged个成员。
有关示例,请参见自定义多数据中心写入问题
有关mongod个实例何时确认写入,请参见Acknowledgment Behavior

j Option

j选项请求 MongoDB 确认写入操作已写入on-disk journal

j如果为j: true,则请求确认w: <value>中指定的mongod实例已写入磁盘日志中。 j: true本身并不能保证由于副本集主故障转移而不会回滚该写操作。


在版本 3.2 中更改:使用j: true,MongoDB 仅在请求数量的成员(包括主要成员)已写入日志后返回。以前,副本集中的j: true写关注只需要primary写入日志,而不考虑w: <value>写关注。

Note

wtimeout

此选项指定写关注的时间限制(以毫秒为单位)。 wtimeout仅适用于大于1w值。

wtimeout导致写操作在指定的限制之后返回并返回错误,即使最终需要成功的写操作也是如此。当这些写入操作返回时,MongoDB 不会 撤消在写入关注时间超过wtimeout时间限制之前执行的成功数据修改。

如果您未指定wtimeout选项,并且无法达到写入级别,则写入操作将无限期地阻塞。将wtimeout值指定为0等效于没有wtimeout选项的写关注。

Acknowledgment Behavior

w选项和j选项确定mongod实例何时确认写操作。

Standalone

独立的mongod在应用了内存中的写入之后或写入磁盘日志后确认了写入操作。下表列出了独立服务器的确认行为以及相关的写入问题:

j未指定j:truej:false
w: 1In memoryOn-disk journalIn memory
w: "majority"磁盘日志如果运行日志On-disk journalIn memory

Note

writeConcernMajorityJournalDefault设置为false的情况下,MongoDB 在确认写入之前不会 awaitw: "majority"写入磁盘日志上。这样,如果给定副本集中的大多数节点发生瞬时丢失(例如崩溃和重新启动),则majority写操作可能会回滚。

Replica Sets

指定给w的值确定返回成功之前必须确认写入的副本集成员的数量。对于每个合格的副本集成员,j选项确定该成员是在内存中应用写操作之后还是在写入磁盘日志后确认是写确认。

  • w: "majority"

    • 副本集的任何带有数据的投票成员都可以对"majority"写操作的写确认做出贡献。

下表列出了成员何时可以基于j值确认写入:

j未指定确认取决于writeConcernMajorityJournalDefault的值:
如果为true,则确认要求将操作写入磁盘日志(j: true)。
writeConcernMajorityJournalDefault默认为true
如果是false,则确认需要在内存(j: false)中进行写操作。
j: true确认需要对磁盘日志进行写操作。
j: false确认需要在内存中进行写操作。

Note

writeConcernMajorityJournalDefault设置为false的情况下,MongoDB 在确认写入之前不会 awaitw: "majority"写入磁盘日志上。这样,如果给定副本集中的大多数节点发生瞬时丢失(例如崩溃和重新启动),则majority写操作可能会回滚。

Note

members[n].votes大于0Hiddendelayedpriority 0成员可以确认"majority"写入操作。

延迟的辅助节点可以不早于已配置的slaveDelay返回写确认。

  • w: <number>

    • 副本集的任何承载数据的成员都可以有助于w: <number>写操作的写确认。

下表列出了成员何时可以基于j值确认写入:

j未指定确认需要在内存中写入操作(j: false)。
j: true确认需要将操作写入磁盘日志。
j: false确认需要在内存中进行写操作。

Note

Hiddendelayedpriority 0成员可以确认w: <number>写操作。

延迟的辅助节点可以不早于已配置的slaveDelay返回写确认。

计算关注的多数

写入关注值"majority"的大多数是通过以下值中的较小者计算得出的:

  • 所有有投票权的成员(包括仲裁员)与

  • 所有具有“数据承载能力”的投票成员的数量。

Warning

如果计算出的多数数等于所有带有数据的**有投票权的成员的人数(例如,由 3 名成员组成的主要-次要仲裁员部署),写关注点"majority"可能会超时,或者如果带有数据的投票成员已关闭或无法访问。如果可能,请使用带有数据的投票成员而不是仲裁者。

例如,考虑:

  • 带有 3 个投票成员的副本集,主要-次要(P-S-S):

  • 所有投票成员中大多数为 2.

    • 所有有数据投票的成员人数为 3.

计算得出的多数为 2,最小为 2 和 3.写入必须传播到主要对象和辅助对象之一,才能向 Client 端确认写入关注"majority"

  • 副本集包含 3 个投票成员,主要-次要仲裁员(P-S-A)

  • 所有投票成员中大多数为 2.

    • 所有有数据投票的成员人数为 2.

计算得出的多数为 2,最小值为 2 和 2.由于写操作只能应用于数据承载成员,因此该写操作必须传播到主要对象和辅助对象,以向 Client 端确认写关注"majority"

Tip

避免对(P-S-A)或其他要求所有数据承载投票成员都可以使用来确认写入的拓扑使用"majority"写关注。希望使用"majority"写关注点来保证持久性的 Client 应改用不要求所有具有数据投票权的成员都可用的拓扑(例如 P-S-S)。