先介绍一下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
- 浏览: 29053 次
- 性别:
- 来自: 广州
最新评论
-
zhuhuixiao:
lucene的跳跃表是有层次的
(转) lucene索引结构改进-支持单机十亿级别的索引的检索 -
hydex:
谢谢作者
我是直接使用eclipse3.6 ,没有使用myec ...
如何给MyEclipse8.5安装插件 VSS
相关推荐
Spring Data MongoDB 可以配置连接到MongoDB 的复制集,确保在主节点故障时仍能正常工作。 通过学习这篇文档,开发者可以熟练掌握Spring Data MongoDB 的各种特性,从而更高效地在Java 应用中利用MongoDB 的强大...
2. **集合(Collections)**:在MongoDB中,数据以文档的形式存储在集合里,类似于关系数据库中的表格。集合是动态模式的,不需要预先定义模式,这意味着你可以随时添加新的字段。 3. **CRUD操作**:创建(Create)...
MongoDB是一款分布式文档型数据库,以其灵活性、高性能和易扩展性在现代Web开发中占据了重要地位。MongoDB中文手册是开发者必备的参考资料,它详细介绍了MongoDB的各种操作和语法用法,帮助用户深入理解并有效利用这...
MongoDB 3.6 中文文档
1. **图形化用户界面(GUI)**:NoSQLBooster提供了一个直观的GUI,允许用户通过简单的拖放操作和清晰的布局来执行查询、插入、更新和删除操作,极大地简化了MongoDB数据库的管理工作。 2. **查询构建器**:对于不...
Spring Data MongoDB 是一个项目,它将 Spring 框架的核心概念应用于使用 MongoDB 文档样式数据存储的解决方案开发中。该项目提供了一个“模板”作为存储和查询文档的高级抽象层,其设计思想与 Spring Framework 中...
MongoDB图形化管理工具 MongoDB Compass
在使用这些测试数据时,你应该逐一实践每个操作,对比预期结果,理解MongoDB的工作原理。同时,你也可以利用这些数据进行性能调优,找出最佳实践。记住,实践是掌握任何技术的关键,尤其是像MongoDB这样的数据库管理...
2. 硬件:尽管MongoDB可以在各种硬件配置上运行,但为了获得最佳性能,建议至少有足够的内存来容纳数据库工作集,并且硬盘应具备良好的I/O性能,SSD是更好的选择。 3. 软件:对于Linux,确保系统已安装必要的库(如...
在MongoDB实战中文版中,你将学习到以下关键知识点: 1. **MongoDB基础**:MongoDB的基本概念,如文档、集合、数据库,以及如何安装和配置MongoDB服务器。 2. **CRUD操作**:Create(创建)、Read(读取)、Update...
MongoDB: The Definitive Guide by Kristina Chodorow and Michael Dirolf Copyright © 2010 Kristina Chodorow and Michael Dirolf. All rights reserved.
1. _id – 这是每个 MongoDB 文档中都需要的字段,表示 MongoDB 文档中的唯一值。 2. 集合 – 这是一组 MongoDB 文档,相当于在任何其他 RDM 中创建的表。 3. 游标 – 这是指向查询结果集的指针。 4. 数据库 – 这是...
总之,NoSQL Manager for MongoDB中文版是MongoDB管理员和开发者的得力助手,它以用户友好的界面和全面的功能,降低了MongoDB的管理和使用难度,提高了工作效率。无论是在日常开发、数据维护还是学习研究中,都是一...
MongoDB 实验报告 本实验报告旨在详细介绍 MongoDB 的安装、配置和基本操作步骤,本报告基于 CentOS 7 系统,通过一步一步的截图和文字说明,帮助读者快速掌握 MongoDB 的使用。 一、安装 MongoDB 首先,我们需要...
以上内容涵盖了《MongoDB原理与实战》中的关键知识点,从复制集的基础概念到存储引擎的工作原理,再到事务处理和索引管理的最佳实践,以及分片集群的架构设计和管理技巧,全方位展示了MongoDB的核心技术和应用技巧。...
MongoDB中的每一行记录就是一个文档,它是一个由键值对构成的数据结构,MongoDB文档与JSON对象类似。键的值可以包含其他的文档、数组、文档数组。 MongoDB的主要特点包括: 1. 高性能:MongoDB使用了高性能的存储...
在本文中,我们将详细介绍MongoDB的配置文件的各个部分,并解释每个设置的作用和意义。 一、数据库文件位置(dbpath) MongoDB的数据库文件位置是指mongodb数据文件的存储路径。这个设置非常重要,因为它将影响...
MongoDB使用了一种叫做BSON(类似于JSON)的格式来存储数据,它的数据模型与传统的关系型数据库有所不同,更贴近于应用程序的数据结构,这使得它在处理大量数据以及快速迭代的开发环境中表现尤为突出。 本书...
在这个例子中,我们首先创建了一个MongoDB客户端并连接到服务器,然后选择了名为`testDB`的数据库,接着插入了一个包含`name`和`age`字段的文档,并通过`find`方法查询了所有数据。最后,确保在操作完毕后关闭了...