【问题标题】:How does MongoDB journaling workMongoDB 日志是如何工作的
【发布时间】:2012-04-27 16:02:47
【问题描述】:

这是我的看法,不知道是对是错:

日记日志是“重做”日志。它记录数据文件的修改。

比如我想将一条记录的字段值从'a'改为'b',那么mongodb会找到如何修改dbfile(包括所有的命名空间、数据、索引等),然后mongodb 将修改写入日志。

之后,mongodb 对 dbfile 进行所有真正的修改。如果这里出现问题,当 mongoDB 重新启动时,它将读取日志(如果存在)。然后它会改变 dbfile 以使数据集保持一致。

所以,在日志中,不记录要更改的数据,而是记录如何更改dbfile。

我说的对吗?我在哪里可以获得有关期刊格式的更多信息?

【问题讨论】:

  • 您可以阅读源代码。这是最可靠的信息来源。
  • 感谢您的建议,其实我现在正在阅读。但这会花费太多时间,我现在只想得到答案。
  • 因为我在做研究,没有内在机制我无法解释一些事情。所以我想知道我的观点是正确的。

标签: mongodb journaling durability


【解决方案1】:

编辑:我在 2011 年 Dwight 在 MongoSF 上的演讲的原始链接现在已经失效,但是 Ben Becker 的 2012 presentation 有类似的内容。

以防万一它在某个时候停止工作,我将简要介绍原始 MMAP 存储引擎中的日志是如何工作的,但应该注意的是,随着 pluggable storage engine 模型的出现(MongoDB 3.0及以后),这现在完全取决于您使用的存储引擎(可能还有选项) - 所以请检查。

返回原始 (MMAP) 存储引擎日志。在非常基本的级别上,日志包含一系列排队操作,并且所有操作都在发生时写入其中 - 基本上是仅追加到磁盘的顺序写入。

一旦这些操作被应用并刷新到磁盘,日志中就不再需要它们并且可以过期。从这个意义上说,日志基本上就像一个用于写操作的循环缓冲区。

在内部,日志中的操作存储在“提交组”中——一组写操作的逻辑组。一旦一个操作在一个完整的提交组中,它可以被认为是作为日志的一部分同步到磁盘(例如,将满足j:true 写关注)。在非正常关闭后,mongod 将尝试应用之前未刷新到磁盘的所有完整提交组,不完整的提交组将被丢弃。

日志中的操作不是您将在oplog 中看到的,而是一组更简单的文件、偏移量(本质上是磁盘位置)以及要在该位置写入的数据。这允许有效地重放数据,并为日志提供紧凑的格式,但会使内容看起来像大多数人的胡言乱语(与上述基本上可以作为 JSON 文档读取的 oplog 相反)。这基本上回答了提出的问题之一——它不知道数据库文件的内容和要对其进行的更改,它甚至更简单——它基本上只知道去磁盘位置 X 并写入数据 Y,就是这样。

日志的预写、顺序性质意味着它非常适合旋转磁盘,并且顺序访问模式通常与 MMAP 数据访问模式不一致(尽管不一定与其他引擎的访问模式)。因此,有时将日志放在自己的磁盘或分区上以减少 IO 争用是个好主意。

【讨论】:

  • 链接断开。请修复
  • @blueskin - 询问,您将收到
  • @AdamComerford 链接再次断开。
  • @Shubham - 这是 7 年前提出的问题,按照技术标准,这使得它变得古老。此时 MMAP 不是 MongoDB 中支持的引擎,我不知道我引用的内容的另一个副本。鉴于它现在适用于已弃用的技术,我认为它不太可能更新。就功能描述而言,摘要必须足够。
猜你喜欢
  • 1970-01-01
  • 2012-02-02
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-13
  • 1970-01-01
相关资源
最近更新 更多