Docs 菜单
Docs 主页
/
MongoDB Manual
/

日记

在此页面上

  • 日志和 WiredTiger 存储引擎
  • 日志和内存存储引擎

为了确保在发生故障时数据的持久性,MongoDB 会提前将日志记录写入磁盘上的日志文件。

重要

本节提到的日志是指 WiredTiger 预写日志(即日志),而不是 MongoDB 日志文件。

WiredTiger 使用检查点提供磁盘上数据的一致视图,并允许 MongoDB 从最后一个检查点恢复。但是,如果 MongoDB 在检查点之间意外退出,则需要日志来恢复最后一个检查点之后发生的信息。

注意

从 MongoDB 6.1 开始,日志始终处于启用状态。因此,MongoDB 删除了 storage.journal.enabled 选项以及相应的 --journal--nojournal 命令行选项。

通过日志记录,恢复进程:

  1. 在数据文件中查找最后一个检查点的标识符。

  2. 在日志文件中搜索与上一个检查点的标识符匹配的记录。

  3. 应用日志文件中自上个检查点以来的操作。

通过日志记录,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 后可能会丢失更新。

提示

另请参阅:

serverStatus 命令在 wiredTiger.log 字段中返回 WiredTiger 日记统计信息。

对于日志文件,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" 写操作可能会在给定副本集中的大部分节点发生临时断连(例如崩溃和重启)的情况下回滚。

提示

另请参阅:

后退

WiredTiger