Manual (Version 4.2)> Storage > Journaling
在本页面将从以下两点论述:
日志记录和WiredTiger存储引擎
日志记录和内存存储引擎
为了在发生故障时提供持久性,MongoDB使用预写日志记录到磁盘journal文件中。
日志记录和WiredTiger存储引擎
重要
本节中提到的log是指WiredTiger预写日志(即日志),而不是MongoDB日志文件。
WiredTiger使用检查点以提供磁盘上数据的一致视图,并允许MongoDB从最后一个检查点恢复。但是,如果MongoDB在检查点之间意外退出,则需要日记来恢复上一个检查点之后发生的信息。
注意
从MongoDB 4.0开始,对于使用WiredTiger存储引擎的副本集成员,不能指定--nojournal选项或storage.journal.enabled:false。
使用日志记录的恢复过程:
1.在数据文件中查找最后一个检查点的标识符。
2.在日记文件中搜索与最后一个检查点的标识符匹配的记录。
3.从上一个检查点开始,将操作应用于日志文件。
日志记录过程
于3.2版本中变更
使用日志功能,WiredTiger为每个客户端发起的写操作创建一个日记记录。日志记录包括由初始写入引起的任何内部写入操作。例如,对集合中文档的更新可能会导致对索引的修改;WiredTiger创建单个日志记录,其中包含更新操作及其关联的索引修改。
MongoDB将WiredTiger配置为使用内存缓冲来存储日记记录。线程进行协调以分配并复制到其缓冲区中。全部日记记录最多可缓存128kB。
WiredTiger在以下任一情况下将缓冲的日记记录同步到磁盘:
对于副本集成员(主节点和从节点成员),
针对oplog转发扫描查询
读取操作作为因果一致会话的一部分执行
如果有操作在等待操作日志条目。可以等待操作日志条目的操作包括:
另外,对于从节点成员,在每次批量处理oplog条目之后。
如果写操作包含或隐含了j:true的写关注。
注意
如果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.,其中是从0000000001开始的零填充数字。
日志记录
日志文件包含每个客户端的初始写操作记录
日记记录包括由初始写入引起的任何内部写入操作。例如,对集合中文档的更新可能会导致对索引的修改;WiredTiger创建单个日志记录,其中包含更新操作及其关联的索引修改。
每个记录都有一个唯一的标识符。
WiredTiger的最小日志记录大小为128字节。
压缩
默认情况下,MongoDB将WiredTiger配置为对其日记数据使用snappy压缩。要指定其他压缩算法或不进行压缩,请使用storage.wiredTiger.engineConfig.journalCompressor设置。详细信息请参阅Change WiredTiger Journal Compressor。
注意
如果日志记录小于或等于128字节(WiredTiger的最小值日志记录大小),则WiredTiger不会压缩该记录。
日志文件大小限制
MongoDB的WiredTiger日志文件的大小限制为最大大约为100 MB。
文件超过该限制后,WiredTiger将创建一个新的日记文件。
WiredTiger会自动删除旧的日志文件,仅保留从上一个检查点恢复所需的文件。
预分配
WiredTiger预分配日志文件。
日志和内存存储引擎
从MongoDB Enterprise的3.2.6版本开始,内存存储引擎就成为MongoDB常规可用性(GA)的一部分。因为其数据保留在内存中,所以没有单独的日志。使用写关注j:true的写操作会被立即确认。
如果副本集中任何有投票权的成员使用内存存储引擎,则必须将writeConcernMajorityJournalDefault设置为false。
注意
从版本4.2(以及4.0.13和3.6.14)开始,如果副本集成员使用内存存储引擎(投票或非投票),但副本集的writeConcernMajorityJournalDefault设置为true,则副本集成员会记录一条启动警告。
将writeConcernMajorityJournalDefault设置为false,MongoDB在确认写入之前不会等待w:“majority”的写操作被写入磁盘日志。因此,majority写操作可能会在给定副本集中的大多数节点瞬时丢失(比如崩溃和重启)时回滚。
同样请参阅内存存储引擎:持久性
原文链接:
https://docs.mongodb.com/v4.2/core/journaling/
译者:王金铷 MongoDB中文社区翻译小组成员
往期发布:
*查看更多翻译请移步至MongoDB中文社区网站(mongoing.com)查阅中文用户手册。
The mongo Shell
— mongo 命令行
— 配置 mongo shell
— 查看mongo shell帮助文档
MongoDB CRUD操作
— MongoDB中的CRUD操作
—— MongoDB读隔离性,一致性与近因性
— 批量写操作
— 读关注
— 写关注
数据模型
— MongoDB数据建模介绍
— MongoDB数据模型设计
事务
— 事务
— 事务操作
— MongoDB分片集群中的注意事项
索引
— 2dsphere索引
— 哈希索引
— 索引属性
— 在集合上创建索引
— 度量索引使用情况
安全
— 安全检查列表
— 启用访问控制
— 身份验证
— 审计
—— 配置审计
—— 配置审计过滤器
—— 系统事件审计消息
— 网络和配置强化
— 安全参考
—— system.roles 集合
—— system.users 集合
—— 资源文档
—— 权限操作
—— 附录A:用于测试的 OpenSSl CA 证书
—— 附录B:用于测试的OpenSSL服务器证书
—— 附录C:用于测试的OpenSSL客户端证书
复制
— 副本集成员
— 副本集Oplog
— 副本集数据同步
— 副本集部署架构
分片
— 分片键
—— 在分片集群中拆分数据块chunks
— 哈希分片
— 范围分片
管理
— 产品说明
— 操作检查表
— 开发检查表
— 性能
— 配置和维护
— 备份方法
存储
—— WiredTiger存储引擎
—— 内存存储引擎
— 常见问答:MongoDB 存储
版本管理
— MongoDB版本管理
添加社区助理小芒果微信(mongoingcom)即可咨询社区相关事宜,进入社区微信交流群请备注“mongo”。
![3b936926dff404dcba0d6ab718fc1cf5.png](https://i-blog.csdnimg.cn/blog_migrate/dd7bb266494359e64047e2d32623c982.jpeg)
Mongoing中文社区
MongoDB中文社区微信公众号
扫描关注,获取更多精彩内容
社区网站www.mongoing.com
长按二维码关注我们