Mongodb Write Concern
  PBFgHg39AoKR 2023年11月02日 65 0

写关注点描述了MongoDB对独立mongod、副本集或分片集群进行写操作时请求的确认级别。在分片集群中,mongos实例将写关注点传递给分片。对于多文档事务,可以在事务级别设置写关注点,而不是在单个操作级别。不要显式地为事务中的各个写操作设置写关注点。从MongoDB 4.4开始,副本集和分片集群支持设置全局默认写关注点。未指定显式写关注的操作继承全局默认写关注设置。

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

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

写关注的几个设置级别

image.png

W=1,默认值(mongodb5.0版本之前)

只需要等到Primary节点完成写操作就可以返回确认成功的消息 image.png

W=majority

多数节点完成写操作就返回确认成功的消息,从MongoDB 5.0开始,隐式默认写关注点是w: majority。 例如:复制集由一个Primary节点和两个Secondary节点组成,则majority=2,则该写关注需要完成一个Primary节点和一个Secondary节点的写操作可以返回确认成功的消息;

W=0,表示不使用写关注,不需要等待任何写操作确认写入成功消息就返回

W=n,确定的数值,

如设置W=3,则需要等待Primary节点和另外两个Secondary节点完成写操作后,草返回确认成功的消息。

j参数

为了在发生故障时提供持久性,MongoDB对磁盘上的日志文件使用提前写日志。不要在生产系统上禁用日志记录功能j=false,从MongoDB 4.0开始,你不能为使用WiredTiger存储引擎的副本集成员指定——nojournal选项或storage.journal.enabled: false。 j参数表示当客户端收到写操作确认写成功的确认消息,除了要满足w设置的节点数量限制,还需要进一步等待每个节点是否已完成该写操作相关的事务日志写入磁盘文件。 image.png

j=false,

默认值,表示写操作写入成功的确认消息,只需要满足w设置的写关注条件,每个节点只需要完成数据在内存的写入,不需要等待每个节点将事务日志写入磁盘

j=true,

表示写操作写入成功的确认消息,除了要满足w设置的写关注条件,每个节点完成数据在内存的写入,还需要等待每个几点将写操作相关的事务日志写入磁盘。

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

wtimeout参数

wtimeout参数指定写关注应该在多长时间内返回,如果没有指定这个参数,则复制集肯呢个因为不确定因素导致客户端的写操作一直阻塞。 即使写操作最终会成功写入,但写操作达到这个时间限制时还没完成,也会将相应错误返回客户端,即使写操作最终超时,Mongodb也不会撤销在实践限制之前已完成的写操作引起的数据变化。 如果未指定wtimeout选项,且写操作级别无法实现,则写操作将无限期阻塞。指定wtimeout值为0相当于不带wtimeout选项的写关注点。

总结:线上运行mongodb,写关注尽量设置成W=majority,j=true,wtimeout是以毫秒为单位大于1的值。 如果发生故障,数据写入到日志,重新启动以后,数据库会从日志读取未写入数据库的数据。wtimeout参数防止数据无限阻塞。 根据自己业务场景,配置合理的参数,如果存储的是日志信息,可以设置W=1,确认返回更快数据写入更快。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  eHipUjOuzYYH   2023年12月07日   28   0   0 数据乐观锁redis
  jnZtF7Co41Wg   2023年12月09日   28   0   0 客户端服务端数据