12-【MongoDB入门教程】MongoDB写关注

MongoDB写关注

MongoDB提供了写关注,用来描述数据库写操作返回信息的保证级别。写关注的强度决定了保证的级别。当插入,更新,删除是弱写关注的时候,操作返回的速度则快。如果写关注是弱的,在一些写失败的时候,写操作可能不会持久。写关注级别越强,客户端则需要越长的时间来等待MongoDB确认写操作。

MongoDB提供了不同的写关注的级别来更好的满足不同应用程序的需求。在一个实际的MongoDB部署中,客户端需要调整写关注的级别来确保重要写操作的持久性。对于其他一些不那么重要的写操作,客户端需要调整到弱写关注来保证更好的性能。

写关注级别

MongoDB定义了如下四种写关注级别,依次从弱到强:

  • Unacknowledged
  • Acknowledged
  • Journaled
  • Replica Acknowledged

实际应用中一般是在Client Driver里设置写关注的,它和db.getLastError()方法关系很大。一般来说,Mongo Driver在执行一个写操作(insert,update,delete)之后,都会立刻调用db.getLastError()命令。这样才有机会知道刚才的写操作是否成功,如果捕获到错误,就可以进行相应的处理。MongoDB Server并不关心错误,只负责通知Client发生了错误。

这里有2点需要注意:
1. db.getLastError()方法是由Driver负责调用的,所以业务代码不需要去显式调用。
2. Driver调用db.getLastError()函数,但是并不一定能捕获到错误,这主要取决于Write Concern的设置级别。

Unacknowledged

在这种写关注级别时,MongoDB立刻返回结果,然后执行写入操作,类似于忽略写错误。然而,驱动程序会去接收和处理网络错误。所以getLastError()的返回值一定是null,即使之后的Apply发生了错误,Driver也不知道。使用这个级别的Write Concern,Driver的写入调用立刻返回,所以性能是最好的,但是可靠性是最差的,因此并不推荐使用。在各平台最新版本的Driver中,也不再以0作为默认级别。其实还有一个w:-1的级别,是error ignored,基本上和w:0差不多。区别在于,w:-1不会捕获任何错误,而w:0可以捕获network error。

Acknowledged

在这种写关注级别时,mongod确认写操作,并且在内存视图上完成数据改变。它允许客户端捕获网络,重复键等其它错误。和Unacknowledged的区别是,现在MongoDB只有在Apply(实际写入操作)完成之后,才会返回getLastError()的响应。所以如果写入时发生错误,Driver就能捕获到,并进行处理。这个级别的Write Concern具备基本可靠性。但是Acknowledged级别的写关注并不确保数据已经持久化到系统硬盘,它是MongoDB默认的写关注级别。

Journaled

Acknowledged级别的Write Concern也不是绝对可靠的。因为MongoDB的Apply操作是将数据写入内存,定期通过fsync写入硬盘。如果在Apply之后,fsync之前mongod挂了,或者甚至Server挂了,那持久化实际上是失败的。但是在w:1的级别下,Driver无法捕获到这种情况下的error,因为response在Apply之后就已经返回到Driver。MongoDB解决这个问题的办法是使用Journal机制,写操作在写入内存之后,还会写到journal文件中,这样如果mongod非正常down掉,重启以后就可以根据journal文件中的内容,来还原写操作。 在Driver层面,则是除了设置w:1之外,再设置journal:true或j:true,来捕获这个情况下的error。在这种关注级别下,MongoDB能确保写操作将数据提交到了journal日志。这种写关注能保证MongoDB崩溃后恢复数据。当然,前提是你必须开启journal日志功能。但这样写操作必须等到下一次日志提交才返回结果,为了减少操作延迟,要提高日志提交的频率配置。

Replica Acknowledged

这个写关注级别下,只有Secondary从Primary完成了复制之后,getLastError()的结果才会返回。也可以同时设置journal:true或j:true,则还要等journal写入也成功后才会返回。但是注意,只要Primary的journal写入就会返回,而不需要等待Secondary的journal也写入。类似的也可以设置w:3,表示至少要有3个节点有数据;或者w:majority,表示>1/2的节点有数据。一般小规模的集群就是3节点部署,所以配置w:2就可以了。

小结

设置Write Concern级别,其实就是在写操作的性能和可靠性之间做权衡。写操作的等待时间越长,可靠性就越好。对于非关键数据,建议使用默认的w:1就可以了,对于关键数据,则使用w:1 & j:true比较好。这里要注意,journal无论如何都是建议打开的,设置j:true,只是说Driver调用getLastError()之后是否要等待journal写入完成再返回。并不是说不设置j:true就关闭了server端的journal。

关于getLastError()

一般来说,开发者写的代码,不需要自行调用db.getLastError()函数,Driver在每一个写操作之后,都会立刻自动调用该方法。

db.collection("test", {}, function(err, collection) {
    collection.insert({
        name: "world peace"
    },
    function(err, result) {
        assert.equal(null, err);
        console.log(result);
        db.close();
    })

});

