本章内容:
- 日志与WiredTiger存储引擎(Journaling and the WiredTiger Storage Engine)
- 日志与In-Memory存储引擎(Journaling and the In-Memory Storage Engine)
为了在发生故障时保障数据的持久性,MongoDB使用预写日志(write ahead logging)将数据记录到磁盘日志(journal)文件。
日志与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恢复数据的过程:
- 在数据文件中查找以找到最后一个检查点的标识符。
- 在日志文件中搜索与最后一个检查点的标识符匹配的记录。
- 使用最后一个检查点以后的日记文件里的操作来恢复数据。
日志记录过程(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" 写操作之前等待该写操作被写入到磁盘日志 。 这样,如果给定副本集中大多数节点的瞬时丢失(例如崩溃和重新启动),多数写入操作可能会回滚。
也可以看看资料:内存中存储引擎:持久化