先介绍一下Journal:
journal文件在MongoDB中的作用相当于redo日志文件在oracle中的作用,它可以在即使服务器意外宕机的情况下,将数据库操作进行重演。
在64位的机器上,2.0以上版本默认是开启了journal的,但是在32位机器上,或者2.0以下的版本中,默认是不开启journal的。所以在我的安装了2.4.3版本的32位机器上,每次启动mongodb都提示“warning: 32-bit servers don't have journaling enabled by default. Please use --journal if you want durability.”,所以我须要在启动mongodb时带上 --journal 参数;而在默认启动journal的机器上如果不想启动journal,则可以带上 --nojournal 参数。
第一次启动带启用journal的服务前,通常磁盘上是没有journal file的,这时mongodb就会现在磁盘上为journal文件分配磁盘空间,这个过程会花比较长的时间(所以老师的视频演示中,第一次启动服务时花了很长的时间),在这段时间内服务是不可用的。如果想避免这个预分配动作也是可以的,就是从别的mongodb实例中拷贝一个已经预分配的文件,然后放到自己的journal路径中,这个预分配文件是不含数据的,因此是这种操作方式是安全的。另外,我在网上看到有人说如果采用ext4的文件系统,这个预分配的时间就会减小很多(据说ext4在ext3基础上性能的提高,比ext3在ext2基础上性能的提高要高不少),可惜我在尝试做这个实验时,尝试了几次把虚拟机CentOS上的ext3文件系统转为ext4都没有成功,所以最终放弃了这个实验,希望如果有人做了这个实验的话,将过程分享分享。
默认情况下mongodb每100毫秒往journal文件中flush一次数据,不过这是在数据文件和journal文件处于同一磁盘卷上的情况,而如果数据文件和journal文件不在同一磁盘卷上时,默认刷新输出时间是30毫秒。不过这个毫秒值是可以修改的,可修改范围是2~300,值越低,刷新输出频率越高,数据安全度也就越高,但磁盘性能上的开销也更高。
journal文件是以“j._”开头命名的,且是append only的,如果1个journal文件满了1G大小,mongodb就会新创建一个journal文件来使用,一旦某个journal文件所记载的写操作都被使用过了,mongodb就会把这个journal文件删除。通常在journal文件所在的文件夹下,只会存在2~3个journal文件,除非你使用mongodb每秒都写入大量的数据。而使用 smallfiles 这个运行时选项可以将journal文件大小减至128M大小。
Journal的工作原理:
首先要知道在这个原理中,存在着两个file,两个view。两个file是 data file 和 journal file,两个view是 shared view 和 private view。两个file是对磁盘而言的,而两个view是对内存而言的,下面以图解的方式解释:
启动服务前:
启动服务后,MongoDB请求操作系统将Data file映射到Shared view,此时操作系统只管映射这个动作,并不将数据加载到Shared view中,而是由MongoDB在需要时再将数据进行加载到Shared view。
然后,MongoDB再请求操作系统将Shared view映射到Private view,之后MongDB对数据的读写操作都是直接操作的Private view:
如果发生了写操作:
Private view变脏以后,根据journalCommitInterval的设置,将在一定时间后将写操作往Journal file中复制,这个过程称为“group commit”:
Journal file中记录的是原生的操作(raw operation),这些原生的操作可以使MongoDB完成以下操作:
对文档的插入/更新(document insertion/updates)
对索引的修改(index modifications)
对命名空间文件的修改(changes to the namespace files)
这些原生操作告诉了Journal file数据变化发生在Data file的什么位置。至此,MongoDB上发生的写事件可以被认为是安全的了,因为这些写操作已经被记录在了Journal file上,即使服务器掉电了,在下次启动MongoDB时,Journal file上的写操作将会被重演。
接下来,Journal file中记录的写操作会应用在Shared view上:
默认每隔60秒,MongoDB请求操作系统将Shared view刷新输出到Data file:
数据就被写入到数据文件了。这时MongoDB还会将Journal file中已输出到Data file的写操作删除掉(由于MongoDB在将Journal file中写操作放到Shared view时,是通过了一个前指针和一个后指针来操作的,所以MongoDB知道哪些写操作是被放到Shared view了的,哪些没有)。
最后,MongoDB还会例行地如一开始一样,将Shared view映射到Private view,以保持一致性(也是防止Private view变得太过于脏了)。
参考:
MongoDB官方文档、
http://blog.mongodb.org/post/337 ... bs-journaling-works
- 浏览: 27645 次
- 性别:
- 来自: 广州
最新评论
-
zhuhuixiao:
lucene的跳跃表是有层次的
(转) lucene索引结构改进-支持单机十亿级别的索引的检索 -
hydex:
谢谢作者
我是直接使用eclipse3.6 ,没有使用myec ...
如何给MyEclipse8.5安装插件 VSS
相关推荐
Spring Data MongoDB中文文档 便宜下载了。
MongoDB 3.6 中文文档
mongoDB中文文档和一个可以运行的dome,其中包括mongoDB索引,管道,事务,集合和crud等基本操作
MongoDB操作手册详细介绍MongoDB的语法用法
使用java向mongodb中插入数据 一、Linux安装mongodb 二、MongoDB客户端工具(MongoVUE)访问mongodb 三、通过Java操作MongoDB
MongoDB: The Definitive Guide by Kristina Chodorow and Michael Dirolf Copyright © 2010 Kristina Chodorow and Michael Dirolf. All rights reserved.
MongoDB Java API 中文
mongodb中文API及分布式分片实例详解。
Spring Data MongoDB 中文参考文档和Springboot使用例子,其中还介绍了spring-data-mongodb 如何使用mongodb的全文检索。
NoSQLBooster 管理MongoDB的工具。这个工具还有个曾用名--mongobooster
MongoDB中文用户手册
linux中MongoDB的安装包 linux中MongoDB的安装包 linux中MongoDB的安装包
Java 操作Mongodb中存储的文件的实例
一、MongoDB简介 3 二、MongoDB结构 3 二、MongoDB 数据库关系型...3、通过Schema来创建Model相当于mongoDB数据库中的集合collection 14 1、Mongoose查询 14 2、Mongoose增加 15 3、Mongoose修改 16 4、Mongoose删除 16
MongoDB图形化管理工具 MongoDB Compass
mongodb指南中文版,文字清晰,包含标签,哦我我我我噢噢噢。
Scaling MongoDB.pdf Scaling MongoDB.pdf Scaling MongoDB.pdf Scaling MongoDB.pdf Scaling MongoDB.pdf
Spring Data MongoDB 2.1中的新特性 5.2。Spring Data MongoDB 2.0中的新特性 5.3。Spring Data MongoDB 1.10中的新特性 5.4。Spring Data MongoDB 1.9中的新特性 5.5。Spring Data MongoDB 1.8中的新特性 5.6。...
资源名称:MongoDB应用设计模式内容简介:无论是在构建社交媒体网站,还是在开发一个仅在内部使用的企业应用程序,《MongoDB应用设计模式》展示了MongoDB需要解决的商业问题之间的连接。你将学到如何把MongoDB设计...