mongodb有一个write concern的设置,作用是保障write operation的可靠性。一般是在client driver里设置的,和db.getLastError()方法关系很大
一般来说,所有的mongo driver,在执行一个写操作(insert、update、delete)之后,都会立刻调用db.getLastError()方法。这样才有机会知道刚才的写操作是否成功,如果捕获到错误,就可以进行相应的处理。处理逻辑也是完全由client决定的,比如写入日志、抛出错误、等待一段时间再次尝试写入等。作为mongodb server并不关心,server只负责通知client发生了错误
这里有2点需要注意:
1、db.getLastError()方法是由driver负责调用的,所以业务代码不需要去显式调用。这点后面还会专门提到
2、driver一定会调用db.getLastError()函数,但是并不一定能捕获到错误。这主要取决于write concern的设置级别,这也是本文的主题
write concern:0(Unacknowledged)
此级别调用的时序图如下:
driver调用了getLastError()之后,mongod立刻返回结果,然后才实际进行写操作。所以getLastError()的返回值一定是null,即使之后的Apply发生了错误,driver也不知道。使用这个级别的write concern,driver的写入调用立刻返回,所以性能是最好的,但是可靠性是最差的,因此并不推荐使用。在各平台最新版本的driver中,也不再以0作为默认级别。其实还有一个w:-1的级别,是error ignored,基本上和w:0差不多。区别在于,w:-1不会捕获任何错误,而w:0可以捕获network error
write concern:1(acknowledged)
此级别调用的时序图如下:
和Unacknowledged的区别是,现在mongod只有在Apply(实际写入操作)完成之后,才会返回getLastError()的响应。所以如果写入时发生错误,driver就能捕获到,并进行处理。这个级别的write concern具备基本可靠性,也是目前mongodb的默认设置级别
write concern:1 & journal:true(Jounaled)
此级别调用的时序图如下:
Acknowledged级别的write concern也不是绝对可靠的。因为mongodb的Apply操作,是将数据写入内存,定期通过fsync写入硬盘。如果在Apply之后,fsync之前mongod挂了,或者甚至server挂了,那持久化实际上是失败的。但是在w:1的级别下,driver无法捕获到这种情况下的error(因为response在apply之后就已经返回到driver)
mongod解决这个问题的办法是使用Journal机制,写操作在写入内存之后,还会写到journal文件中,这样如果mongod非正常down掉,重启以后就可以根据journal文件中的内容,来还原写操作。在64位的mongod下,journal默认是打开的。但是32位的版本,需要用--journal参数来启动
在driver层面,则是除了设置w:1之外,再设置journal:true或j:true,来捕获这个情况下的error
write concern:2(Replica Acknowledged)
这个级别只在replica set的部署模式下生效
这个级别下,只有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级别
相关推荐
MongoDB Community Server(mongodb-src-r5.0.4.tar.gz)源代码 MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非...
MongoDB Community Server(mongodb-src-r5.0.4.zip)源代码 MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系...
其中,MongoTemplate的配置涉及了写结果检查策略、Write Concern以及Write Concern解析器等高级特性。 通过这些内容,可以看出SpringData MongoDB API文档是一个功能全面且内容丰富的资源,它不仅包括了API的使用,...
本文档对 MongoDB 应用优化与脱坑实践进行了深入的探讨,涵盖了 MongoDB 应用的优化方法、DBA 角色、实例增长趋势图、部署架构、写策略 Write Concern、mongos 的chunk、shard key、ZONES 分片、mongos 使用限制等多...
- **设置写入模式**:为了保证数据的安全性和一致性,可以通过设置`write_concern`参数来控制写入行为。 ```python from pymongo.write_concern import WriteConcern collection = db['collection_name'].with_...
此外,还介绍了MongoTemplate的创建、使用策略和写关注(Write Concern)的概念。 具体到 "Saving, Updating, and Removing Documents" 的部分,文档解释了如何在映射层处理文档中的_id字段,提供了保存和插入文档...
6. **Write Concern**:MongoDB提供了多种Write Concern级别,确保写入操作的持久性和一致性,根据应用需求可以选择不同的确认级别。 7. **监控和诊断工具**:MongoDB提供了丰富的监控和诊断工具,如`mongostat`、`...
例如,改进的write concern(写关注)机制可以确保数据的持久化。 8. **聚合框架**: MongoDB的聚合框架允许用户在服务器端进行复杂的数据处理,包括统计分析、数据转换等。3.6.3版本可能会增强聚合管道的性能和灵活...
9. **Write Concern和Read Concern**:Write Concern定义了写操作的确认级别,确保数据在写入时的可靠性;Read Concern则控制了读取数据的一致性级别,允许在性能和一致性之间做出权衡。 10. **MongoDB驱动**:...
- 事务中的操作使用事务级别的读关注(read concern)、写关注(write concern)和读取偏好(read preference)。 - 自MongoDB 4.4版本开始,可以在事务中隐式或显式创建集合,但需要使用针对4.4更新的驱动程序。 `...
**写入关注(Write Concern)** 应用程序也可以使用写入关注来控制写入操作的行为。特别是对于部署了复制集的应用程序,写入关注语义允许客户端指定MongoDB报告写入操作成功时提供的保证。 **聚合(Aggregation)**...
用户可以通过调整写关注(Write Concern)设置,如{w:0}(无确认)、{w:1}(主节点确认)或{w:2}(多数节点确认),来决定数据写入的确认级别,以提高系统的可靠性和性能。 在应用场景方面,MongoDB特别适合高写入负载的...
8. **写入一致性**:MongoDB提供多种写入一致性选项,如强一致性的majority write concern和最终一致性的replicaAcknowledged write concern,可以根据业务需求选择适合的策略。 9. **TTL索引**:MongoDB的TTL...
写关注点(write concern)是MongoDB用于指定写操作后的确认级别。 在查询文档方面,教程讲述了如何使用`findOne()`方法获取集合中的第一个文档、添加多个文档、统计集合中文档数量、使用游标遍历获取所有文档、...
- **同步策略**: 可以通过配置写入策略(write concern)来控制journal和oplog之间的同步。 **1.4.2 MongoDB Oplog保证顺序的方法** - **单线程写入**: oplog由主节点单线程写入,确保了操作的日志顺序。 - **同步...
此外,eBay 还利用 MongoDB 的 majority write concern 功能来确保跨数据中心的写入持久化。这意味着写操作只有在大多数副本集节点确认后才被视为成功,增强了数据一致性。这对于确保在分布式环境中的数据完整性至关...
4. **读写权限控制**:通过读取偏好(Read Concern)和写入确认(Write Concern)增强了数据一致性和可用性。 5. **自动备份和恢复**:MongoDB 3.6 提供了更好的备份工具和策略,简化了灾难恢复流程。 在部署和使用...
MongoDB的写策略Write Concern是保证数据一致性的关键。用户可以通过设置`w`、`j`和`wtimeout`参数来控制写操作的确认级别,确保数据在写入时的可靠性。不同的写策略会影响到系统的性能和数据安全性,需要根据业务...