我正在读一个MongoDB在线课程。我刚刚看到了视频日记对居民记忆的影响,它描述了MongoDB如何处理内存中的数据以及如何将其保存到磁盘。我还阅读了关于MongoDB日志的这些文章:
我似乎无法理解私人观点概念背后的理由。
据我所知,当使用MMAPv1作为存储引擎并启用日志时,MongoDB中的数据会发生以下情况:
在此之后,共享视图将被刷新到磁盘上的数据文件(这称为同步)。
在某种程度上,共享视图也将被映射为私有视图。
问题
为什么需要私人视角呢?看起来,它中的数据不是用于共享视图不能用于的任何东西。为什么在写入日志之前,没有将更改直接应用于共享视图?这将使私有视图变得不必要,并且MongoDB在虚拟内存中的占用空间将增加一半。
发布于 2015-11-09 12:05:31
这里引用了威廉·克罗斯在MongoDB大学论坛上提供的答案。
想象一下,如果只有一个共享视图,而没有私有视图。您执行写操作,并且希望首先在预写日志中捕获这些写入。您首先需要预写日志,否则,您的易失性内存将因系统故障而蒸发,部分写入将提交到磁盘,无法回滚。合并的公共/私有视图的问题是,如果您将数据放到公共视图中,它可能会在任意短的时间间隔内被刷新到磁盘,如果您运气不佳,这可能会在日志完成之前发生。 如果发生这种情况,服务器就会崩溃,那么您所拥有的就是损坏的数据;没有办法回滚它。请记住,使用MMAPv1,存储引擎的大部分工作都被推送到操作系统上。创建MMAPv1是为了避免对进入磁盘的数据进行细粒度控制,这是我们在这里需要的,这样流才能满足我们的需要。因此,为了防止这种情况发生,在磁盘上完成预写日志条目之前,数据的公共视图保持不变,只有这样,公共视图才会被更新。我们拥有数据的私有视图,这样数据就可以完全独立地存在,并在我们接触公共视图之前被刷新到磁盘,并冒着将其部分提交到磁盘的风险。同时,我们已经收到了一封信,所以我们也有一个私人的视图来回答读的请求。 关于它是如何写的,我知道我们写字节,我们从第一个修改开始,所以它是一个偏移+字节。这使得事情变得相对最少。
发布于 2017-09-17 14:26:01
简而言之,当您启动写操作时,mongod首先将写操作发布到私有视图。私有视图是一个内存映射文件,在200 ms之后,它将数据复制到日志,日志是数据/db的子目录。
在日志提交之后,它将数据复制到共享视图中,共享视图在60年代后被刷新到data/db。
原因是如果有数据库崩溃或脏关闭,它仍将在日志文件中的写操作。一旦db再次出现,它将重播从日志到共享视图的所有操作,并将其刷新回主data/db。
私有视图和共享视图在RAM中分配空间。(内存映射文件)。若要了解有关内存映射文件的更多信息,请执行以下操作。例如,如果您的文件在磁盘上是2000个字节,那么它将把它映射到内存地址10-10010,这样您就可以直接从内存地址读取该文件。来自内存地址的任何文件更改都将被刷新回磁盘中的文件。
https://stackoverflow.com/questions/33332808
复制相似问题