这段代码,driver在insert()之后,隐式调用db.getLastError(),如果捕获到任何错误,就会赋给回调函数中的err参数。区别就在于是否能够捕获到错误。在w:-1时,err永远是null(没有机会捕获到error);在w:0时,一般也捕获不到,除了network error;在w:1时,如果mongod apply发生错误,就会传递给err参数了。代码都是一样的,区别就在于设置的Write Concern级别。详细的说明请参考http://docs.mongodb.org/manual/reference/command/getLastError/

时间: 2024-10-13 12:34:53

12-【MongoDB入门教程】MongoDB写关注的相关文章

MongoDb 入门教程

MongoDb 入门教程 目录 MongoDb的基本数据结构 安装MongoDb服务器 连接MongoDb服务器 MongoDb创建数据库 MongoDb创建表 MongoDb插入数据 MongoDb查询数据 范围操作符 AND操作符 OR操作符 排序 聚合 MongoDb更新数据 MongoDb删除数据 常用的DDL命令 MongoDb图形化工具 总结 参考资料 MongoDb 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 它是可扩展的高性能数

.NET平台下使用MongoDB入门教程

适合人群:完全没有接触MongoDB或对MongoDB有一点了解的C#开发人员.因为本文是一篇入门级的文章. 一.了解MongoDB  MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案.  MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种. MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.他支持的数据结构非常松散,是类似js

MongoDB入门教程三[数据类型]

MongoDB的文档使用BSON(Binary JSON)来组织数据,BSON类似于JSON,JSON只是一种简单的表示数据的方式,只包含了6种数据类型(null.布尔.数字.字符串.数组及对象),不能完全满足复杂业务的需要,因此,BSON还提供日期.32位数字.64位数字等类型.以下对mongoDB的类型进行简要说明: 1. Null[类型编号:10] null类型用于表示空值或不存在的字段,如:{“x”:null} 2. 布尔类型 Boolean[类型编号:8] 布尔类型有两上值,’true

MongoDB入门教程二[MongoDB Shell 简介与使用]

MongoDB Shell 是MongoDB自带的JavaScript Shell,随MongoDB一同发布,它是MonoDB客户端工具,可以在Shell中使用命令与MongoDB实例交互,对数据库的管理操作(CURD.集群配置.状态查看等)都可以通过MongoDB Shell来完成. 今天介绍MongoDB的一些基本命令和小技巧: 1.利用help查看帮助: 输入:“db.user.find().help();”查看find()的帮助信息 2.基本命令: 连接/切换数据库       例如:u

MongoDB入门教程(一)

MongoDB简介 MongDB是一个高性能,开源,无模式的文档型NosQL数据库. 主要功能特性: 1.文件存储格式BSON(一种json的扩展) 2.模式自由 数据格式不受限了表的结构 3.支持动态查询 4.支持完全索引 5.支持复制(其主从复制)和故障恢复 6.使用高效的二进制数据存储,包括大型对象 7.自动处理碎片,以支持云计算层次的扩展. 8.支持Java.Ruby.Python.C++.PHP等多种语言 9.内部支持Javascript MongoDB的优势 1.查询速度快 2.高并

MongoDB入门教程一[文档与集合]

MongoDB 是面向集合存储的文档型数据库,其涉及到的基本概念与关系型数据库相比有所不同.举个例子,在关系型数据库中,我们记录一个订单的信息,通常是这样设计表结构的: 设计一个订单基本信息表和一个订单明细表,1个订单有N个订单明细,这些订单明细通过外键关联到订单主表,所以要存储一个订单的信息,需要“1+N”条记录.在MongoDB中将订单基本信息和该订单的所有订单明细信息通过嵌套的json格式组织起来,保存为1个文档.也就是说在关系型数据库中需要“1+N”条记录存储的数据,MongoDB保存为

MongoDB入门教程(二)

上一篇博文中,我详细描述了从MongoDB简介到安装,在本节,主要从整体角度去看MongoDB. MongoDB的数据架构 官方是这样描述的 MongoDB stores all documents in collections. A collection is a group of related documents that have a set of shared common indexes. Collections are analogous to a table in relatio

MongoDB入门教程(包含安装、常用命令、相关概念、使用技巧、常见操作等)【转载】

一.安装和配置 MongoDB 的官方下载站是 http://www.mongodb.org/downloads,可以去上面下载最新的安装程序 Windows 平台的安装 ● 步骤一: 下载 MongoDB     点击上方官方下载地址, 并下载 Windows 版本 ● 步骤二: 设置 MongoDB 程序存放目录     下载完成后, 解压到自定义文件夹,例: D:\mongodb\ ● 步骤三: 设置数据文件存放目录     在 D:\mongodb\ 目录下创建 db 和 logs 文件

美团 mpvue 入门教程

美团小程序框架 mpvue 入门教程 自打写了 美团小程序框架 mpvue 蹲坑指南, 一发不可收拾,今天趁周末空闲,来写个 mpvue(没朋友)的简单入门教程,本教程只针对新手,老鸟勿喷. 另外,我还专门为本文做了一个简单的项目,如果懒得从头开始搭项目的童鞋,可以直接去我的 github上克隆到本地, 安装一下依赖,即可直接在此基础在开发,不需要做任何配置.如果你觉得该项目对有帮助, 请顺便给我 Star,你们的支持是我最大的动力,谢谢! 好了,我们进入主题,首先,请允许引用一下美团官方对 m