我正在浏览MongoDB在线课程。我刚刚观看了视频"Journaling's impact on resident memory",它描述了MongoDB如何处理内存中的数据以及如何将其保存到磁盘。我还阅读了有关MongoDB日记的这些文章:
我似乎无法理解私人观点背后的理由。
据我了解,当MMAPv1用作存储引擎并启用了日记功能时,MongoDB中的数据会发生以下情况:
在此之后的某个时刻,共享视图将刷新到磁盘上的数据文件(这称为同步)。
在某些时候,共享视图也会重新映射到私人视图。
为什么需要私人观点?看起来它中的数据不用于任何共享视图不能用于的东西。为什么在写入日志之前不会将更改直接应用于共享视图?这将使私有视图变得不必要,并且MongoDB在虚拟内存中的占用空间将变为一半大小。
答案 0 :(得分:1)
简而言之,当您触发写操作时,mongod首先将写操作发布到私有视图。私有视图是一个内存映射文件,在200毫秒后它将数据复制到日志,它是数据/数据库的子目录。
在日志提交之后,它将数据复制到共享视图,该视图在60秒后刷新到data / db。
原因是如果存在数据库崩溃或脏关闭,它仍将在日志文件中进行写操作。一旦db再次出现,它将重放从日志到共享视图的所有操作,并将其刷新回主数据/ db。
私有视图和共享视图在RAM中分配空间。 (内存映射文件)。要了解有关内存映射文件的更多信息例如,如果您的文件在磁盘上是2000字节,那么它会将其映射到内存地址10-10010,因此您可以直接从内存地址读取文件。文件从内存地址的任何更改都将刷新回磁盘中的文件。
答案 1 :(得分:0)
以下是William Cross在MongoDB大学论坛中提供的答案的引用。
想象一下,如果只有共享视图,而没有私有视图。您 执行写操作,并且您希望首先捕获这些写入 预写日志。您首先需要预写日志,否则, 最终你的易失性内存会在系统上蒸发掉 失败,部分写入提交到磁盘并且无法滚动它 背部。合并的公共/私人视图的问题是,如果你放 在公共视图中的数据,它可能会开始被刷新到磁盘上 任意短的间隔,这可能发生在期刊之前 如果你运气不好,就完成了。
如果发生这种情况,并且服务器出现故障,那么您所拥有的只是 腐败数据;没有办法回滚。请记住,与 MMAPv1,大部分存储引擎的工作都被推到了操作系统上。 创建MMAPv1是为了避免对其进行细粒度控制 数据将转到磁盘,我们需要在这里为流量 我们想要什么。所以,为了防止这种情况发生,公众 在预写日志条目之前,数据视图保持不变 在磁盘上完成,然后公共视图才会更新。我们 拥有数据的私有视图,以便它可以完全存在 分开的地方,在我们接触公众之前冲到磁盘上 查看并将其部分提交到磁盘的风险。同时, 虽然,我们收到了一封写作,所以我们也有私人观点 回答读取请求。
就其编写方式而言,我知道我们写字节,和 我们从第一次更改开始,所以它是偏移+字节。这保持不变 事情相对最小。