MongoDB之 写安全(Write Concern)
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)相关推荐
- 了解一下MongoDB中的写关注(write concern)
2019独角兽企业重金招聘Python工程师标准>>> MongoDB提供了一个配置参数:write concern 来让用户自己衡量性能和写安全.分布式数据库中这样的参数比较常见, ...
- MongoDB 写安全(Write Concern)
MongoDB Write Concern,简称MongoDB写入安全机制,是一种客户端设置,用于控制写入安全的级别.Write Concern 描述了MongoDB写入到mongod单实例,副本集, ...
- mongodb mysql 写_MongoDB与MySQL关于写确认的异同
云妹导读: 所谓写确认,是指用户将数据写入数据库之后,数据库告知用户写入成功的一个概念.根据数据库的特点和配置,可以在不同的写入程度上,返回给用户,而这其中,就涉及到了不同的性能.数据安全等级以及数据 ...
- MongoDB 批量写操作
我们已经介绍过MongoDB中文档的增删改查等操作,但在有一些场景下,我们想同时完成插入.删除.更新等操作,显然是没有办法实现的.但是MongoDB给我们提供了这样的方式,可以使用db.collect ...
- mongodb mysql 写_MySQL和MongoDB语句的写法对照
查询: MySQL: SELECT * FROM user Mongo: db.user.find() MySQL: SELECT * FROM user WHERE name = 'starlee' ...
- mongodb幽灵操作的解决方案
<Mongodb权威指南>中提到了幽灵操作 但是上面的解决方案写得很含糊,仅仅是提到了:应答式写入. 那么应答式写入的具体Mongodb SQL例子是啥? 下面内容来自[1] Write ...
- MongoDB 副本集的相关概念【转】
一.副本集基本概念 副本集(replica set) MongoDB的replica set是一个mongod进程实例簇,数据在这个簇中相互复制,并自动进行故障切换. MongoDB的数据库复制增加了 ...
- 分布式文档存储独角兽MongoDB——MongoDB常见命令(2)
分布式文档存储独角兽MongoDB 二.MongoDB常见命令 1.1 MongoDB的基本操作 查看数据库 show dbs; 切换数据库 如果没有对应的数据库则创建 use 数据库名; 切换库,如 ...
- mongodb4.0学习总结三(write concern)
write concern描述mongodb对单示例,副本集或分片集写入操作的确认请求级别.在分片集mongos实例会传递write concern到其它实例. note: 对于多文档事务,在事务级别 ...
最新文章
- bower解决js的依赖管理
- go语言笔记——是c开发的 lex yacc进行词法和语法分析,go不支持函数和运算符重载,不支持类型继承,也不支持断言,还有泛型...
- 第三章 PLSQL Developer 安装前oracleclient客户端的配置,在用plsql 连接oracle服务器
- java 的对象强制转换后的调用
- Bound Services
- 异常处理——Another app is currently holding the yum lock
- java ajax html复选框,HTMLjavaSkcriptCSSjQueryajax(九)(示例代码)
- ubunt18.04LTS+vscode+anaconda3下的python+C++调试
- 手把手教你用 Python 绘制酷炫的桑基图!
- 0927_C/C++笔试题_10:16道c语言面试例子【2】
- java game nokia 5233 model,诺基亚S60/^3完美运行GBA游戏教程 重回孩提时代
- linux移除硬盘命令,在Linux中在线添加及移除SCSI硬盘方法
- 【安全牛学习笔记】Kali Linux基本工具
- 柱坐标下多重网格法解泊松方程-python
- HTML+CSS网页设计期末课程大作——XXXXX (X页) HTML5网页设计成品_学生DW静态网页设计_web课程设计网页制作
- docker容器下载vim
- selenium click点击无反应问题解析
- idea列模式按列选取代码或按行选取代码快捷键
- 理解特征向量/特征空间和样本空间
- android+1024*768分辨率什么意思,网站上提示的建议用1024X768分辨率,是什么意思?...
热门文章
- linux既能归档也能压缩的命令,Linux压缩及归档
- centos6.5安装apache php,Centos66安装apache24
- 语言常用c100单词,英语口语练习_夏普新款PW-C100-G电子词典测评_沪江英语
- 查询oracle数据库的表格数据类型,excel表格中如何查询数据库数据类型-我想把excel表格中的数据导入oracle数据库中,想在......
- java 泛型重载_Java泛型编程与多态、重载的同与不同
- python二维元组元素的提取_如何从元组列表中提取第n个元素?
- oracle主备不同步,主备环境下数据不一致重新部署复制
- mysql的相关技术说明_MySQL 系统架构 说明
- sc.textFile()默认读取本地系统文件还是HDFS系统文件?
- Java案例:Java版生命游戏