摘要

Mongodb也有log日志功能,它只是记录了数据库在服务器上的启动信息,慢查询记录,数据库异常信息,客户端与数据库服务器连接、断开等信息。Journaling日志功能则是Mongodb里面非常重要的一个功能,它保证了数据库服务器在以外端点、自然灾害等情况下数据的完整性。尽管Mongodb还提供了复制集等备份功能,单Journaling的功能在生产环境中是必不可少的,它依靠了较小的cpu和内存消耗,带来的是数据库的持久性和稳定性。

5.1两个重要的存储视图

Private和shared view这两个内存视图都是通过MMAP来实现的,其中private view的映射的内存修改不会影响到磁盘上;shared view中数据的变化会影响到磁盘上的文件,系统会周期性的刷新shared view 中的数据到磁盘。

Shared view在mongodb启动的过程中,操作系统会将磁盘上的数据文件映射到内存中的shared view。操作系统只完成映射,并没有立即加载数据到内存,mongodb会根据需要加载数据到shared view。

Private view内存视图是为读操作保存数据的位置,是mongodb保存新的写操作的第一个地方。

磁盘上的Journaling日志文件是实现写操作持久化保存的地方,mongodb实例启动时会读这个文件。

5.2Journaling工作原理

如果mongodb启动时没有打开Journaling功能,操作系统将每60s刷新shared视图对应的内存中的变化数据到磁盘中。

如果mongodb启动的时候打开了Journaling功能,mongod会额外的产生一个private视图,mongod会将shared view与private view 进行同步。

MongoDB记录 流处理 为什么用mongodb记录日志_数据

如上图所示:

1.当写操作发生时,mongod首先会将数据写到内存中的private view视图处。

这里private并没有直接和磁盘上文件进行连接,因此此时操作系统不会将变化刷新到磁盘上。

2.然后mongod将写操作批量复制到Journal,journal会将写操作存储到磁盘上的文件上,使其持久化保存,journal日志文件上的每个条目都描述了写操作更改了数据文件上的那些字节。

3.mongod启动时,会利用journal日志中的写操作记录引起的数据变化来更新shared视图中的数据。

4.当所有的变化操作都更新到shared视图中后,mongodb将重新利用shared视图来同步private view 视图,防止private view 数据变得"太脏"。

MongoDB记录 流处理 为什么用mongodb记录日志_mongodb_02

如上图所示:

Mongod重新启动时利用journal日志恢复数据的过程如上。

当执行完刷新数据到磁盘后,mongodb会删除掉journal中这个时间节点之后的所有写操作。

将journal写操作周期性批量写到journal日志文件中,这个周期的大小是通过启动参数journalCommitInterval来控制的,默认值是100ms。Mongodb经过60ms的周期刷新内存中的数据变化到磁盘,这个值是通过syncdelay来控制的。

Mongodb在启动时,专门初始化了一个线程不断循环,用于在一定时间周期内将从defer队列中获取到的需要持久化写入到磁盘的journal和mongofile处。

5.3总结

Journaling是mongodb中非常重要的一个功能,类似于关系数据库中的事务日志。