写关注点描述了MongoDB对独立mongod、副本集或分片集群进行写操作时请求的确认级别。在分片集群中,mongos实例将写关注点传递给分片。对于多文档事务,可以在事务级别设置写关注点,而不是在单个操作级别。不要显式地为事务中的各个写操作设置写关注点。从MongoDB 4.4开始,副本集和分片集群支持设置全局默认写关注点。未指定显式写关注的操作继承全局默认写关注设置。
配置写关注点可以包括以下字段:
{ w: <value>, j: <boolean>, wtimeout: <number> }
写关注的几个设置级别
W=1,默认值(mongodb5.0版本之前)
只需要等到Primary节点完成写操作就可以返回确认成功的消息
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设置的节点数量限制,还需要进一步等待每个节点是否已完成该写操作相关的事务日志写入磁盘文件。
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,确认返回更快数据写入更快。
标签:wtimeout,Mongodb,写入,Write,确认,操作,日志,节点,Concern From: https://blog.51cto.com/jiachen/7037993