MongoDB日记机制:私有视图的目的是什么?

时间:2015-10-25 17:38:02

标签: mongodb memory database-administration

我正在浏览MongoDB在线课程。我刚刚观看了视频"Journaling's impact on resident memory",它描述了MongoDB如何处理内存中的数据以及如何将其保存到磁盘。我还阅读了有关MongoDB日记的这些文章:

  1. Journaling mechanics;
  2. How MongoDB’s Journaling Works
  3. 我似乎无法理解私人观点背后的理由。

    journaling diagram

    据我了解,当MMAPv1用作存储引擎并启用了日记功能时,MongoDB中的数据会发生以下情况:

    1. 当MongoDB启动时,其现有数据文件使用内存映射映射到虚拟内存中(请参阅mmap)。虚拟内存的这个区域称为共享视图
    2. 然后将共享视图重新映射到名为私有视图的虚拟内存的另一部分。逻辑上(非物理上),看起来两个视图之间的所有数据都是重复的。
    3. 在写入操作中,更改将应用​​于私有视图。
    4. 更改也会(递增地)保存到日志文件中。
    5. 当确认更改存储在日记中时,它们也会应用于共享视图。
    6. 在此之后的某个时刻,共享视图将刷新到磁盘上的数据文件(这称为同步)。

      在某些时候,共享视图也会重新映射到私人视图。

      问题

      为什么需要私人观点?看起来它中的数据不用于任何共享视图不能用于的东西。为什么在写入日志之前不会将更改直接应用于共享视图?这将使私有视图变得不必要,并且MongoDB在虚拟内存中的占用空间将变为一半大小。

2 个答案:

答案 0 :(得分:1)

简而言之,当您触发写操作时,mongod首先将写操作发布到私有视图。私有视图是一个内存映射文件,在200毫秒后它将数据复制到日志,它是数据/数据库的子目录。

在日志提交之后,它将数据复制到共享视图,该视图在60秒后刷新到data / db。

原因是如果存在数据库崩溃或脏关闭,它仍将在日志文件中进行写操作。一旦db再次出现,它将重放从日志到共享视图的所有操作,并将其刷新回主数据/ db。

私有视图和共享视图在RAM中分配空间。 (内存映射文件)。要了解有关内存映射文件的更多信息例如,如果您的文件在磁盘上是2000字节,那么它会将其映射到内存地址10-10010,因此您可以直接从内存地址读取文件。文件从内存地址的任何更改都将刷新回磁盘中的文件。

答案 1 :(得分:0)

以下是William Cross在MongoDB大学论坛中提供的答案的引用。

  

想象一下,如果只有共享视图,而没有私有视图。您   执行写操作,并且您希望首先捕获这些写入   预写日志。您首先需要预写日志,否则,   最终你的易失性内存会在系统上蒸发掉   失败,部分写入提交到磁盘并且无法滚动它   背部。合并的公共/私人视图的问题是,如果你放   在公共视图中的数据,它可能会开始被刷新到磁盘上   任意短的间隔,这可能发生在期刊之前   如果你运气不好,就完成了。

     

如果发生这种情况,并且服务器出现故障,那么您所拥有的只是   腐败数据;没有办法回滚。请记住,与   MMAPv1,大部分存储引擎的工作都被推到了操作系统上。   创建MMAPv1是为了避免对其进行细粒度控制   数据将转到磁盘,我们需要在这里为流量   我们想要什么。所以,为了防止这种情况发生,公众   在预写日志条目之前,数据视图保持不变   在磁盘上完成,然后公共视图才会更新。我们   拥有数据的私有视图,以便它可以完全存在   分开的地方,在我们接触公众之前冲到磁盘上   查看并将其部分提交到磁盘的风险。同时,   虽然,我们收到了一封写作,所以我们也有私人观点   回答读取请求。

     

就其编写方式而言,我知道我们写字节,和   我们从第一次更改开始,所以它是偏移+字节。这保持不变   事情相对最小。