文档菜单
文档首页
/
MongoDB 手册
/

日志记录

本页内容

  • 日志记录和 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为true,则写关注“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企业版中,内存存储引擎是作为通用版(GA)的一部分。由于其数据存储在内存中,因此没有单独的日志。具有j: true写入关注度的写操作会立即得到确认。

如果复制集的任何投票成员使用内存存储引擎,则必须将writeConcernMajorityJournalDefault设置为false

注意

从版本4.2(以及4.0.13和3.6.14)开始,如果复制集成员使用内存存储引擎(投票或非投票)但复制集将writeConcernMajorityJournalDefault设置为true,则复制集成员会在启动时记录一条警告。

writeConcernMajorityJournalDefault设置为false时,MongoDB在确认写入之前不会等待将写操作写入磁盘日志。因此,“多数”写入操作在给定复制集中多数节点发生暂时性故障(例如崩溃和重启)的情况下可能会回滚。

返回

WiredTiger