默认是持久化的

在1.8版本之后开始支持journal,就是我们常说的redo log,用于故障恢复和持久化

在2.0之后的版本,journal都是默认打开的,以确保数据安全

图解:

写入操作会记录journal日志,记录写入操作具体更改的磁盘地址和字节(如果服务器突然崩溃,启动时,journal会重放崩溃前并没有刷新到磁盘上的写操作)

数据文件每隔60s刷新到磁盘上,journal只需要持有60s内的写入数据。journal预分配了几个空文件用于此目的,位于/data/db/journal,命名为_j.0,_j.1等。

MongoDB运行很长时间情况下,在journal目录下,你会看到类似于_j.6217,_j.6218和_j.6219文件。这些文件是当前的journal文件,如果MongoDB一直运行,这些数字会持续增加。当正常关闭MongoDB时,这些文件将被清除,因为正常关机不在需要这些日志。

如果服务器崩溃或kill -9, mongodb再次启动时,会重放journal文件,会输出冗长难懂的检验行,这表明在正常的恢复。

mongod.lock文件,当运行在禁用journal情况下,它是很重要的。

当正常关闭mongod时,会清除mongod.lock文件,下次启动时知道上次是完全关闭的。相反,如果lock文件没有被清除,mongod没有正常的关闭。

如果mongod检测到没有正常的关闭,需要你复制一份数据。然而,有些人已经意识到,可以通过删除这个lock文件来绕过这个检查。但是,不要这么干。在启动时删除lock文件意味着你不知道或不关心你的数据是否已经损坏。除非是这种情况下,请尊重lock文件。

内存中的写入命令达到一定的时间或空间后,写入到日志系统中的日志文件里, 然后日志文件中的内容达到一定时间后,同步到数据文件中,从而保证数据的持久性

从内存同步到硬盘,如果保证强持久化,会导致写入能力下降;如果不设置强持久化,会导致丢失数据的可能; 只能两者之间平衡操作,将写入命令同步到日志的时间间隔尽量缩小

实现更持久的方法:

1.通过 getLastError 传递 j 选项,日记在记录只会等待30毫秒,而不是默认的100毫秒

db.one.insert({title:'123',content:'456'})
db.runCommand({"getLastError":1,'j':true})

日志写操作是异步的,默认不会等数据写完后才返回,返回给客户端成功但其写并不一定成功,可以通过使用getLastError命令来保证写是成功的

注:如果使用了getLastError中的 j 选项为true,在实际上每秒被限制写入33次。(1次/30毫秒)* (1000毫秒/秒) = 33.3次/秒。 如果允许mongodb对大部分数据进行批量写入,而不是每次写入单独提交,则mongodb性能会更好。

所以有了优化

提交一次写入操作,会提交这之前的所有操作

即:对应50个写入操作,前49使用getLastError中”j”=false的普通操作,最后一次使用getLastError中j=true的操作,如果成功的话,就知道50次写入已安全的写入到磁盘上了

2.设定日志提交间隔

每隔10毫秒将写入数据写入到日志文件中

  db.adminCommand({"setParameter":1,"journalCommitInterval":10});

journalCommitInterval参数的值范围为 2-500毫秒; 此值越小,丢失数据越少;

无论时间间隔设置为多少,使用带”j”:true选项的getLastError命令都会将该值减少到原来的1/3 

客户端写入操作被限制的唯一情况:

如果客户端的写入速度超过了日志的刷新速度,mongodb会限制写入操作,知道日记完成磁盘的写入

补充:

系统启动时,会将数据文件映射到一块内存区域,称之为Shared view,在不开启journal的系统中,数据直接写入shared view,然后返回,系统每60s刷新这块内存到磁盘,这样,如果断电或down机,就会丢失很多内存中未持久化的数据。

当系统开启了journal功能,系统会再映射一块内存区域供journal使用,称之为private view,mongodb默认每100ms刷新privateView到journal,也就是说,断电或宕机,有可能丢失这100ms数据,一般都是可以忍受的,如果不能忍受,那就用程序写log吧。这也是为什么开启journal后mongod使用的虚拟内存是之前的两倍。

Mongodb的隔离级别是read_uncommitted,不管使用不使用journal,都是以内存中的数据为准,只不过,不开启journal,数据从shared view读取,开启journal,数据从private view读取。

在开启journal的系统中,写操作从请求到写入磁盘共经历5个步骤,在serverStatus()中已经列出各个步骤消耗的时间。
①、Write to privateView
②、prepLogBuffer
③、WritetoJournal
④、WritetoDataFile
⑤、RemaptoPrivateView

总结:

使用journal之后,备份,容灾得到保障,批量提交也使得写入更加快速。我们也需要选用较高级的文件系统和磁盘还有更多的内存来保障journal的良好运行。

