代码改变世界

MongoDB Write Concern

  abce  阅读(45)  评论(0编辑  收藏  举报

写关注(Write Concern)描述了向单独的mongod、副本集或分片集群进行写操作时,MongoDB 所要求的确认级别。在分片集群中,mongos实例会将写关注传递给分片。

 

注:

对于多文档事务,应在事务级别而非单个操作级别设置写关注。不要为事务中的单个写操作明确设置写关注。

如果为多文档事务指定了 "majority" 写关注,而事务未能复制到计算出的多数副本集成员,那么事务可能不会立即在副本集成员上回滚。副本集会逐渐最终保持一致。事务总是在所有副本集成员上应用或回滚。

 

 

副本集和分片群集支持设置全局默认写关注。未指定显式写关注的操作会继承全局默认写关注设置。

 

 

写关注说明

写关注包含以下字段:

1
{ w: <value>, j: <boolean>, wtimeout: <number> }

其中:

· w选项用于请求确认写入操作已传播到指定数量的mongod实例或带有指定标记的mongod实例。如果没有指定该值,会使用默认的写关注设置。如果使用 setDefaultRWConcern 设置默认写关注,则必须指定w字段值。

· j选项用于请求确认写入操作已写入磁盘日志

· wtimeout选项,用于指定一个时间限制,防止写操作无限期阻塞。单位是毫秒。只有在 w 的值大于 1 的时候,才有效。超时后,写操作会报错,即使写关注会最终实现一致。

 

 

w: <value> 格式中,可以设置的值有:"majority"、<number>、<自定义写关注的名称>

 

 

从 MongoDB 5.0 开始,默认的写关注是 w: majority 。不过,包含仲裁节点的时候,要另外考虑:副本集的投票多数机制为 1 加上投票成员数的一半,四舍五入。如果携带数据的投票成员数不超过投票多数,则默认写入关注点为{ w: 1 } ;在所有其他情况下,默认写关注点为{ w: “majority” } 。

具体来说,MongoDB 使用以下公式来确定默认写关注:

1
2
3
4
if [ (#arbiters > 0) AND (#non-arbiters <= majority(#voting-nodes)) ]
    defaultWriteConcern = { w: 1 }
else
    defaultWriteConcern = { w: "majority" }

 

ACK 的行为

w: <value>, j: <boolean> 决定了 mongod 实例对写操作的 ack 行为。

单节点 mongod 实例的ack

对于单节点的实例,写操作的 ack 发生在内存中完成应用,或写入磁盘上的 journal 之后。下表列出了相应写关注设置的 ack 行为:

 

j未指定

j:true

j:false

w: 1

In memory

On-disk journal

In memory

w: "majority"

On-disk journal(如果开启了)

On-disk journal

In memory

 

副本集 mongod 实例的ack

 

j未指定

j:true

j:false

w: <number>

In memory

On-disk journal

In memory

w: "majority"

取决与writeConcernMajorityJournalDefault的设置:

·true(默认值):On-disk journal

·false:In memory

On-disk journal

In memory

 

从 MongoDB 8.0 开始,{ w: "majority" }写入会在大多数数据成员持久写入 oplog 条目后返回确认。然后,成员再从本地 oplog 读取更改时异步应用这些更改。在早期版本中,MongoDB 会等到成员应用写入后才返回确认。

 

在{ w: "majority" }写入返回确认后立即对辅助库进行查询,可能会在辅助库应用写入更改之前从集合中读取内容。

 

如果应用程序从辅助数据集读取数据,并要求立即访问{ w: "majority" }写入中的更改,请在因果一致的会话中运行这些操作。

 

local 数据库不支持写关注设置。

点击右上角即可分享
微信分享提示