【MongoDB入门教程】 Journaling日志机制

标签: mongodb journaling 日志 | 发表时间:2015-06-26 19:17 | 作者:cooler1217
出处:http://www.iteye.com
转载: http://my.oschina.net/jockchou/blog/470388


Journaling日志机制
运行MongoDB如果开启了journaling日志功能,MongoDB先在内存保存写操作,并记录journaling日志到磁盘,然后才会把数据改变刷入到磁盘上的数据文件。为了保证journal日志文件的一致性,写日志是一个原子操作。本文将讨论MongoDB中journaling日志的实现机制。

Journal日志文件
如果开启了journal日志功能,MongoDB会在数据目录下创建一个journal文件夹,用来存放预写重放日志。同时这个目录也会有一个last-sequence-number文件。如果MongoDB安全关闭的话,会自动删除此目录下的所有文件,如果是崩溃导致的关闭,不会删除日志文件。在MongoDB进程重启的过程中,journal日志文件用于自动修复数据到一个一致性的状态。

journal日志文件是一种往文件尾不停追加内容的文件,它命名以j._开头,后面接一个数字(从0开始)作为序列号。如果文件超过1G大小,MongoDB会新建一个journal文件j._1。只要MongoDB把特定日志中的所有写操作刷入到磁盘数据文件,将会删除此日志文件。因为数据已经持久化,不再需要用它来重放恢复数据了。journal日志文件一般情况下只会生成两三个,除非你每秒有大量的写操作发生。

如果你需要的话,你可以使用storage.smallFiles参数来配置journal日志文件的大小。比如配置为128M。

Journaling机制的存储视图
Journaling功能用到了MongoDB存储层数据集内部的两个视图。

shared视图保存数据修改操作,用于刷入到磁盘数据文件。shared视图是MongoDB中唯一访问磁盘数据文件的视图。mongod进程请求操作系统把磁盘数据文件映射到虚拟内存的shared视图。操作系统只是映射数据与内存关系,并不马上加载数据到内存。当查询需要的时候,才会加载数据到内存,即按需加载。

private视图存储用于查询操作的数据。同时private视图也是MongoDB执行写操作的第一个地方。一旦journal日志提交完成,MongoDB会复制private视图中的改变到shared视图,再通过shared视图将数据刷入到磁盘数据文件。

journal视图是一个用来保证新的写操作的磁盘视图。当MongoDB在private视图执行完写操作后,在数据刷入磁盘之前,会先记录journal日志。journal日志保证了持久性。如果mongod实例在数据刷入磁盘之前崩溃,重启过程中journal日志会重放并写入shared视图,最终刷入磁盘持久化。

Journaling如何纪录写操作
MongoDB采用group commits方式将写操作批量复制到journal日志文件中。group commits提交方式能够最小化journal日志机制对性能的影响。因此group commits方式在提交过程中必须阻塞所有写入。commitIntervalMs参数可以用于配置日志提交的频率,默认是100ms。

Journaling存储以下原始操作:

文档插入或更新
索引修改
命名空间文件元数据的修改
创建和者删除数据库或关联的数据文件
当发生写操作,MongoDB首先写入数据到内存中的private视图,然后批量复制写操作到journal日志文件。写个journal日志实体来用描述写操作改变数据文件的哪些字节。


MongoDB接下来执行journal的写操作到shared视图。此时,shared视图与磁盘数据文件不一样。

默认每60s钟,MongoDB请求操作系统将shared视图刷入到磁盘。使数据文件更新到最新的写入状态。如果系统内存资源不足的时候,操作系统会选择以更高的频率刷入shared视图到磁盘。

MongoDB刷入数据文件完成后,会通知journal日志已经刷入。一旦journal日志文件只包含全部刷入的写操作,不再用于恢复,MongoDB会将它删除或者作为一个新的日志文件再次使用。

作为journaling机制的一部分,MongoDB会例行性请求操作系统重新将shared视图映射到private视图,为了节省物理内存。一旦发生重映射,操作系统能够识别到可以在private视图和shared视图共享的内存页映射。

小结
Journaling是MongoDB中非常重要的一项功能,类似于关系数据库中的事务日志。Journaling能够使MongoDB数据库由于意外故障后快速恢复。MongoDB2.0版本后默认开启了Journaling日志功能,mongod实例每次启动时都会检查journal日志文件看是否需要恢复。由于提交journal日志会产生写入阻塞,所以它对写入的操作有性能影响,但对于读没有影响。在生产环境中开启Journaling是很有必要的。【MongoDB入门教程】 Journaling日志机制

