日志记录
为了在发生故障时提供持久性,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
为true,则写关注“majority”意味着j: true
。每100毫秒一次(参见
storage.journal.commitIntervalMs
)。当WiredTiger创建一个新的日志文件时。由于MongoDB使用100 MB的日志文件大小限制,WiredTiger大约每100 MB数据创建一个新的日志文件。
重要
在写操作之间,当日志记录仍然保留在WiredTiger缓冲区中时,更新可能在mongod
硬关闭后丢失。
期刊文件
对于期刊文件,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企业版中,内存存储引擎是作为通用版(GA)的一部分。由于其数据存储在内存中,因此没有单独的日志。具有j: true
写入关注度的写操作会立即得到确认。
如果复制集的任何投票成员使用内存存储引擎,则必须将writeConcernMajorityJournalDefault
设置为false
。
注意
从版本4.2(以及4.0.13和3.6.14)开始,如果复制集成员使用内存存储引擎(投票或非投票)但复制集将writeConcernMajorityJournalDefault
设置为true,则复制集成员会在启动时记录一条警告。
当writeConcernMajorityJournalDefault
设置为false
时,MongoDB在确认写入之前不会等待将写操作写入磁盘日志。因此,“多数”写入操作在给定复制集中多数节点发生暂时性故障(例如崩溃和重启)的情况下可能会回滚。