为了在发生故障时提供持久性,MongoDB使用预写日志记录到磁盘日记文件。
重要
本节中提到的日志是指WiredTiger预写日志(即日志),而不是MongoDB日志文件。
WiredTiger使用检查点提供磁盘上数据的一致视图,并允许MongoDB从最后一个检查点恢复。但是,如果MongoDB在检查点之间意外退出,则需要日志记录来恢复在最后一个检查点之后发生的信息。
注意
从MongoDB 4.0开始,您无法指定--nojournal
选项或使用WiredTiger存储引擎的副本集成员。storage.journal.enabled:
false
使用日记,恢复过程:
在版本3.2中更改。
使用日记功能,WiredTiger为每个客户端启动的写操作创建一个日记记录。日记记录包括由初始写入引起的任何内部写入操作。例如,对集合中文档的更新可能会导致对索引的修改;WiredTiger创建一条日志记录,其中包含更新操作及其关联的索引修改。
MongoDB将WiredTiger配置为使用内存缓冲来存储日记记录。线程进行协调以分配并复制到其缓冲区中。最多可缓存128 kB的所有日记记录。
WiredTiger在以下任一情况下将缓冲的日记记录同步到磁盘:
对于副本集成员(主要和次要成员),
如果写操作包括或暗含的写关注点
。j: true
注意
写关注"majority"
暗示了如果真是真的。j: true
writeConcernMajorityJournalDefault
每100毫秒(请参阅storage.journal.commitIntervalMs
)。
WiredTiger创建新的日记文件时。由于MongoDB使用的日志文件大小限制为100 MB,因此WiredTiger大约每100 MB数据创建一个新的日志文件。
重要
在两次写操作之间,虽然日记记录保留在WiredTiger缓冲区中,但是在硬关闭时更新可能会丢失mongod
。
也可以看看
该serverStatus
命令在该wiredTiger.log
字段中返回有关WiredTiger日记统计信息的信息。
对于日记文件,MongoDB在目录journal
下创建一个子目录dbPath
。WiredTiger日记文件的名称具有以下格式WiredTigerLog.<sequence>
,其中<sequence>
以开头为零
0000000001
。
日志文件包含每个客户端启动的写操作的记录
默认情况下,MongoDB将WiredTiger配置为对其日记数据使用快速压缩。若要指定其他压缩算法或不进行压缩,请使用该
storage.wiredTiger.engineConfig.journalCompressor
设置。有关详细信息,请参阅更改WiredTiger日志压缩器。
注意
如果日志记录小于或等于128个字节( WiredTiger的最小日志记录大小),则WiredTiger不会压缩该记录。
MongoDB的WiredTiger日志文件的最大大小限制为大约100 MB。
WiredTiger预分配日记文件。
从MongoDB Enterprise 3.2.6版开始,内存中存储引擎是常规可用性(GA)的一部分。因为其数据保留在内存中,所以没有单独的日志。写入关注为的写入操作将立即得到确认。j: true
如果副本集的任何有投票权的成员使用内存存储引擎,则必须设置
writeConcernMajorityJournalDefault
为false
。
注意
从版本4.2(以及4.0.13和3.6.14)开始,如果副本集成员使用内存中的存储引擎
(投票或不投票),但副本集已
writeConcernMajorityJournalDefault
设置为true,则副本集成员记录启动情况警告。
随着writeConcernMajorityJournalDefault
设置为false
,MongoDB的不等待
写入承认写之前被写入到磁盘上的日志。这样,在给定副本集中的大多数节点发生瞬时丢失(例如崩溃和重新启动)的情况下,写操作可能会回滚。w: "majority"
majority
也可以看看