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

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视图。操做系统只是映射数据与内存关系,并不立刻加载数据到内存。当查询须要的时候,才会加载数据到内存,即按需加载。code

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是颇有必要的。

相关文章
相关标签/搜索