英文原文:http://www.kchodorow.com/blog/2012/10/04/how-mongodbs-journaling-works/

How MongoDB’s Journaling Works


我在写MongoDB《The Definitive Guide》的“日志内部结构”这一部分。然而我意识到这是大多数人都不关心的一个实现细节。无论怎样,我用简洁的图示来讲解这个过程。

Good idea, Patrick!

那么, MongoDB日志是如何工作的呢?

我们用下图表示硬盘上的数据文件和日志文件:

当你使用mongod启动MongoDB的时候,数据文件将被加载到共享视图。基本上,操作系统说:“OK,你的数据占用2,000bytes的磁盘空间,我将加载他们到内存地址为1,000,000-1,002,000.所以,如果你读内存地址为1,000,042,你就可以获取这个文件的第42个byte的数据。”(其实,除非你真的存取这些内存地址,否则这些数据没必要加载)

这段内存仍然被这个数据文件占有:如果你在这段内存中做修改,操作系统将刷新这个文件,修改数据。这就是mongod不开启日志的工作方式:进程每60秒通知操作系统对这段内存做flush操作。

然而,启用日志,mongod会建立另一个内存映射用作私有视图。这就是为什么需要分配两倍于mongod所占内存的内存量给日志操作的原因。

需要注意的是私有视图不直接关联到数据文件,所用操作系统不能通过刷新私有视图来写数据到磁盘。

现在,当你有一个写操作,mongod进程就把这个操作写到私有视图。

mongod进程会把这个操作写到日志文件,并描述哪个文件的哪个字节有修改。

日志记录每一个修改操作。

这个时候,写操作是安全的。如果mongod进程崩溃,日志可以重现此次修改,即使还没有对数据文件做更新操作。

然后,mongod进程重新将共享视图映射到私有视图,这样可以防止私有视图过于“dirty”(相对于映射过来的共享视图有太多的修改)。

最后,经过一系列漫长的验证,共享视图数据将会被刷新到磁盘。默认情况下,mongod每60秒对OS请求一次刷新操作。

And that’s how journaling works. Thanks to Richard, who gave the best explanation of this I’ve heard (Richard is going to be teaching an online course on MongoDB this fall, if you’re interested in more wisdom from the source).

转载于:https://blog.51cto.com/mrcto/1346694

MongoDB日志工作流程相关推荐

  1. Elasticsearch基础1——搜索引擎发展史和工作流程、es/es-head/kibana的基础安装

    文章目录 一.搜索引擎 1.1 搜索引擎的发展背景 1.2 Lucene和Elasticsearch 1.3 Solr和Elasticsearch对比 1.4 数据搜索方式 1.5 搜索引擎 1.5. ...

  2. travis ci_如何使用Travis CI和GitHub进行Web开发工作流程

    travis ci by Vijayabharathi Balasubramanian 通过Vijayabharathi Balasubramanian 如何使用Travis CI和GitHub进行W ...

  3. Nginx源码分析:master/worker工作流程概述

    nginx源码分析 nginx-1.11.1 参考书籍<深入理解nginx模块开发与架构解析> Nginx的master与worker工作模式 在生成环境中的Nginx启动模式基本都是以m ...

  4. Linux下计划任务和标准化工作流程

    1.定时任务和计划任务: 2.一次性定时任务at(生产中很少使用) at命令: at [option] TIME常用选项:-V 显示版本信息:-l: 列出指定队列中等待运行的作业:相当于atq-d: ...

  5. MongoDB 日志切换(Rotate Log Files)实战

    MongoDB 日志切换(Rotate Log Files)实战 1. 在mongo shell下,执行logRotate命令: use admin db.runCommand({logRotate: ...

  6. Git工作流程和rebase与合并问题

    我和其他开发人员一起在一个项目上使用Git几个月了. 我有几年的SVN经验,所以我想我给这段关系带来了很多包袱. 我听说Git非常适合分支和合并,到目前为止,我只是没有看到它. 当然,分支很简单,但是 ...

  7. Yarn框架和工作流程研究

    一.概述     将公司集群升级到Yarn已经有一段时间,自己也对Yarn也研究了一段时间,现在开始记录一下自己在研究Yarn过程中的一些笔记.这篇blog主要主要从大体上说说Yarn的基本架构以及其 ...

  8. 驰骋工作流程引擎,ccflow,如何把子线程的数据汇总到合流节点表单中去?

    为什么80%的码农都做不了架构师?>>>    驰骋工作流程引擎,ccflow,如何把子线程的数据汇总到合流节点表单中去?对于分合流程来说,一般的模式就是分流 – 子线程 – 合流. ...

  9. Git之深入解析如何使用Git的分布式工作流程与如何管理多人开发贡献的项目

    一.分布式工作流程 如果现在拥有一个远程 Git 版本库,就能为所有开发者共享代码提供服务:在一个本地工作流程下,如果你也已经熟悉了基本 Git 命令,现在就可以学习如何利用 Git 提供的一些分布式 ...

  10. 如何使用JavaScript控制台改进工作流程

    作为Web开发人员,很有必要了解如何调试代码.后台开发我们经常使用外部库来记录日志,并在某些情况下格式化显示日志,前端我们会使用断点和控制台,但是我们浏览器的控制台比我们想象的要强大得多. 当我们考虑 ...

最新文章

  1. linux 系统管理(二) 磁盘分区
  2. Java基础教程:多线程基础(3)——阻塞队列
  3. log中文乱码 springboot_springboot + shiro 权限注解、统一异常处理、请求乱码解决
  4. 深度强化学习-Actor-Critic算法原理和实现
  5. js中两种定时器,setTimeout和setInterval的区别
  6. 高通发布《5G经济》研究:将催生12万亿美元市场
  7. Nginx源码分析 - 主流程篇 - 模块的初始化(12)
  8. 北京理工大学c语言课后答案,《北京理工大学C语言教材习题答案》.doc
  9. 《精通JavaScript》总结
  10. Android性能优化系列-监听View inflate周期并动态替换
  11. 从0开始ubuntu16.04(虚拟机)安装tensorflow,spinningup
  12. java在字符串开头添加字符串_string - java:使用StringBuilder在开头插入
  13. 抄币不要盲目看价值,不然会被牵着走
  14. 【Qt】 Fractal Designer 5.5 Bug Report
  15. java使用easypoi导出为word文档
  16. ArKnights策划书
  17. 模具的发展--中英文翻译
  18. Win7下利用MinGW和Android NDK编译ffmpeg0.10(neon优化)
  19. 转贴:网友line写的火鸟字幕合并器教程
  20. Double-checked locking should not be used

热门文章

  1. HMM:隐马尔科夫模型 - 学习
  2. python文件和目录访问File and Directory Access
  3. matplotlib,seaborn等画图工具
  4. open cv python_Open CV非常牛逼!众所周知!今天就来见识一下它究竟有多牛逼!
  5. 一个网卡设备配置两个不同网段的IP地址
  6. Linux-shell编程_xargs命令详解
  7. 品牌logo在EDM数据营销中的运用
  8. java volatile关键字的理解
  9. 在 MVC 控制器中使用 构造函数时行依赖注入 (IoC)
  10. How to install VNC on Ubuntu