mongodb - MongoDB 日志是如何工作的

标签 mongodb journaling durability

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

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

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

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

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

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

最佳答案

编辑:我在 2011 年由 Dwight 在 MongoSF 上发表的演讲的原始链接现已失效,但有一个 2012 presentation由 Ben Becker 撰写,内容相似。

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

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

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

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

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

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

关于mongodb - MongoDB 日志是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10172188/

相关文章:

sql - 有没有强力支持SQL数据库来持久化rabbitmq消息

java - 导入自己的枚举转换器

mysql - MySQL 中的非规范化多对多关系

transactions - 处理 Couchbase 中的耐久性要求失败

java - 为什么持久订阅一次只能有一个活跃订阅者

mongodb - 我应该为 mongodb 中的这个不同命令使用哪个索引

php - 从 PHP 调用 MongoDB 中存储的 JavaScript 函数

linux - 可以在每次提交时使用单个 fsync 来实现日志记录吗?

MySQL 数据库由于磁盘日志记录而挂起?