日志
为了在发生故障时提供持久性,MongoDB 使用预写日志记录到磁盘日志文件。
日志和 WiredTiger 存储引擎
IMPORTANT
本节提到的日志是指WiredTiger write-ahead log(即journal),并不是MongoDB的日志文件。
WiredTiger使用检查点来提供磁盘上数据的一致视图,并允许 MongoDB 从上一个检查点恢复。但是,如果 MongoDB 在检查点之间意外退出,则需要日志记录来恢复在最后一个检查点之后发生的信息。
NOTE
从 MongoDB 4.0 开始,您不能为使用 WiredTiger 存储引擎的副本集节点指定--nojournal
选项或storage.journal.enabled: false
。
使用日志记录,恢复过程:
- 在数据文件中查找最后一个检查点的标识符。
- 在日志文件中搜索与最后一个检查点的标识符匹配的记录。
- 自上次检查点以来应用日志文件中的操作。
日志过程
在版本3.2中更改。
通过日志记录,WiredTiger 为每个客户端发起的写操作创建一个日志记录。日志记录包括由初始写入引起的任何内部写入操作。例如,对集合中文档的更新可能会导致对索引的修改;WiredTiger 创建单个日志记录,其中包括更新操作及其关联的索引修改。
MongoDB 配置 WiredTiger 使用内存缓冲来存储日志记录。线程协调分配和复制到它们的缓冲区部分。所有最大 128 kB 的日志记录都被缓冲。
WiredTiger 在以下任何情况下将缓冲的日志记录同步到磁盘:
对于副本集节点(主要和从节点),
- 如果有操作等待 oplog 条目。可以等待 oplog 条目的操作包括:
- 转发针对 oplog 的扫描查询
- 作为因果一致会话的一部分执行的读取操作
- 此外,对于次要成员,在每次批量应用 oplog 条目之后。
- 如果有操作等待 oplog 条目。可以等待 oplog 条目的操作包括:
如果写操作包括或暗示
j: true
.
NOTE
写关注"majority"
意味着j: true
如果writeConcernMajorityJournalDefault
是真的。
每 100 毫秒一次(参见 参考资料
storage.journal.commitIntervalMs
)。当 WiredTiger 创建新的日志文件时。因为 MongoDB 使用 100 MB 的日志文件大小限制,所以 WiredTiger 大约每 100 MB 数据创建一个新的日志文件。
IMPORTANT
在写入操作之间,虽然日志记录保留在 WiredTiger 缓冲区中,但在硬关闭mongod
.
TIP
也可以看看:
该serverStatus
命令在字段中返回有关 WiredTiger 日志统计信息的信息wiredTiger.log
。
日志文件
对于日志文件,MongoDB 在该目录下创建一个名为journal
的子目录dbPath
。WiredTiger 日志文件的名称具有以下格式WiredTigerLog.<sequence>
,其中<sequence>
是从 0000000001
.
日志记录
日志文件包含每个客户端发起的写入操作的记录
- 日志记录包括由初始写入引起的任何内部写入操作。例如,对集合中文档的更新可能会导致对索引的修改;WiredTiger 创建单个日志记录,其中包括更新操作及其关联的索引修改。
- 每条记录都有一个唯一的标识符。
- WiredTiger 的最小日志记录大小为 128 字节。
压缩
默认情况下,MongoDB 配置 WiredTiger 对其日志数据使用 snappy 压缩。要指定不同的压缩算法或不压缩,请使用 storage.wiredTiger.engineConfig.journalCompressor
设置。有关详细信息,请参阅更改 WiredTiger Journal Compressor .s
NOTE
如果日志记录小于或等于 128 字节(最小值 WiredTiger 的日志记录大小), WiredTiger 不压缩该记录。
日志文件大小限制
MongoDB 的 WiredTiger 日志文件的最大大小限制约为 100 MB。
- 一旦文件超过该限制,WiredTiger 就会创建一个新的日志文件。
- WiredTiger 自动删除旧日志文件以仅保留从上一个检查点恢复所需的文件。
预先分配
WiredTiger 预分配日志文件。
日志和内存存储引擎
从 MongoDB Enterprise 版本 3.2.6 开始,内存存储引擎是一般可用性 (GA) 的一部分。因为它的数据保存在内存中,所以没有单独的日志。j: true
立即确认具有写关注的写操作。
如果副本集的任何投票成员使用内存存储引擎,则必须设置 writeConcernMajorityJournalDefault
为false
。
NOTE
从 4.2 版(以及 4.0.13 和 3.6.14 )开始,如果副本集节点使用内存存储引擎 (投票或非投票)但副本集已 writeConcernMajorityJournalDefault
设置为 true,则副本集成员记录启动警告。
writeConcernMajorityJournalDefault
设置为 时,MongoDB在确认写入之前false
不会等待w: "majority"
写入写入磁盘日志。因此,"majority"
如果给定副本集中的大多数节点发生暂时性丢失(例如崩溃和重启),写操作可能会回滚。
TIP
也可以看看:
原文链接 -https://docs.mongodb.com/manual/core/journaling/
译者:陆文龙