MongoDB Write Concern,简称MongoDB写入安全机制,是一种客户端设置,用于控制写入安全的级别。Write Concern 描述了MongoDB写入到mongod单实例,副本集,以及分片集群时何时应答给客户端。默认情况下,mongoDB文档增删改都会一直等待数据库响应(确认写入是否成功),然后才会继续执行。本文讲述了MongoDB 应答机制及相关参数。

一、MongoDB应答机制

MongoDB应答机制就是说对于当前数据库的写入成功与否告知客户端(db.getLastError())。如下:
            mongoDB client发出写入(或更新)请求---->mongoDB Server端写入---->通知客户端已经写入OK
    主要分为2种应答机制
            应答式写入(缺省情形,安全写入,适用于数据强一致性场景)
            非应答式写入(非安全写入,适用于数据弱一致性场景)
    实现方式
            通过Write Concern来实现,客户端驱动调用db.getLastError()方法,错误返回给客户端
            如果捕获到错误,则可以通过客户端定义的逻辑尝试再次写入或记录到特定日志等

二、Write Concern用法

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

w : 该选项要求确认操作已经传播到指定数量的mongod实例或指定标签的mongod实例
            w可选的的值
                    <number>
                            w:1(应答式写入)
                                    要求确认操作已经传播到指定的单个mongod实例或副本集主实例(缺省为1)
                            w:0(非应答式写入)
                                    不返回任何响应,所以无法知道写入是否成功
                                    但是对于尝试向已关闭的套接字写入或者网络故障会返回异常信息
                            w:>1(用于副本集环境)
                                    该值用于设定写入节点的数目,包括主节点

"majority"(大多数)
                    适用于集群架构,要求写入操作已经传递到绝大多数投票节点以及主节点后进行应答

<tag set>
                    要求写入操作已经传递到指定tag标记副本集中的成员后进行应答

j : 该选项要求确认写操作已经写入journal日志之后应答客户端(需要开启journal功能)
            则在意外重启,宕机等情形下可以通过journal来进行数据恢复
            写入journal操作必须等待直到下次提交日志时完成写入
            为降低延迟,MongoDB可以通过增加commit journal的频率来加快journal写入

wtimeout:
            该选项指定一个时间限制,以防止写操作无限制被阻塞导致无法应答给客户端
            wtimeout的单位为ms,当w值大于1时生效,该参数即仅适用于集群环境
            当某个节点写入时超出指定wtimeout之后,mongod将返回一个错误
            在捕获到超时之前,mongod并不会撤销其他节点已成功完成的写入
            wtimeout值为0时等同于没有配置wtimeout选项,容易导致由于某个节点挂起而无法应答

对于单实例应答的情形,是将数据写入到内存后开始应答,除非j:true,则保证掉电后不会丢失数据

三、几种不用应答模式图示说明

1、非应答式写入图示

MongoDB不对客户端进行应答,驱动会检查套接字,网络错误等。
    mongos> db.version()
    3.2.9
    mongos> db.version()
    3.2.9
    mongos> db
    test
    mongos> db.blogs.insert({ename:"leshami",url:"http://blog.csdn.net/leshami"},{writeConcern:{w:0}})
    WriteResult({ })   //此处应答为空

mongos> db.blogs.find({},{_id:0})
    { "ename" : "leshami", "url" : "http://blog.csdn.net/leshami" }


2、应答式写入图示

应答式写入是默认值
    MongoDB会在收到写入操作并且确认该操作在内存中应用后进行应答,但不会确认数据是否已写入磁盘
    同时允许客户端捕捉网络、重复key等等错误

mongos> db.blogs.insert({ename:"john",url:"http://blog.csdn.net/john"},{writeConcern:{w:1}})
    WriteResult({ "nInserted" : 1 })    //此处应答信息显示为1个文档已插入

mongos> db.blogs.find({},{_id:0})
    { "ename" : "leshami", "url" : "http://blog.csdn.net/leshami" }
    { "ename" : "john", "url" : "http://blog.csdn.net/john" }

3、带journal应答式写入图示

确认写操作已经写入journal日志之后应答客户端,必须允许了日志功能,才能生效。
    写入journal操作必须等待直到下次提交日志时完成写入
    提供通过journal来进行数据恢复


4、副本集应答写入图示

对于使用副本集的场景,缺省情况下仅仅从主(首选)节点进行应答
    建议修改缺省的应答情形为特定数目或者majority来保证数据的可靠
    如下示例,w值为2,超时为5s
            db.products.insert(
               { item: "envelopes", qty : 100, type: "Clasp" },
               { writeConcern: { w: 2, wtimeout: 5000 } }
            )       
    如果不希望每次在增删改时添加writeConcern,可以通过设置settings.getLastErrorDefaults
    如下示例,
            cfg = rs.conf()
            cfg.settings = {}
            cfg.settings.getLastErrorDefaults = { w: "majority", wtimeout: 5000 }
            rs.reconfig(cfg)

四、小结

1、write concern用于控制写入安全的级别,可以分为应答式写入以及非应答式写入 
2、write concern是一个性能和数据强一致性的权衡,应根据业务场景进行设定 
3、对于强一致性场景,建议w>1或者等于majority,以及journal为true,否则w=0 
4、在副本集的情形下,建议通过配置文件来修改w以及设置wtimeout,以避免由于某个节点挂起导致无法应答

