在发生故障时提供持久化,MongoDB使用预写日志到磁盘上的日志文件。

WiredTiger存储引擎和日志

在这一节中提到的日志是MongoDB预写日志而不是MongoDB日志文件,WiredTiger使用checkpoints在硬盘上提供一致的数据视图并且允许MongoDB使用最后一个checkpoint恢复数据,然而如果MongoDB意外退出在检查点之间,日志是恢复最后一个检查点之后的数据;


日志恢复过程

1.在数据文件中找到最后一个检查点的标识;

2.在日志文件中搜索与最后一个检查点标识符相匹配的记录;

3.从最后一个检查点应用日志文件的操作;


日志记录过程

WiredTiger创建一个日志文件记录每一个客户端的写操作,日志记录包括任何由初始写入引起的任何内部写操作;例如:集合中对文档的更新可能会导致索引的更新,WiredTiger创建单个日志记录包含更新操作以及相关联的索引修改操作;

MongoDB使用WiredTiger存储引擎在缓存中存储日志文件,线程协调和分配缓冲区的一部分,日志记录最高可达128Bytes;


WiredTiger同步缓冲日志记录到硬盘上按以下间隔和条件

在MongoDB3.2版本是每隔100毫秒;

MongoDB的WiredTiger存储引擎的检查点集在用户数据每隔60秒或者日志文件达到2GB时那个条件满足就执行日志同步写入;

MongoDB日志文件的大小限制在100MB,当文件大小达到100MB时候会创建一个新的日志文件,当新的日志文件同步成功,WiredTiger会同步旧的日志文件;


日志文件

MongoDB在dbpath路径下创建一个子目录journal,WiredTiger存储引擎的日志文件格式如下WiredTigerLog.<sequence>,sequence是0填充数从0000000001开始。


日志文件包含每个写入操作的记录,每个记录都有唯一的标识符。


MongoDB的WiredTiger存储引擎使用snappy压缩库压缩日志数据。


对于WiredTiger最小的日志记录是128Bytes,如果一个日志记录是128Bytes或者更小,WiredTiger不会压缩日志记录。


MongoDB的WiredTiger日志记录文件有一个最大100M的限制,一旦文件超过这个极限,WiredTiger创建一个新的日志文件。


WiredTIger自动删除旧的日志文件仅维持文件需要从最后一个检查点恢复数据的记录。


WiredTiger将预分配日志文件


MMAPv1存储引擎及日志


当有一个写操作时MongoDB更新写操作,启动日志功能,MongoDB首先会将写入操作写入到内存中在写入硬盘日志文件之前,如果在提交更改到数据文件之前MongoDB终端或者遇到一个错误,MongoDB可以使用日志文件将写入操作和数据文件保持一致。


日志进程


日志,MongoDB的存储层有两个内部数据集的观点:私有视图,用于写入到日志文件,以及共享视图,用于写入数据文件:

1.MongoDB首先适用于私有视图写操作。

2.MongoDB在日志目录中大概每100毫秒运用私有视图更新日志到日志文件中,MongoDB记录写操作到数据文件使用批处理的方式,分组提交可以提高性能,自动写入到日志文件,确保数据一致,

3.提交一个日志,MongoDB适用于分片视图

4.最终,MongoDB的应用共享视图中更改的数据文件。更准确地说,默认间隔为60秒。MongoDB要求操作系统将共享视图的数据文件写入日志文件,操作系统可以选择以高于60秒的频率刷新共享视图到磁盘,特别是如果系统空闲内存不足。使用 storage.syncPeriodSecs2设置改变写入数据的时间间隔。


如果mongod实例崩溃了没有应用写入数据文件,日志可以重播写入共享视图最终写入数据文件。

当MongoDB刷新数据到数据文件,MongoDB标识哪个日志文件已经刷新,一旦一个日志文件刷新过,MongoDB需要生成一个新的日志文件。