日记
为了确保在发生故障时数据的持久性,MongoDB 会提前将日志记录写入磁盘上的日志文件。
日志和 WiredTiger 存储引擎
重要
本节提到的日志是指 WiredTiger 预写日志(即日志),而不是 MongoDB 日志文件。
WiredTiger 使用检查点提供磁盘上数据的一致视图,并允许 MongoDB 从最后一个检查点恢复。但是,如果 MongoDB 在检查点之间意外退出,则需要日志来恢复最后一个检查点之后发生的信息。
注意
从 MongoDB 6.1 开始,日志始终处于启用状态。因此,MongoDB 删除了 storage.journal.enabled
选项以及相应的 --journal
和 --nojournal
命令行选项。
通过日志记录,恢复进程:
在数据文件中查找最后一个检查点的标识符。
在日志文件中搜索与上一个检查点的标识符匹配的记录。
应用日志文件中自上个检查点以来的操作。
日志记录进程
通过日志记录,WiredTiger 为每个客户端发起的写入操作创建一条日志记录。日志记录包括由初始写入引起的任何内部写入操作。例如,对集合中文档的更新可能会导致对索引的修改;WiredTiger 创建一条日志记录,其中包括更新操作及其关联的索引修改。
MongoDB 配置 WiredTiger 使用内存缓冲来存储日志记录。线程进行协调以分配并复制到它们的缓冲区部分。所有不超过 128 kB 的日记记录都会被缓冲。
当满足以下任一条件时,WiredTiger 会将缓冲的日志记录同步到磁盘:
对于副本集成员(主节点和从节点成员):
如果写入操作包含或暗示
j: true
的写关注。此外,对于从节点,在每次批量应用 oplog 条目之后进行。
注意
如果
writeConcernMajorityJournalDefault
为真,则写关注"majority"
暗示为j: true
。每 100 毫秒一次(请参阅
storage.journal.commitIntervalMs
)。当 WiredTiger 创建新的日志文件时。由于 MongoDB 使用上限 100 MB 的日志文件,所以 WiredTiger 大约每 100 MB 数据创建一份新日志文件。
重要
在写入操作之间,虽然日志记录保留在 WiredTiger 缓冲区中,但硬关闭 mongod
后可能会丢失更新。
Journal Files
对于日志文件,MongoDB 会在 dbPath
目录下创建一个名为 journal
的子目录。WiredTiger 日志文件的名称采用以下格式 WiredTigerLog.<sequence>
,其中 <sequence>
是从 0000000001
开始的零填充数字。
日志记录
在日志文件中,客户端启动的每个写入操作都有一条记录
日志记录包括由初始写入引起的任何内部写入操作。例如,对集合中文档的更新可能会导致对索引的修改;WiredTiger 创建一条日志记录,其中包括更新操作及其关联的索引修改。
每条记录都有一个唯一的标识符。
WiredTiger 的最小日记记录大小为 128 字节。
压缩
默认情况下,MongoDB 将 WiredTiger 配置为对其日志数据使用 snappy 压缩。要指定不同的压缩算法或不进行压缩,请使用 storage.wiredTiger.engineConfig.journalCompressor
设置。有关详细信息,请参阅更改 WiredTiger 日记压缩器。
注意
如果日志记录小于或等于 128 字节(最小的 WiredTiger 日志记录大小),WiredTiger 不会压缩该记录。
日志文件大小限制
WiredTiger 日志文件的大小限制约为 100 MB。一旦文件超过该限制,WiredTiger 就会创建一个新的日志文件。
WiredTiger 会自动删除旧日志文件,仅保留从上一个检查点恢复所需的文件。要确定为日志文件留出多少磁盘空间,请考虑以下因素:
检查点的默认最大大小为 2 GB
MongoDB 在从检查点恢复时可能需要额外的空间来写入新的日志文件
MongoDB 压缩日志文件
恢复检查点所需的时间取决于您的使用案例
如果覆盖最大检查点大小或禁用压缩,则计算结果可能会有很大不同
由于这些原因,很难准确计算出您需要多少额外空间。高估磁盘空间始终是一种更安全的方法。
重要
如果您没有为日志文件留出足够的磁盘空间,MongoDB 服务器将会崩溃。
预先分配
WiredTiger 会预先分配日志文件。
日志和内存存储引擎
在 MongoDB Enterprise 中,内存存储引擎是正式发布版 (GA) 的一部分。由于其数据保存在内存中,因此没有单独的日志。写关注为 j: true
的写入操作会立即得到确认。
如果副本集的任何有投票权成员使用内存存储引擎,则必须将 writeConcernMajorityJournalDefault
设为 false
。
注意
从版本 4.2(以及 4.0.13 和 3.6.14)开始,如果某个副本集节点使用内存存储引擎(有投票权或无投票权),但副本集将 writeConcernMajorityJournalDefault
设置为 true,则该副本集节点会记录一个启动警告。
将 writeConcernMajorityJournalDefault
设置为 false
时,MongoDB 不会等待 w: "majority"
写入在写入到磁盘日志后才确认写入。例如,"majority"
写操作可能会在给定副本集中的大部分节点发生临时断连(例如崩溃和重启)的情况下回滚。