mongoDB 持久化相关推荐

  1. mongodb 持久化 mysql_(转)mongodb与mysql区别

    mongodb与mysql区别 MySQL是关系型数据库. 优势: 在不同的引擎上有不同 的存储方式. 查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高. 开源数据库的份额在不断增加,m ...

  2. mongodb持久化

    先上一张图(根据此处重画),看完下面的内容应该可以理解. mongodb使用内存映射的方式来访问和修改数据库文件,内存由操作系统来管理.开启journal的情况,数据文件映射到内存2个view:pri ...

  3. mongodb 持久化 mysql_最详细的python爬虫指南(四):持久化操作(mongoDB、mysql)...

    一.python操作mongodb 先来看下mongodb的基础语法,因为本人用到的不多,所以只是简单整理下mongodb基本语法 01.python写入mongodb import pymongo ...

  4. mongodb 持久化 mysql_scrapy数据持久化存储(MySQL、MongoDB)

    1.在setting.py中定义相关变量 #定义mysql相关变量 MYSQL_HOST = '127.0.0.1' MYSQL_USER = 'root' MYSQL_PWD = '123456' ...

  5. 几大流行的NoSql的主要区别,你在用Redis、ElasticSearch还是MongoDB ?

    Redis Redis是现在最热门的key-value数据库.它与MongoDB同在2009年发布,也同样是早期大数据时代的数据库代表作. Redis的最大特点当然就是key-value存储所带来的简 ...

  6. Redis、Memcache和MongoDB的区别

    >>Memcached Memcached的优点: Memcached可以利用多核优势,单实例吞吐量极高,可以达到几十万QPS(取决于key.value的字节大小以及服务器硬件性能,日常环 ...

  7. HBase、Redis、MongoDB、Couchbase、LevelDB 五款主流NoSQL数据库大比拼

    在 HBase.Redis.MongoDB.Couchbase.LevelDB 五款较主流的数据库产品中,本文将主要对它们进行分析对比. 鉴于缺乏项目中的实战经验沉淀,本文内容和观点主要还是从各平台资 ...

  8. HBase、Redis、MongoDB、Couchbase、LevelDB主流 NoSQL 数据库的对比

    最近小组准备启动一个 node 开源项目,从前端亲和力.大数据下的IO性能.可扩展性几点入手挑选了 NoSql 数据库,但具体使用哪一款产品还需要做一次选型. 我们最终把选项范围缩窄在 HBase.R ...

  9. Spring EclipseLink NoSQL - 使用MongoDB和Oracle NoSQL DB构建

    Spring EclipseLink NoSQL - 使用MongoDB和Oracle NoSQL DB构建 我们已经探索了如何实现EclipseLink JPA和众所周知的关系数据库(如MySQL) ...

最新文章

  1. Intel Realsense D435 composite_frame类 frame类 video_frame类 depth_frame类的关系
  2. Navicat下载和破解以及使用
  3. lombok @Builder注解的使用
  4. VTK:可视化之VisualizeImageData
  5. oracle 删除主键_大数据量删除的思考 4
  6. java怎么实现日程提醒_如何用java和xml实现日程提醒
  7. OpenGL加载纹理glGenTextures——内存优化(OpenGL内存泄漏)
  8. java io 读取配置文件_(转)Java 读写Properties配置文件
  9. 基础集合论 第一章 6 并集
  10. 斗战神服务器正在维护6,斗战神6月5日维护公告
  11. 如何抓取(采集)大众点评网的坐标(经纬度)信息
  12. PAT题集2019.6.5排名变动
  13. WinCC界面中通过插件打开pdf文件
  14. selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable: eleme
  15. 第一次团队作业——团队选题报告
  16. 网易2018校园招聘:重排数列 [python]
  17. JZOJ1321 灯
  18. ROS TF2 中的 四元数 基础部分
  19. python中pymysql的小坑
  20. css filter blur 白边,解决css3毛玻璃效果(blur)有白边问题

热门文章

  1. clientWidth、offsetWidth、区别
  2. SqlServer执行insert语句,不报错,数据也插不进去
  3. 用 Python 带你看各国 GDP 变迁
  4. torch.optim.lr_scheduler.StepLR()函数
  5. 2022-2028全球与中国宠物学校市场现状及未来发展趋势
  6. 收集瓶盖赢大奖c++
  7. Debezium系列之:增加心跳检测heartbeat.interval.ms
  8. Postman- TypeError: Cannot read property 'indexOf' of undefined (js提示没有定义方法)
  9. Java获取当前时区时间LocalDateTime与System.currentTimeMillis
  10. Android手机上使用Socks5全局代理-教程+软件