• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
我的成长足迹
夫志当存高远
博客园    首页    新随笔    联系   管理    订阅  订阅

MongoDB的Journaling的工作原理(每日一译)

This was originally posted to Kristina Chodorow’s blog, Snail in a Turtleneck

我参与编写了The Definitive Guide中关于Journaling的部分,但是我意识到其中很多实现细节大家重视的不够,所以这次在博客里我会用易于理解的图来进行说明。

那么Journaling是怎么工作的呢,假设如图所示,你的硬盘上有数据文件和日志文件

当你启动mongod,它会映射你的数据文件到一个共享的视图中,比方说操作系统会把你 2,000 bytes的数据文件映射到内存地址1,000,000-1,002,000中,这样你访问 1,000,042这个地址也就是访问这个文件的第42位地址。(其实就是内存映射。。。)。当然,实际上只有第一次真正访问的时候,这个数据文件才会加载到内存中。

如果你改变了内存中的数据,操作系统会刷新变更到实际的文件中去。mongodb在没有开启journaling情况下每60秒由操作系统进行一次刷新。如果开启了journaling,mongod将会映射另外一个私有的视图,这也就是为什么开启journaling的情况下虚拟内存使用量翻番的原因。

现在每次写入共享视图的同时也会写入到私有的视图中。需要注意的是,因为这个私有的视图没有映射到实际文件中,所以操作系统每次刷新时不会把私有视图的变更写回到硬盘。

mongod会向journal file写入关于是是哪个文件的哪个字节发生了变化的简要描述信息。

会向journal file追加每一次变更信息。

如果mongod发生崩溃的时候数据变更还没有写入磁盘,就可以通过回放journal里的记录到共享视图中。

 

回放成功后,mongod会依赖操作系统把刷新变更刷新到磁盘文件中。默认情况下是60秒一次。

最后mongod会重新映射共享视图到私有视图中。这是为了防止私有视图变的太“脏”(其实也就是为了防止下次在回放的时候写入多余的变更)。

posted @ 2013-02-16 11:47  bwbwbw1984  阅读(2275)  评论(1)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3