3.MongoDB的writeConcern模式
2022/4/23 19:14:18
本文主要是介绍3.MongoDB的writeConcern模式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1.WriteConcern
MongoDB的writeConcern模式简单地可以理解为决定一个写操作落到多少个节点上才算是成功。writerConcern的取值包括:
- 0:发起写操作,不关心是否成功
- 1: 默认值,需要等待primary节点完成写操作就可以返回确认写成功的消息
- n:表示写操作需要被复制到指定节点数才算成功
- majority:写操作需要被复制到大多数节点上才算成功
2.默认模式
majority模式
All模式
3.WriteConcern中的另一个参数
j:ture
writeconcern可以决定写操作到达多少个节点才算成功,journal则定义如何才算成功,设置journal则是保证数据的持久化。取值包括:
- true:写操作落到journal文件中才算成功(有点类似于Mysql中redo log持久性一样)
- false:写操作到内存即算成功。
4.writeConcern中的最后一个参数
wtimeout参数指定写关注应该在多长时间内返回,如果没有指定这个参数,则复制集可能因为不确定因素导致客户端的写操作一直阻塞
即使写操作最终会成功写入,但写操作达到这个时间限制时还没完成,也会将相应的错误返回客户端。
注意:即使写操作最终超时,MongDB也不会撤销在时间限制之前已完成的写操作引起的数据变化。
实验1(一主两从)三节点模式:
rs0:PRIMARY> db.test.insert({count:1},{writeConcern:{w:3}}) //这里将w设置为3,表示只要当三个节点都写入成功,才能返回 WriteResult({ "nInserted" : 1 }) rs0:PRIMARY> db.test.insert({count:1},{writeConcern:{w:4}}) //这里就有问题,设置了四个节点,但是总共才三个节点 WriteResult({ "nInserted" : 1, "writeConcernError" : { "code" : 100, "codeName" : "UnsatisfiableWriteConcern", "errmsg" : "Not enough data-bearing nodes", "errInfo" : { "writeConcern" : { "w" : 4, "wtimeout" : 0, "provenance" : "clientSupplied" } } } }) rs0:PRIMARY> db.test.insert({count:1},{writeConcern:{w:"majority"}}) //这里设置的是大多节点。。。。 WriteResult({ "nInserted" : 1 })
实验2(延迟设置)
配置之前的设置
"members" : [ { "_id" : 1, "host" : "127.0.0.1:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 }, { "_id" : 2, "host" : "127.0.0.1:27018", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 }, { "_id" : 3, "host" : "127.0.0.1:27019", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 } ],
配置延迟之后的配置
rs0:PRIMARY> conf=rs.conf() rs0:PRIMARY> conf.members[1].slaveDelay=5 //单位是秒 这里总是会延迟主节点10秒 5 rs0:PRIMARY> conf.members[1].priority=0 0 rs0:PRIMARY> rs.reconfig(conf)
"members" : [ { "_id" : 1, "host" : "127.0.0.1:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 }, { "_id" : 2, "host" : "127.0.0.1:27018", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 0, "tags" : { }, "slaveDelay" : NumberLong(5), //这里看到第二个节点延迟的时间为5秒中 "votes" : 1 }, { "_id" : 3, "host" : "127.0.0.1:27019", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 } ],
这里可以将w这个参数进行数据的插入:
rs0:PRIMARY> db.test.insertOne({count:4},{writeConcern:{w:3,wtimeout:6000}}) //3000毫秒 --> 3秒
wtimeout主要是针对客户端防止堵塞情况的,它会判断在该数值范围内,数据是否写到了各个节点(到底要求写进几个节点,主要是看参数w)。
这篇关于3.MongoDB的writeConcern模式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-20go-zero 框架的 RPC 服务 启动start和停止 底层是怎么实现的?-icode9专业技术文章分享
- 2024-12-19Go-Zero 框架的 RPC 服务启动和停止的基本机制和过程是怎么实现的?-icode9专业技术文章分享
- 2024-12-18怎么在golang中使用gRPC测试mock数据?-icode9专业技术文章分享
- 2024-12-15掌握PageRank算法核心!你离Google优化高手只差一步!
- 2024-12-15GORM 中的标签 gorm:"index"是什么?-icode9专业技术文章分享
- 2024-12-11怎么在 Go 语言中获取 Open vSwitch (OVS) 的桥接信息(Bridge)?-icode9专业技术文章分享
- 2024-12-11怎么用Go 语言的库来与 Open vSwitch 进行交互?-icode9专业技术文章分享
- 2024-12-11怎么在 go-zero 项目中发送阿里云短信?-icode9专业技术文章分享
- 2024-12-11怎么使用阿里云 Go SDK (alibaba-cloud-sdk-go) 发送短信?-icode9专业技术文章分享
- 2024-12-10搭建个人博客网站之一、使用hugo创建个人博客网站