Mongodb写入安全机制--GetLastError

在Proteus中用80C51模拟4线SPI点亮OLED屏幕 在Proteus里用80C51模拟4线SPI控制OLED屏幕使其显示图案(汇编实现)。 阅读详情
一、简介

很多人抱怨mongodb是内存数据库,也没有事务,会不安全,其实这都是对Mongodb的误解,Mongodb有完整的

redolog,binlog和持久化机制,不必太担心数据丢失问题。

journal是Mongodb中的redo log,而Oplog则是负责复制的binlog(对应Mysql)。

在google.groupuser上,mongo的开发者有一段这样的解释:


  1. #########
  2. By default:
  3. Collection data (including oplog) is fsynced to disk every 60 seconds.
  4. Write operations are fsynced to journal file every 100 milliseconds.
  5. Note, oplog is available right away in memory for slaves to read. Oplog is a capped collection
  6. so a new oplog is never created, old data just rolls off.
  7. GetLastError with params:
  8. (no params) = return after data updated in memory.
  9. fsync: true:
  10. with --journal = wait for next fsync to journal file (up to 100 milliseconds);
  11. without --journal = force fsync of collection data to disk then return.
  12. w: 2 = wait for data to be updated in memory on at least two replicas.
  13. ########

我们可以看到:

1、如果打开journal,那么即使断电也只会丢失100ms的数据,这对大多数应用来说都可以容忍了。从1.9.2+

,mongodb都会默认打开journal功能,以确保数据安全。而且journal的刷新时间是可以改变的,2-300ms的

范围,使用 --journalCommitInterval 命令。了解更多

2、Oplog和数据刷新到磁盘的时间是60s,对于复制来说,不用等到oplog刷新磁盘,在内存中就可以直接复

制到Sencondary节点。

GetLastError Command 

getLastError 是Mongodb的一个命令,从名字上看,它好像是取得最后一个error,但其实它是Mongodb的一

种客户端阻塞方式。用这个命令来获得写操作是否成功的信息。

getlastError有几个参数:j,w,fsync。在大多数的语言驱动中,这个命令是被包装成writeConcern类,比

如java,关于他们的解释,在这篇博客中有介绍 。

二、什么时候使用这个命令:


1、Mongodb的写操作默认是没有任何返回值的,这减少了写操作的等待时间,也就是说,不管有没有写

入到磁盘或者有没有遇到错误,它都不会报错。但一般我们是不放心这么做的,这时候就调用getlastError

命令,得到返回值。 
以java为例,举个例子:当我们为字段建立了一个唯一索引,针对这个字段我们插入两条相同的数据,

不设置WriterConcern或者设置WriterConcern.NORMAL模式,这时候即便抛出异常,也不会得到任何错误。

insert()函数在java中的返回值是WriteResult类, 

##
WriteResult( CommandResult o , WriteConcern concern ){
        _lastErrorResult = o;
        _lastConcern = concern;
        _lazy = false;
        _port = null;
        _db = null;
    }
##

这个类实际上包装了getlastError的返回值,但是这时候WriteResult的_lastErrorResult属性实际上是空的。因为dup key错误是server error,只有在WriterConcern.SAFE或更高级别的模式下,才会得到server error。

2、在多线程模式下读写Mongodb的时候,如果这些读写操作是有逻辑顺序的,那么这时候也有必要调用

getlasterror命令,用以确保上个操作执行完下个操作才能执行,因为两次执行的连接有可能是不同的。在

大多数情况下,我们都会使用连接池去连接mongodb,所以这是需要注意的。 
举个例子:我们之前遇到这个异常"The connection may have been used since this write, cannot

obtain a result",异常原因有两个,连接池数量太小,竞争太激烈,没有设置writerConcern.SAFE。祥见

:https://groups.google.com/forum/?fromgroups=#!topic/mongodb-user/xzw0Cb831VY

PS:在java等语言中,是不需要显示调用这个命令的,只需要设置WriterConcern即可。

三、getlastError最佳实践


