mongodb 副本集 数据一致性 写关注配置
验证副本集的写关注
{ 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 } }
)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
2022-04-14 mybatis if-else用法
2022-04-14 mysql常用时间场景
2022-04-14 MyBatis大于等于小于转义
2022-04-14 MySQL中union和order by同时使用的实现方法。报错:Incorrect usage of UNION and ORDER BY
2022-04-14 mysql 表的连接语句(包括纵向合并)
2022-04-14 stream将list转map时,key重复导致报错的问题解决方案
2022-04-14 MySql中explain结果filtered的解释