专栏首页Sth interesting, as a DBA[转载] MongoDB 的 journal 和 oplog

[转载] MongoDB 的 journal 和 oplog

Journal

journal 是 MongoDB 存储引擎层的概念,目前 MongoDB 主要支持 mmapv1、wiredtiger、mongorocks 等存储引擎,都支持配置 journal。

MongoDB 所有的数据写入、读取最终都是调存储引擎层的接口来存储、读取数据,journal 是存储引擎存储数据时的一种辅助机制。

以wiredtiger 为例,如果不配置 journal,写入 wiredtiger 的数据,并不会立即持久化存储;而是每分钟会做一次全量的checkpoint(storage.syncPeriodSecs 配置项,默认为1分钟),将所有的数据持久化。如果中间出现宕机,那么数据只能恢复到最近的一次 checkpoint,这样最多可能丢掉1分钟的数据。

所以建议「一定要开启journal」,开启 journal 后,每次写入会记录一条操作日志(通过journal可以重新构造出写入的数据)。这样即使出现宕机,启动时 Wiredtiger 会先将数据恢复到最近的一次checkpoint的点,然后重放后续的 journal 操作日志来恢复数据。

MongoDB 里的 journal 行为 主要由2个参数控制,storage.journal.enabled决定是否开启journal,storage.journal.commitInternalMs决定 journal 刷盘的间隔,默认为 100ms,用户也可以通过写入时指定 writeConcern 为{j: ture}来每次写入时都确保 journal 刷盘。

oplog

oplog 是 MongoDB 主从复制层面的一个概念,通过 oplog 来实现复制集节点间数据同步,客户端将数据写入到 Primary,Primary 写入数据后会记录一条 oplog,Secondary 从 Primary(或其他 Secondary )拉取 oplog 并重放,来确保复制集里每个节点存储相同的数据。

oplog 在 MongoDB 里是一个普通的 capped collection,对于存储引擎来说,oplog只是一部分普通的数据而已。

MongoDB 的一次写入

MongoDB 复制集里写入一个文档时,需要修改如下数据

将文档数据写入对应的集合
更新集合的所有索引信息
写入一条oplog用于同步

上面3个修改操作,需要确保要么都成功,要么都失败,不能出现部分成功的情况,否则

如果数据写入成功,但索引写入失败,那么会出现某个数据,通过全表扫描能读取到,但通过索引就无法读取

如果数据、索引都写入成功,但 oplog 写入不成功,那么写入操作就不能正常的同步到备节点,出现主备数据不一致的情况

MongoDB 在写入数据时,会将上述3个操作放到一个 wiredtiger 的事务里,确保「原子性」。

beginTransaction();
writeDataToColleciton();
writeCollectionIndex();
writeOplog();
commitTransaction();
写入操作

wiredtiger 提交事务时,会将所有修改操作应用,并将上述3个操作写入到一条 journal 操作日志里;后台会周期性的checkpoint,将修改持久化,并移除无用的journal。

从数据布局看,oplog 与 journal 的关系

数据布局

谁先写入??

  • oplog 与 journal 是 MongoDB 里不同层次的概念,放在一起比先后本身是不合理的。
  • oplog 在 MongoDB 里是一个普通的集合,所以 oplog 的写入与普通集合的写入并无区别。
  • 一次写入,会对应数据、索引,oplog的修改,而这3个修改,会对应一条journal操作日志。