1、如果没有特殊要求,最低级别也要使用WriterConcern.SAFE,即w=1。 
2、对于不重要的数据,比如log日志,可以使用WriterConcern.NONE或者WriterConcern.NORMAL,即w=-1或

者w=0,省去等待网络的时间。 
3、对大量的不连续的数据写入,如果每次写入都调用getLastError会降低性能,因为等待网络的时间太长,

这种情况下,可以每过N次调用一下getLastError。但是在Shard结构上,这种方式不一定确保之前的写入是

成功的。 
4、对连续的批量写入(batchs of write),要在批量写入结束的时候调用getlastError,这不仅能确保最

后一次写入正确,而且也能确保所有的写入都能到达服务器。如果连续写入上万条记录而不调用

getlastError,那么不能确保在同一个TCP socket里所有的写入都成功。这在并发的情况下可能就会有问题

。避免这个并发问题,可以参考如何在一个链接(请求)里完成批量操作,URL:java driver concurrency 
http://www.mongodb.org/display/DOCS/Java+Driver+Concurrency 
5、对数据安全要求非常高的的配置:j=true,w="majority" 
db.runCommand({getlasterror:1,j:true,w:'majority',wtimeout:10000}) 
java语言可以在MongoOption中设置,MongoOption中的这些设置是全局的,对于单独的一个(连接)操作,

还可以分别设置。


参考:

1、http://www.mongodb.org/display/DOCS/Journaling

2、http://www.mongodb.org/display/DOCS/Java+Driver+Concurrency

3、http://www.mongodb.org/display/DOCS/getLastError+Command


海思Hi3516DV300实战:从yolov5模型训练到Sort跟踪算法的完整部署流程 本文详细介绍了在海思Hi3516DV300芯片上部署YOLOv5目标检测与Sort多目标跟踪算法的完整流程。内容涵盖从特定场景数据训练YOLOv5模型、模型格式转换(PyTorch到ONNX再到Caffe),到利用海思NNIE引擎生成WK模型并进行端侧集成与优化的全链路实战经验,旨在解决嵌入式设备上实时人流量统计等实际应用挑战。 阅读详情

相关推荐

zynq+LWIP 裸机双网口实现(MIO+EMIO)+程序下载