已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [mongodb journaling 日志] 推荐:

【MongoDB入门教程】 Journaling日志机制

- - 数据库 - ITeye博客
转载: http://my.oschina.net/jockchou/blog/470388. Journaling日志机制. 运行MongoDB如果开启了journaling日志功能,MongoDB先在内存保存写操作,并记录journaling日志到磁盘,然后才会把数据改变刷入到磁盘上的数据文件.

【Monogdb】MongoDB的日志系统

- - CSDN博客数据库推荐文章
记得前几天有个小伙伴要查看mongodb的日志,从而排查问题,可能总找不到日志放在何处,今天就系统说一下mongodb的日志系统. mongodb中主要有四种日志. 分别是系统日志、Journal日志、oplog主从日志、慢查询日志等. 这些 日志记录着Mongodb数据库不同方便的踪迹. 系统日志在Mongdb数据中很中重要,它记录mongodb启动和停止的操作,以及服务器在运行过程中发生的任何异常信息;配置系统日志也非常简单,在运行mongod时候增加一个参数logpath,就可以设置;.

[mongodb] java操作mongodb

- - 数据库 - ITeye博客
           //实例化Mongo对象,连接27017端口.                               //连接名为yourdb的数据库,假如数据库不存在的话,mongodb会自动建立. //从Mongodb中获得名为yourColleection的数据集合,如果该数据集合不存在,Mongodb会为其新建立.

MongoDB日志logappend方式以每天为单位自动切割日志解决方案

- - 数据库 - ITeye博客
一、编写logAppend.sh. 二、编写logAppend.js. crontab -e 增加 0 3 * * * /save/mongodb/shell/logAppend.sh. 已有 0 人发表留言,猛击->> 这里<<-参与讨论. —软件人才免语言低担保 赴美带薪读研.

【MongoDB】MongoDB之优化器Profiler

- - CSDN博客数据库推荐文章
在mysql数据库中,慢查询日志经常作为优化数据库的依据, mongodb中依然有类似的功能. Mongodb自带的profiler,可以方便地记录所有耗时的操作,以便于调优;. 一、开始profiler功能. 开启profier功能有两种:. 第一种就是直接在启动参数里面进行设置,就在茄冬mongodb时候添加-profile=级别.

夜说mongodb

- Lianhui Wang - NoSQLFan
前两天本站刚刚分享了wordnik使用MongoDB经验的文章:《Wordnik 的 MongoDB 使用经历》,今天又看到一位朋友对这方面做的总结,分享在这里,供大家参考. 赋闲以后很长没有更新博客了,说忙完全是借口,多半因为没有兴致所致. 今天凌晨比赛多多,趁着比赛的前奏和间隙,遂浏览些技术文章.

MongoDB与内存

- 高春辉 - 火丁笔记
但凡初次接触MongoDB的人,无不惊讶于它对内存的贪得无厌,至于个中缘由,我先讲讲Linux是如何管理内存的,再说说MongoDB是如何使用内存的,答案自然就清楚了. 据说带着问题学习更有效,那就先看一个MongoDB服务器的top命令结果:. 这台MongoDB服务器有没有性能问题. 先讲讲Linux是如何管理内存的.

白话MongoDB(一)

- Ease - 江边潮未尽,枫红一季秋
按照官方的说法,MongoDB是一种可扩展的高性能的开源的面向文档(document-oriented )的数据库,采用C++开发. 注意mongo不是mango(芒果),这个词是从humongous中截取出来的,其野心不言而明,直指海量数据存储. 和其他很多NoSQL不太一样,MongoDB背后有一个专门的商业公司在提供支持和推广,有点类似MySQL AB的模式.

MongoDB 索引

- - 博客园_首页
索引是用来加快查询的,数据库索引与数据的索引类似,有了索引就不需要翻遍整本书,数据库可以直接在索引中查找,. 使得查询速度很快,在索引中找到条目后,就可以直接跳转到目标文档的位置.. 要掌握如何为查询配置最佳索引会有些难度.. MongoDB索引几乎和关系型数据库的索引一样.绝大数优化关系型数据库索引的技巧同样适用于MongoDB..