原文链接:https://mongoing.com/archives/3988

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MongoDB与MySQL关于写确认的异同

    之前几周有幸被京东智联云的市场同事推荐参与麦思博的一个视频课程的录制,题目是与MongoDB相关的内容。在ppt里也写到了推荐学员可以对比参照其他数据的原理和特...

    云计算与数据库
  • Wiredtiger 在MONGODB 中的疑问

    MongoDB 中也有类似MYSQL 的数据库引擎的插件化的概念,虽然MYSQL 被ORACLE 搞得现在对这个数据库的引擎认知都存在于INNODB,但实际上M...

    AustinDatabases
  • 数据实时同步之MongoDB

    随着传统企业的发展,企业数据呈现多样化,海量化,难以实现数据快速分析。MongoDB是当前很多企业使用的,当日积月累数据很大时,就可能会忽略历史数据的价值,可以...

    yuanyi928
  • mongodb.conf配置文件详解

    启动MongoDB有2种方式,一是直接指定配置参数,二是指定配置文件。这里先介绍配置文件,启动方式如下:

    明哥的运维笔记
  • mongodb.conf配置文件详解 

    启动MongoDB有2种方式,一是直接指定配置参数,二是指定配置文件。这里先介绍配置文件,启动方式如下:

    拓荒者
  • MongoDB从0开始到实践,整的很明白!

    MongoDB是一个以JSON为数据模型的文档数据库,所谓“文档”,就是“JSON Document”,并不是我们一般理解的pdf,word,excel文档。

    行百里er
  • mongodb基础篇

    一、  关于mongodb 两种非关系数据库 Redis:满足极高读写性能的Key-Value数据库       键值式储存,可以通过键快速查询到值。     ...

    一夕如环
  • centos7 手动安装mongodb 原

    1、下载mongoDB的安装包:mongodb-linux-x86_64-rhel70-3.4.4; 2、上传安装包到服务器/data目录下; 3、解压安装...

    拓荒者
  • MongoDB日志记录

    为了在发生故障时提供持久性,MongoDB使用预写日志记录到磁盘journal文件中。

    MongoDB中文社区
  • MongoDB数据库生产案例实践三部曲

    作者:北丐。 MongoDB中文社区联席主席,针对MongoDB,MySQL,Redis集群,Oracle,TiDB;有丰富的实践经验和企业级授课经验。

    MongoDB中文社区
  • 单机mongodb转为复制集的操作步骤

    由于历史原因,生产环境的几台mongodb都是单机在运行,考虑到宕机等不确定的风险,需要给他们做一下高可用。mongodb原生的复制集方案非常简单好用。

    二狗不要跑
  • 常见问题: MongoDB 存储

    存储引擎是数据库的一部分,负责管理如何在内存和磁盘上存储数据。许多数据库支持多个存储引擎,其中不同的引擎对特定工作负载的性能会更好。例如,一个存储引擎可能为读取...

    MongoDB中文社区
  • MongoDB大量集合启动加载优化原理

    启动数据加载时间对于很多数据库来说是一个不容忽视的因素,启动加载慢直接导致数据库恢复正常服务的RTO时间变长,影响服务可用性。比如Redis,启动时要加载RDB...

    MongoDB中文社区
  • centos7 安装mongodb 原

    1、下载mongoDB的安装包:mongodb-linux-x86_64-rhel70-3.4.4; 2、上传安装包到服务器/data目录下; 3、解压安装...

    拓荒者
  • MongoDB事务模型分析

    在了解写操作的事务性之前,需要先了解mongo层的每一个table,是如何与wiredtiger层的table(btree)对应的。mongo层一个最简单的ta...

    MongoDB中文社区
  • MongoDB数据存储-深入了解

    最近运维中时常涉及到MongoDB的维护工作,今天详细梳理下MongoDB数据存储方面的内容。首先需要深入了解的一个概念:Memeory-Mapped File...

    洗尽了浮华
  • MongoDB的备份与恢复

    Mongodb中的mongoexport工具可以把一个collection导出成JSON格式或CSV格式的文件。可以通过参数指定导出的数据项,也可以根据指定的条...

    拓荒者
  • MongoDB的备份与恢复

    1.1 MongoDB的常用命令 mongoexport / mongoimport mongodump / mongorestore      有以上两组命...

    惨绿少年
  • mongodb 3.4与 mongodb 3.2性能对比

    本文主要将 mongodb 3.4与 mongodb 3.2的性能进行对比分析,按照官方 release note,mongodb 3.4 版本相较3.2 版本...

    周奇

扫码关注云+社区

领取腾讯云代金券