芯片型号: ZYNQ: XC7Z010clg400开发软件:Vivado2022 + Xilinx Vitis 2022网卡芯片:RTL8211FDI(需要根据网口芯片型号修改对应的硬件配置代码。

thinking in 小宇宙 3405

GetLastError返回值的意义----适用在eVC和VC++

〖0〗-操作成功完成。〖1〗-功能错误。〖2〗-系统找不到指定的文件。〖3〗-系统找不到指定的路径。〖4〗-系统无法打开文件。〖5〗-拒绝访问。〖6〗-句柄无效。〖7〗-存储控制块被损坏。〖8〗-存储空间不足,无法处理此命令。〖9〗-存储控制块地址无效。〖10〗-环境错误。〖11〗-试图加载格式错误的程序。〖12〗-访问码无效。〖13〗-数据无效。〖14〗-存储器不足,无法完成此操作。〖15〗-系

KevinCEC的专栏 8879

JavaScript 书签脚本实战:腾讯/优酷/爱奇艺等5大视频站m3u8链接一键提取

本文详细介绍了如何使用JavaScript书签脚本一键提取腾讯视频、优酷、爱奇艺等五大视频平台的m3u8流媒体链接。通过分析播放器内部对象结构,开发者可以高效获取视频源文件,避免录屏画质损失。文章包含各平台适配方案、实战增强功能开发及企业级解决方案设计,帮助用户快速掌握这一实用技术。

weixin_27945229的博客 600

GetLastError错误代码含义

2005 msdn url: ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.WINCE.v50.en/wcecoreos5/html/wce50lrfsystemerrorsnumericalorder.htm The following table shows possible system error values. Co

it技术学习 2564

IEEE论文投稿必看:PDF eXpress报错font not embedded的3种修复方法(附Adobe Acrobat DC操作截图)

本文针对IEEE论文投稿时PDF eXpress系统常见的“font not embedded”报错,提供了三种核心修复方案。首先,详细解析了使用Adobe Acrobat DC进行专业修复的完整操作流程与关键技巧。其次,介绍了无需付费软件的开源与免费工具链(如Ghostscript)解决方案。最后,从源头出发,指导LaTeX和Microsoft Word用户在生成PDF时正确设置以确保字体自动嵌入,帮助研究者彻底解决格式问题,确保投稿顺利。

ujm56789012的博客 516

Windows 24H2升级后eNSP AR_40报错40?VirtualBox虚拟化修复指南

虚拟化技术通过Hypervisor在操作系统与硬件间建立抽象层,使虚拟机能够共享物理资源。其核心原理依赖CPU的VT-x/AMD-V指令集,而Windows 24H2对内核隔离与驱动签名的强化会直接占用或拦截这些虚拟化资源。在工程实践中,VirtualBox作为Type-2型Hypervisor,常因内存完整性开启或版本过旧导致虚拟网卡创建失败,进而引发设备启动中断。典型场景包括网络仿真实验、多系统测试环境搭建等。当eNSP的AR_40路由器依赖VirtualBox引擎时,24H2的安全策略变更便会触发错误

weixin_34375251的博客 214

ubuntu安装mongod、配置用户访问、添删改查

2.2、验证是否启动成功。1.1包管理公钥导入。1.3更新软件包列表。

heming20122012的专栏 839

Allegro中调整差分对等长的步骤介绍

【代码】Allegro中调整差分对等长的步骤介绍。

qq_30882617的博客 3832

Mongodb GetLastError写入安全机制

一、简介 很多人抱怨mongodb是内存数据库,也没有事务,会不安全,其实这都是对Mongodb的误解,Mongodb有完整的redolog,binlog和持久化机制,不必太担心数据丢失问题。 journal是Mongodb中的redo log,而Oplog则是负责复制的binlog(对应Mysql)。 在google.groupuser上,mongo的开发者有一段这样的解释:

rudy gao 1295

SECS/GEM EAP 设备自动化功能原理和设计方案

半导体SECS GEMEAP实现了对生产线上机台的实时监控,是工厂自动化不可缺少的控制系统。EAP系统与FAB中的机台紧密相关,系统的设计与开发必须与生产线的机台实际生产流程相一致,才能达到控制机台生产的目的。 EAP SECS/GEM是MES与设备的桥梁,EAP通过SECS国际标准协议与机台进行数据传输。SECS是半导体设备(半导体行业称设备为机台)必须遵循的一种国际通信协议。EAP就是通过SECS与设备通信、传输数据、发送指令控制设备按照预先定义........

semisecs 17万+

MongoDB数据安全机制

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34383618的博客 383

Android Update Engine 分析(三四)OTA 签名都支持哪些算法?

写了几十篇还没涉及到 OTA 签名算法细节,OTA 讨论群也很少问这个,毕竟签名算法纯理论的问题,一旦实现好就极少需要改动,只需要进行一些配置,准备好签名的秘钥和证书就可以了。限于签名的算法理论太过于抽象,本篇不讨论签名算法细节,但会总结一些签名操作。以及 Android OTA 包支持的签名算法。本文主要分析 Update Engine 中支持的签名算法,以及这些算法的操作实现(不涉及原理部分),并总结签名和验签使用的 key。

洛奇看世界 714

Windows API GetLastError错误代码解释大全(最完整的一篇)

这个也很好获取,循环FormatMessage即可。 0 操作成功完成。 1 函数不正确。 2 系统找不到指定的文件。 3 系统找不到指定的路径。 4 系统无法打开文件。 5 拒绝访问。 6 句柄无效。 7 存储控制块被损坏。 8 存储空间不足,无法处理此命令。 9 存储控制块地址无效。 10 环境不正确。 11 试图加载格式不正确的程序。 12 访问码无效。 13 数据无效。 14 存储空间不...

szx0427的博客 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

搞一搞mongodb数据库

上回书说到,我们的mongodb的环境已经配置完毕,这篇我们来玩弄mongdb 整体流程 再顺一遍流程 cd /opt/mongodb/bin // 你的路径 // 当前目录 /opt/mongodb/bin ./mongod -f mongodb.conf ./mongo // 出现光标成功~ 第一次用户进入默认用户,无视权限(不需要权限) 首先我们要设置用户 use ad...

杨大刚的博客 1364

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

调用GetLastError 错误代码 含义

2005 msdn url:ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.WINCE.v50.en/wcecoreos5/html/wce50lrfsystemerrorsnumericalorder.htm The following table shows possible system error values. Co

miyunhong的专栏 2万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

GetLastError的返回值

GetLastError的返回值含义

欧文的博客 1991

MongoDB的安全写入GetLastError

  这次聊聊业务中经常出现的重试现象,可能很多运维都被开发莫名其妙的艾特然后让查一查业务中出现失败的情况,很不巧刚接手MongoDB的运维就碰到了一个案例。   前段时间与业务开发讨论过某业务服务的超时重试问题,这项业务依赖的数据库是一直很热门的MongoDB数据库,这里采用了复制集的模式架构,且底层硬件采用KVM。业务开发反映数据库实例慢,最近超时的业务较少,重试后都能正常进行。我与开发沟通了...

weixin_30702887的博客 253

MongoDB 中 getLastError 的作用

是 MongoDB 的一个重要命令,用于获取最近一次写入操作的状态。这个命令主要用于确认写入操作是否成功,并返回有关该操作的一些信息。通过使用,开发者可以确保数据的持久性和一致性,从而增强应用程序的可靠性。是 MongoDB 中一个重要的命令,提供了一种有效的方法来确认写入操作的成功与否。通过设置适当的参数,开发者可以控制写入的确认级别,确保数据的安全性和一致性。无论是在关键业务操作中的数据持久性保证,还是在分布式系统中的一致性维护,都发挥着重要作用。

My_wife_QBL的博客 940

mongo命令行操作选项 之writeConcern,readConcern,getLastError

getLastError Mongodb的写操作默认是没有任何返回值的,这减少了写操作的等待时间,也就是说,不管有没有写入到磁盘或者有没有遇到错误,它都不会报错。但一般我们是不放心这么做的,这时候就调用getlastError命令,得到返回值。 getLastError 是Mongodb的一个命令,它好像是取得最后一个error,但其实它是Mongodb的一种客户端阻塞方式,用这个命令来...

xiaoliuliu2050的专栏 2251

GetLastError

GetLastError GetLastError返回的值通过在api函数中调用SetLastError或SetLastErrorEx设置。函数   并无必要设置上一次错误信息,所以即使一次GetLastError调用返回的是零值,也不能   担保函数已成功执行。只有在函数调用返回一个错误结果时,这个函数指出的错误结果   才是有效的。通常,只有在函数返回一个错误结果,而...

weixin_33885253的博客 937

GetLastError()错误代码列表

原博地址http://blog.sina.com.cn/s/blog_71beed5b0100z07r.html 信息常数 常数值 对应信息 ERROR_SUCCESS 0 操作成功完成。 NO_ERROR 0 操作成功完成。 ERROR_INVALID_FUNCTION 1 函数不正确。 ERROR_FILE_NOT_FOUND 2 系统找不到指...

dyrlovewc的博客 7198

GetLastError 错误码大全(转载)

https://www.cnblogs.com/lit10050528/p/3683018.html 转载自:GetLastError GetLastError GetLastError返回的值通过在api函数中调用SetLastError或SetLastErrorEx设置。函数   并无必要设置上一次错误信息,所以即使一次GetLastError调用返回的是零值,也不能   担保函数已成功执行。只有在函数调用返回一个错误结果时,这个函数指出的错误结果   才是有效的。通常,只...

zhang_mins999的博客 5535
上一篇: 深入剖析MongoDB架构
下一篇: NoSQL 数据建模技术
笑天居士
博客等级 码龄24年 292粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值