转:https://blog.csdn.net/leshami/article/details/52913705

转载于:https://www.cnblogs.com/andy6/p/9838301.html

MongoDB之 写安全(Write Concern)相关推荐

  1. 了解一下MongoDB中的写关注(write concern)

    2019独角兽企业重金招聘Python工程师标准>>> MongoDB提供了一个配置参数:write concern 来让用户自己衡量性能和写安全.分布式数据库中这样的参数比较常见, ...

  2. MongoDB 写安全(Write Concern)

    MongoDB Write Concern,简称MongoDB写入安全机制,是一种客户端设置,用于控制写入安全的级别.Write Concern 描述了MongoDB写入到mongod单实例,副本集, ...

  3. mongodb mysql 写_MongoDB与MySQL关于写确认的异同

    云妹导读: 所谓写确认,是指用户将数据写入数据库之后,数据库告知用户写入成功的一个概念.根据数据库的特点和配置,可以在不同的写入程度上,返回给用户,而这其中,就涉及到了不同的性能.数据安全等级以及数据 ...

  4. MongoDB 批量写操作

    我们已经介绍过MongoDB中文档的增删改查等操作,但在有一些场景下,我们想同时完成插入.删除.更新等操作,显然是没有办法实现的.但是MongoDB给我们提供了这样的方式,可以使用db.collect ...

  5. mongodb mysql 写_MySQL和MongoDB语句的写法对照

    查询: MySQL: SELECT * FROM user Mongo: db.user.find() MySQL: SELECT * FROM user WHERE name = 'starlee' ...

  6. mongodb幽灵操作的解决方案

    <Mongodb权威指南>中提到了幽灵操作 但是上面的解决方案写得很含糊,仅仅是提到了:应答式写入. 那么应答式写入的具体Mongodb SQL例子是啥? 下面内容来自[1] Write ...

  7. MongoDB 副本集的相关概念【转】

    一.副本集基本概念 副本集(replica set) MongoDB的replica set是一个mongod进程实例簇,数据在这个簇中相互复制,并自动进行故障切换. MongoDB的数据库复制增加了 ...

  8. 分布式文档存储独角兽MongoDB——MongoDB常见命令(2)

    分布式文档存储独角兽MongoDB 二.MongoDB常见命令 1.1 MongoDB的基本操作 查看数据库 show dbs; 切换数据库 如果没有对应的数据库则创建 use 数据库名; 切换库,如 ...

  9. mongodb4.0学习总结三(write concern)

    write concern描述mongodb对单示例,副本集或分片集写入操作的确认请求级别.在分片集mongos实例会传递write concern到其它实例. note: 对于多文档事务,在事务级别 ...

最新文章

  1. bower解决js的依赖管理
  2. go语言笔记——是c开发的 lex yacc进行词法和语法分析,go不支持函数和运算符重载,不支持类型继承,也不支持断言,还有泛型...
  3. 第三章 PLSQL Developer 安装前oracleclient客户端的配置,在用plsql 连接oracle服务器
  4. java 的对象强制转换后的调用
  5. Bound Services
  6. 异常处理——Another app is currently holding the yum lock
  7. java ajax html复选框,HTMLjavaSkcriptCSSjQueryajax(九)(示例代码)
  8. ubunt18.04LTS+vscode+anaconda3下的python+C++调试
  9. 手把手教你用 Python 绘制酷炫的桑基图!
  10. 0927_C/C++笔试题_10:16道c语言面试例子【2】
  11. java game nokia 5233 model,诺基亚S60/^3完美运行GBA游戏教程 重回孩提时代
  12. linux移除硬盘命令,在Linux中在线添加及移除SCSI硬盘方法
  13. 【安全牛学习笔记】Kali Linux基本工具
  14. 柱坐标下多重网格法解泊松方程-python
  15. HTML+CSS网页设计期末课程大作——XXXXX (X页) HTML5网页设计成品_学生DW静态网页设计_web课程设计网页制作
  16. docker容器下载vim
  17. selenium click点击无反应问题解析
  18. idea列模式按列选取代码或按行选取代码快捷键
  19. 理解特征向量/特征空间和样本空间
  20. android+1024*768分辨率什么意思,网站上提示的建议用1024X768分辨率,是什么意思?...

热门文章

  1. linux既能归档也能压缩的命令,Linux压缩及归档
  2. centos6.5安装apache php,Centos66安装apache24
  3. 语言常用c100单词,英语口语练习_夏普新款PW-C100-G电子词典测评_沪江英语
  4. 查询oracle数据库的表格数据类型,excel表格中如何查询数据库数据类型-我想把excel表格中的数据导入oracle数据库中,想在......
  5. java 泛型重载_Java泛型编程与多态、重载的同与不同
  6. python二维元组元素的提取_如何从元组列表中提取第n个元素?
  7. oracle主备不同步,主备环境下数据不一致重新部署复制
  8. mysql的相关技术说明_MySQL 系统架构 说明
  9. sc.textFile()默认读取本地系统文件还是HDFS系统文件?
  10. Java案例:Java版生命游戏