ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

3.MongoDB的writeConcern模式

2022-04-23 11:00:48  阅读:232  来源: 互联网

标签:false MongoDB slaveDelay PRIMARY 模式 writeConcern rs0 节点


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)。

       

标签:false,MongoDB,slaveDelay,PRIMARY,模式,writeConcern,rs0,节点
来源: https://www.cnblogs.com/zmc60/p/16181706.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有