首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MongoDB日志机制:私有视图的目的是什么?

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

Stack Overflow用户
提问于 2015-10-25 17:38:01
回答 2查看 859关注 0票数 1

我正在读一个MongoDB在线课程。我刚刚看到了视频日记对居民记忆的影响,它描述了MongoDB如何处理内存中的数据以及如何将其保存到磁盘。我还阅读了关于MongoDB日志的这些文章:

  1. 日志力学
  2. MongoDB的日志是如何工作的

我似乎无法理解私人观点概念背后的理由。

据我所知,当使用MMAPv1作为存储引擎并启用日志时,MongoDB中的数据会发生以下情况:

  1. 当MongoDB启动时,它现有的数据文件将使用内存映射映射到虚拟内存中(参见mmap)。虚拟内存的这个区域称为共享视图
  2. 然后将共享视图重新映射到虚拟内存的另一部分,称为私有视图。逻辑上(不是物理上的),看起来所有的数据都在两个视图之间重复。
  3. 在写操作中,更改将应用于私有视图。
  4. 还将更改(增量)保存到日志文件中。
  5. 当确认要在日记中存储更改时,它们也应用于共享视图。

在此之后,共享视图将被刷新到磁盘上的数据文件(这称为同步)。

在某种程度上,共享视图也将被映射为私有视图。

问题

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-09 12:05:31

这里引用了威廉·克罗斯在MongoDB大学论坛上提供的答案。

想象一下,如果只有一个共享视图,而没有私有视图。您执行写操作,并且希望首先在预写日志中捕获这些写入。您首先需要预写日志,否则,您的易失性内存将因系统故障而蒸发,部分写入将提交到磁盘,无法回滚。合并的公共/私有视图的问题是,如果您将数据放到公共视图中,它可能会在任意短的时间间隔内被刷新到磁盘,如果您运气不佳,这可能会在日志完成之前发生。 如果发生这种情况,服务器就会崩溃,那么您所拥有的就是损坏的数据;没有办法回滚它。请记住,使用MMAPv1,存储引擎的大部分工作都被推送到操作系统上。创建MMAPv1是为了避免对进入磁盘的数据进行细粒度控制,这是我们在这里需要的,这样流才能满足我们的需要。因此,为了防止这种情况发生,在磁盘上完成预写日志条目之前,数据的公共视图保持不变,只有这样,公共视图才会被更新。我们拥有数据的私有视图,这样数据就可以完全独立地存在,并在我们接触公共视图之前被刷新到磁盘,并冒着将其部分提交到磁盘的风险。同时,我们已经收到了一封信,所以我们也有一个私人的视图来回答读的请求。 关于它是如何写的,我知道我们写字节,我们从第一个修改开始,所以它是一个偏移+字节。这使得事情变得相对最少。

票数 0
EN

Stack Overflow用户

发布于 2017-09-17 14:26:01

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

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

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

私有视图和共享视图在RAM中分配空间。(内存映射文件)。若要了解有关内存映射文件的更多信息,请执行以下操作。例如,如果您的文件在磁盘上是2000个字节,那么它将把它映射到内存地址10-10010,这样您就可以直接从内存地址读取该文件。来自内存地址的任何文件更改都将被刷新回磁盘中的文件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33332808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档