mongodb 副本集 数据一致性 写关注配置

发布时间 2023-04-14 13:58:29作者: 浅笑19

验证副本集的写关注

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

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

①w: majority——写操作传播到数据承载节点的calculated majority成员;这里举个例子,对于一个3节点的副本集(Primary-Secondary-Secondary,P-S-S),它的calculated majority是2,即写操作必须传播到primary和一个secondary同ack写关注给client。

②w: number——写操作传播到指定数量的mongod实例;当取值为0时,驱动程序不会使用写关注,只返回网络和socket的错误。当取值为1时,驱动程序使用写关注,但是只针对primary节点,这个配置项是对于复制集或单mongod实例默认写关注配置。当取值为整数且大于1时,写关注将针对复制集中的n个节点,当客户端收到这些节点的反馈信息后,命令才返回给客户端继续执行。

(2)j选项:设为1表示确认写入操作的请求已经写入磁盘日志(on-disk journal),也就是下一次Journal log提交。这种情况是可以容忍服务器突然宕机,断电等意外情况的数据恢复的。

(3)wtimeout选项:指定时间限制,以防止写操作无限期阻塞。

下图是一个配置了"w:2"的写关注执行流程图,一个是primary节点,一个是secondary节点。

 

 

一个需要写关注ack的应用程序发出一个写操作后会等待直到primary节点接受必要数量节点的相应写关注ack。对于w选项为“majority”或者w大于1来说,primary节点会一直等待直到必要数量的secondary作出ack才会返回写关注ack。对于w为1的写关注,primary节点可以在本地写操作完成后立即返回写关注确认(ack)。

确认写操作的成员越多,因为主操作失败而导致的回滚的可能性就越小。但是指定更高的写入关注会带来延迟增加的问题,因为客户端必要等待直到它收到指定级别的写关注确认(ack)。

 下面的操作是包括写关注选项的insert方法。操作指定w为"majority"此外还指定wtimeout为5秒以防止操作被无限期的阻塞。

db.products.insert(
   { item: "envelopes", qty : 100, type: "Clasp" },
   { writeConcern: { w: "majority" , wtimeout: 5000 } }
)