日记
为了确保在发生故障时数据的持久性,MongoDB 会提前将日志记录写入磁盘上的日志文件。
日志和 WiredTiger 存储引擎
重要
本节提到的日志是指 WiredTiger 预写日志(即日志),而不是 MongoDB 日志文件。
WiredTiger 使用检查点提供磁盘上数据的一致视图,并允许 MongoDB 从最后一个检查点恢复。但是,如果 MongoDB 在检查点之间意外退出,则需要日志来恢复最后一个检查点之后发生的信息。
注意
您不能为使用WiredTiger存储引擎的副本集成员指定 --nojournal
选项或storage.journal.enabled: false
。
通过日志记录,恢复进程:
在数据文件中查找最后一个检查点的标识符。
在日志文件中搜索与上一个检查点的标识符匹配的记录。
应用日志文件中自上个检查点以来的操作。
日志记录进程
通过日志记录,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 日记统计信息。
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"
写操作可能会在给定副本集中的大部分节点发生临时断连(例如崩溃和重启)的情况下回滚。
另请参阅: