【MongoDB】数据存储(Storage)之 日志(Journaling)

时间:2024-03-19 17:36:10

本章内容:

  • 日志与WiredTiger存储引擎(Journaling and the WiredTiger Storage Engine)
  • 日志与In-Memory存储引擎(Journaling and the In-Memory Storage Engine)

为了在发生故障时保障数据的持久性,MongoDB使用预写日志write ahead logging将数据记录到磁盘日志(journal)文件。

【MongoDB】数据存储(Storage)之 日志(Journaling)

日志与WiredTiger存储引擎(Journaling and the WiredTiger Storage Engine)

重要

本节中提到的日志log)是指WiredTiger预写日志(write ahead logging)(即journal),而不是MongoDB日志(log)文件。

WiredTiger使用检查点(checkpoints)提供磁盘上数据的一致性视图,并且MongoDB可以从最后一个检查点恢复数据。但是,如果MongoDB在检查点之间意外退出,则日志( journaling )提供了上一个检查点之后的信息,以供恢复数据。

注意

从MongoDB 4.0开始,对于使用WiredTiger存储引擎的副本集成员,不能指定--nojournal选项或storage.journal.enabled:false

journaling恢复数据的过程:

  1. 在数据文件中查找以找到最后一个检查点的标识符。
  2. 在日志文件中搜索与最后一个检查点的标识符匹配的记录。
  3. 使用最后一个检查点以后的日记文件里的操作来恢复数据。

 

日志记录过程Journaling Process

在版本3.2中更改。

使用journaling功能,WiredTiger为每个客户端发起的写操作创建一个日记记录。日志记录(journal record)包括由初始写入引起的任何内部写入操作。例如,对集合中文档的更新可能会导致对索引的修改; WiredTiger创建一条journal 记录,其中包含更新操作及与其关联的索引修改。

MongoDB设定WiredTiger使用内存缓存来存储journal 记录。线程进行协调以分配并复制到其缓冲区中。当所有journal 记录大小达到128 kB时就被缓存起来。

以下任一情况下,WiredTiger都会将缓冲的journal 记录同步到磁盘:

  • 对于副本集成员(primary and secondary members),

          1.是否有等待oplog的操作。可以等待oplog条目的操作包括:

                - 当读操作作为因果一致会话的一部分;

                - 对oplog转发、扫描、查询。

         2.另外,对于secondary,在每次批处理oplog志条目之后。

  • 如果一个写操作,包括或暗含j:true的写关注。

注意

如果writeConcernMajorityJournalDefault为true,那么此时写关注 "majority" 暗含了j:true的意思。

  • 每隔100毫秒(请参阅storage.journal.commitIntervalMs)。
  • WiredTiger创建新的 journal 文件时。由于MongoDB使用的 journal文件大小限制为100 MB,因此WiredTiger大约每100 MB数据创建一个新的journal 文件。

重要

在两次写操作之间,虽然 journal记录保留在WiredTiger缓存区中,但在mongod硬关闭后,更新可能会丢失。

也可以看看如下资料:

serverStatus命令在wireTiger.log字段中返回有关WiredTiger journal统计数据的信息。

 

日志文件(Journal Files

 

对于journal文件,MongoDB在dbPath目录下创建一个名为journal的子目录。 WiredTiger日志文件的名称具有以下格式WiredTigerLog.<sequence>,其中<sequence>是从0000000001开始的补零数字。

 

日志记录(Journal Records

journal文件包含每个客户端发起的写操作的记录。

  • journal记录包括由初始写入引起的任何内部写入操作。例如,对集合中文档的更新可能会导致对索引的修改; WiredTiger创建一条日志记录,其中包含更新操作及与其关联的索引修改。
  • 每个记录都有一个唯一的标识符。
  • 对于WiredTiger,一个journal记录最小为128 bytes。

 

压缩(Compression

默认情况下,MongoDB 配置WiredTiger使用快速压缩来处理其日志数据( journaling data)。要指定其他压缩算法或不进行压缩,请使用

storage.wiredTiger.engineConfig.journalCompressor配置。有关详细信息,请参阅Change WiredTiger Journal Compressor

注意

如果日志记录小于或等于128 bytes(最小的WiredTiger log记录大小),则WiredTiger不会压缩该记录。

 

日志文件大小限制(Journal File Size Limit

MongoDB的WiredTiger journal文件的最大限制为大约100 MB。

  • 一旦文件超过该限制,WiredTiger将创建一个新的journal文件。
  • WiredTiger自动删除旧的journal文件,仅维护从上一个检查点恢复数据所需的文件。

 

预分配(Pre-Allocation

WiredTiger预分配journal文件。

 

日记和内存中存储引擎(Journaling and the In-Memory Storage Engine

 

从MongoDB Enterprise 3.2.6版开始,In-Memory 存储引擎是一般可用性(general availability GA,代表广泛推广、推荐使用)的一部分。因为其数据保留在内存中,所以没有单独的日志(journal)。写关注为j:true的写操作立即确认

 

副本集中,如果任何有投票权的成员使用In-Memory 存储引擎,则必须将

writeConcernMajorityJournalDefault设置为false。

注意

从版本4.2(以及4.0.13和3.6.14)开始,如果副本集成员使用In-Memory 存储引擎(投票或不投票),但是副本集的writeConcernMajorityJournalDefault设置为true,则副本集成员会记录一个启动警告。

writeConcernMajorityJournalDefault设置为false时,MongoDB不会在确认w: "majority" 写操作之前等待该写操作被写入到磁盘日志 。 这样,如果给定副本集中大多数节点的瞬时丢失(例如崩溃和重新启动),多数写入操作可能会回滚。

 

也可以看看资料:内存中存储引擎:持久化

原文:https://docs.mongodb.com/manual/core/journaling/