journaling保证意外故障下的数据完整性
mongoDB研究笔记:journaling保证意外故障下的数据完整性
mongoDB的Journaling日志功能与常见的log日志是不一样的,mongoDB也有log日志,它只是简单记录了数据库在服务器上的启动信息、慢查询记录、数据库异常信息、客户端与数据库服务器连接、断开等信息。Journaling日志功能则是mongoDB里面非常重要的一个功能,它保证了数据库服务器在意外断电、自然灾害等情况发生下数据的完整性。尽管mongoDB还提供了其它的复制集等备份措施(后面会分析),但Journaling的功能在生产环境中是不可缺少的,它依靠了较小的CPU和内存消耗,带来的是数据库的持久性和稳定性。本篇章将分析Journaling涉及到的功能细节问题。Journaling的工作流程?
几个重要的存储视图
Journaling功能用到了两个重要的内存视图:private view和shared view。这两个内存视图都是通过MMAP(内存映射)来实现的,其中对private view的映射的内存修改不会影响到磁盘上,shared view中数据的变化会影响到磁盘上的文件,系统会周期性的刷新shared view中的数据到磁盘。
(1) shared view在mongoDB启动的过程中,操作系统会将磁盘上的数据文件映射到内存中的shared view,操作系统只是完成映射,并没有立即加载数据到内存,mongoDB会根据需要加载数据到shared view。
(2)private view 内存视图是为读操作保存数据的位置,是mongoDB保存新的写操作的第一个地方。
(3)磁盘上的Journaling日志文件,是实现写操作持久化保存的地方。mongoDB实例启动时会读这个文件。
处理写操作的流程
当写操作发生时,mongoDB首先将数据写到内存中的private view处,然后将写操作批量复制到journal,journal会将写操作存储到磁盘上的文件上,使其持久化保存,journal日志文件上的每一个条目都描述了写操作更改了数据文件上的哪些字节。
当上面的步骤完成后,mongoDB接下来会利用journal日志中的写操作记录来更新shared view中的数据,此时内存中的数据与磁盘上的数据变得不一致。按照默认值60秒,mongoDB会周期性的要求操作系统将shared view中变化的数据刷新到磁盘上,使磁盘上的数据与内存中的数据保持一致。
当执行完刷新内存中变化的数据到磁盘后,mongoDB会删除掉journal中这个时间点后面的所有写操作。
最后,mongoDB会将shared view与private view重新同步,保持一致性。
mongoDB的journaling日志功能,在2.0版本后是默认启动的,可以在实例mongod启动时,通过启动选项控制;上面提到的步骤中,有一个地方是将写操作周期性批量写到journal日志文件中,这个周期的大小是通过可选启动参数journalCommitInterval来控制的,默认值是100ms。
mongoDB经过60s的周期刷新内存中变化的数据到磁盘,这个值通过启动可选参数syncdelay来控制的。这些默认值一般适用于大多数情况,不要轻易更改。通过上面的分析,数据库服务器仍然有100ms的丢失数据的风险,因为journaling日志的写到磁盘上的周期是100ms,假如刚好一批写操还在内存中,没来得及刷到journaling在磁盘上对应的文件上,服务器突然故障,这些在内存中的写操作就会丢失。
mongoDB在启动时,专门初始化一个线程不断循环,用于在一定时间周期内来从defer队列中获取要持久化的数据并写入到磁盘的journal(日志)和mongofile(数据)处,当然因为它不是在用户添加记录时就写到磁盘上,所以按mongodb开发者说,它不会造成性能上的损耗,因为看过代码发现,当进行CUD操作时,记录(Record类型)都被放入到defer队列中以供延时批量(group commit)提交写入。
总之mongoDB利用内存映射的技术来完成这些功能,需要参考unix环境编程中的内存映射MMAP,文件IO等编程知识。
journaling保证意外故障下的数据完整性的更多相关文章
- mongoDB研究笔记:journaling保证意外故障下的数据完整性
mongoDB的Journaling日志功能与常见的log日志是不一样的,mongoDB也有log日志,它只是简单记录了数据库在服务器上的启动信息.慢查询记录.数据库异常信息.客户端与数据库服务器连接 ...
- ORACLE数据库不同故障下的恢复总结
ORACLE数据库不同故障下的恢复总结1. 非归档模式下丢失或损坏的文件--1.1 数据文件--启动数据库的状态到MOUNT--恢复方法:通过之前创建的数据库完整备份,修复整个数据库,不过备份之后发生 ...
- Sink Prosessor - Flume的可靠性保证:故障转移、负载均衡
Flume的一些组件(如Spooling Directory Source.File Channel)能够保证agent挂掉后不丢失数据. 1.负载均衡 1)Load balancing Sink P ...
- Jvm和CPU保证特定情况下不乱序
简介 CPU为了提高指令执行效率,会在一条指令执行过程中(比去内存读数据(慢100倍)),去同时执行另一条指令,前提是,两条指令没有依赖关系. CPU保证不乱序 MESI--CPU缓存一致性协议(In ...
- Oracle数据库之事务
Oracle数据库之事务 1. 什么是事务 在数据库中事务是工作的逻辑单元,一个事务是由一个或多个完成一组的相关行为的SQL语句组成,通过事务机制确保这一组SQL语句所作的操作要么都成功执行,完成整个 ...
- Oracle_高级功能(8) 事务和锁
Oracle数据库事务1. 事务定义在数据库中事务是工作的逻辑单元,一个事务是由一个或多个完成一组的相关行为的SQL语句组成,通过事务机制确保这一组SQL语句所作的操作要么都成功执行,完成整个工作单元 ...
- 【Oracle】浅析Oracle中的事务
1. 什么是事务 在数据库中事务是工作的逻辑单元,一个事务是由一个或多个完成一组的相关行为的SQL语句组成,通过事务机制确保这一组SQL语句所作的操作要么都成功执行,完成整个工作单元操作,要么一个也不 ...
- 小菜鸟之Oracle数据库之事务
Oracle数据库之事务 1. 什么是事务 在数据库中事务是工作的逻辑单元,一个事务是由一个或多个完成一组的相关行为的SQL语句组成,通过事务机制确保这一组SQL语句所作的操作要么都成功执行,完成整个 ...
- oracle报错:ORA-00054: 资源正忙,要求指定 NOWAIT
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源: --首先得到被锁对象的session_idselect session_id from v$locked_object; -- ...
随机推荐
- 深入理解PHP中赋值与引用
原文:深入理解PHP中赋值与引用 先看下面的问题: <?php $a = 10;//将常量值赋给变量,会为a分配内存空间 $b = $a;//变量赋值给变量,是不是copy了一份副本,b也分配了 ...
- Dialog中显示倒计时,到时自己主动关闭
这里直接用系统Dialog中加入了倒计时的显示,假设用自己定义Dialog会更美观: private TextView mOffTextView; private Handler mOffHandle ...
- Ubuntu更改hosts档
Ubuntu更改hosts档 打开hosts档 sudo gedit /etc/hosts 下载hosts,并全选复制 hosts 粘贴到hosts文件里.保存就可以 $(function () { ...
- Kafka的常用管理命令
1. 查看kafka都有那些topic a. list/usr/hdp/current/kafka-broker/bin/kafka-topics.sh --list --zookeeper test ...
- 从一道数学题弹程序员的思维:数学题,求证:(a+b%c)%c=(a+b)%c
在学校论坛看到这道题目,全忘了的感觉. 如果你是高中的,那我觉得你完全没问题.但是,在这个博客园的圈子,觉得全部人都是程(ban)序(zhuan)员(gong)相关的人员,解决这个问题有点难度,毕竟, ...
- SQL点滴28—一个简单的存储过程
原文:SQL点滴28-一个简单的存储过程 在表中写入一条数据同事要向另外一个表中写入信息,所以会使用到事务.实际使用的时候还会一次向一个表中吸入多条数据,下面的存储过程,将字符串拆分成数组然后写入到表 ...
- Android摘要ImageView的scaleType属性
Android在ImageView的scaleType有8一个选项 1 matrix不正确图像放大,原来自view在左上角绘制图片(片不变形): 2 fitXY将图片所有绘制到view中,可是图片会变 ...
- Linux的文件夹配置
学习linux我个人认为首先须要了解清楚在系统中没给目录的详细事干什么的才行,这样在以后的学习其中以及在使用linux系统的过程中才会事半功倍. /bin 主要内容是系统的运行文件,可是/bin中的运 ...
- VS SQL 出现%CommonDir%dte80a.olb 该解决方案
VS SQL 出现%CommonDir%dte80a.olb 该解决方案 在网上搜索解决方法的时候.别人就说你从别的电脑复制一个到C:\Program Files\Common Files\mic ...
- Entity Framework 5 自定义代码生成模板 转
Entity Framework 5 发布有一定时间了,但学习资源确实不多,更何况英语差的我,看英语确实费力,不管怎么样,问题还是解决了,查看很多人写的文章(让我看的想放弃,更想找到答案),都没有到到 ...