Journaling

在本页面

为了在出现故障时提供持久性,MongoDB 使用预先写入日志到磁盘journal文件上。

日记和 WiredTiger 存储引擎

Important

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

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

使用日记,恢复过程:

Journaling Process

在版本 3.2 中更改。

使用日记功能,WiredTiger 为每个 Client 端发起的写操作创建一个日记记录。日志记录包括由初始写入引起的任何内部写入操作。例如,对集合中文档的更新可能会导致对索引的修改; WiredTiger 创建单个日志记录,其中包含更新操作及其关联的索引修改。

MongoDB 将 WiredTiger 配置为使用内存缓冲来存储日记记录。线程进行协调以分配并复制到其缓冲区中。最多可缓存 128 kB 的所有日记记录。

WiredTiger 在以下任一情况下将缓冲的日记记录同步到磁盘:

Note

如果writeConcernMajorityJournalDefault为 true,则写关注点"majority"表示j: true

Important

在两次写操作之间,虽然日记记录保留在 WiredTiger 缓冲区中,但是在硬关闭mongod之后更新可能会丢失。

See also

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

Journal Files

对于日记文件,MongoDB 在dbPath目录下创建一个名为journal的子目录。 WiredTiger 日志文件的名称具有以下格式WiredTigerLog.<sequence>,其中<sequence>是从0000000001开始的零填充数字。

Journal Records

日志文件包含每个 Client 端启动的写操作的记录。

Compression

默认情况下,MongoDB 将 WiredTiger 配置为对其日记数据使用快速压缩。要指定其他压缩算法或不压缩,请使用storage.wiredTiger.engineConfig.journalCompressor设置。有关详细信息,请参见更换 WT Journal Compressor

Note

如果日志记录小于或等于 128 个字节(最小WiredTiger 的日志记录大小),则 WiredTiger 不会压缩该记录。

日志文件大小限制

MongoDB 的 WiredTiger 日志文件的最大大小限制为大约 100 MB。

Pre-Allocation

WiredTiger 预分配日记文件。

日记和 MMAPv1 存储引擎

使用MMAPv1时,发生写操作时,MongoDB 将更新 memoryview。启用日记功能后,MongoDB 首先将内存中的更 Rewrite 入磁盘上的日记文件。如果在将更改提交到数据文件之前,MongoDB 应该终止或遇到错误,则 MongoDB 可以使用日志文件将写操作应用于数据文件并保持一致的状态。

Journaling Process

使用日记功能时,MongoDB 的存储层具有数据集的两个内部视图:用于写入日志文件的* private 视图和用于写入数据文件的 shared 视图*:

如果mongod实例在未将写入应用于数据文件的情况下崩溃,则日志可以将写入重放到共享视图,以最终写入数据文件。

当 MongoDB 刷新对数据文件的写入操作时,MongoDB 会记录已刷新了哪些日志写入。一旦日志文件仅包含刷新的写入,就不再需要恢复,MongoDB 可以将其回收用于新的日志文件。

将日志操作应用于共享视图并刷新到磁盘后(即,共享视图和私有视图中的页面已同步),MongoDB 要求 os 将共享视图重新 Map 到私有视图以节省物理 RAM 。 MongoDB 通常要求 os 将共享视图重新 Map 到私有视图,以节省物理 RAM。在进行新的重新 Map 后,os 知道可以在共享视图和私有视图 Map 之间共享物理内存页。

Note

共享视图和磁盘数据文件之间的交互类似于 MongoDB 的工作方式(没有日志)。如果没有日志记录,MongoDB 会要求 os 每 60 秒刷新一次内存更改到数据文件中。

Journal Files

启用日记功能后,MongoDB 在dbPath目录下创建一个名为journal的子目录。 journal目录包含名为j._<sequence>的日记文件,其中<sequence>是从0开始的整数和“最后序号”文件lsn

日志文件包含预写日志;每个日志条目均描述了数据文件中写入操作更改的字节。日志文件是仅追加文件。当日志文件包含 1 GB 数据时,MongoDB 会创建一个新的日志文件。如果在启动mongod时使用storage.smallFiles选项,则将每个日志文件的大小限制为 128 MB。

lsn文件包含 MongoDB 上次刷新对数据文件所做的更改的时间。

一旦 MongoDB 将特定日记文件中的所有写操作应用于数据文件,MongoDB 便可以将其回收以使用新的日记文件。

除非每秒写入许多字节的数据,否则journal目录应仅包含两个或三个日志文件。

彻底关机会删除日记目录中的所有文件。肮脏的关闭(崩溃)将文件保留在日志目录中。这些用于在 mongod 进程重新启动时自动将数据库恢复到一致状态。

Journal Directory

为了加快对当前日记文件的频繁 Sequences 写入,可以确保日记目录与数据库数据文件位于不同的文件系统上。

Important

如果将日记帐与数据文件放在不同的文件系统上,那么您不能单独使用文件系统快照来捕获dbPath目录的有效备份。在这种情况下,使用fsyncLock()来确保数据库文件在快照之前是一致的,并使用fsyncUnlock()一旦快照完成就可以。

Preallocation Lag

如果mongod进程确定预分配日记文件比按需要创建新日记文件更有效,则 MongoDB 可能会预分配日记文件。

根据您的文件系统,首次启动启用日记功能的mongod实例时,可能会遇到预分配滞后的情况。预分配文件所需的时间可能持续几分钟。在此期间,您将无法连接到数据库。这是一次性的预分配,以后的调用不会发生。

为避免预分配滞后,请参阅避免 MMAPv1 的预分配滞后

日记和内存中存储引擎

从 MongoDB Enterprise 3.2.6 版开始,内存中存储引擎是常规可用性(GA)的一部分。因为其数据保留在内存中,所以没有单独的日志。立即确认写关注为j: true的写操作。

如果副本集的任何有投票权的成员都没有journaling运行(即运行内存存储引擎或禁用日记功能运行),则必须将writeConcernMajorityJournalDefault设置为false

Note

从版本 3.6.14 开始,如果副本集成员使用内存存储引擎(投票或不投票),但是副本集的writeConcernMajorityJournalDefault设置为 true,则副本集成员将记录启动警告。

writeConcernMajorityJournalDefault设置为false的情况下,MongoDB 在确认写入之前不会 awaitw: "majority"写入磁盘日志上。这样,如果给定副本集中的大多数节点发生瞬时丢失(例如崩溃和重新启动),则majority写操作可能会回滚。

首页