深入剖析MongoDB架构

转载 2013年12月06日 10:32:27
近日,软件工程师Ricky Ho的在他的博客里发表了一篇关于MongoDB架构(MongoDB Architecture)的博文,虽然这是一个听起来感觉很宽泛的话题,但是作者在文章中确实对MongoDB由内至外的架构进行了剖析。本文截取了其文章中的几张重点架构示意图进行简要描述。 

1、MongoDB数据文件内部结构 


  • MongoDB在数据存储上按命名空间来划分,一个Collection是一个命名空间,一个索引也是一个命名空间。
  • 同一个命名空间的数据被分成很多个Extent,Extent之间使用双向链表连接。
  • 在每一个Extent中,保存了具体每一行的数据,这些数据也是通过双向链接来连接的。
  • 每一行数据存储空间不仅包括数据占用空间,还可能包含一部分附加空间,这使得在数据Update变大后可以不移动位置。
  • 索引以BTree结构实现。
2、在MongoDB中实现事务 


众所周知,MongoDB只支持对单行记录的原子性修改,并不支持对多行数据的原子操作。但是通过上图中的不可思议的操作步骤,实际上你也可以自己实现该事务。其步骤如下: 

  • 第1步:先记录一条事务记录,将要修改的多行记录的修改值写到里面,并设置其状态为init(如果这时候操作中断,那么在重新启动时,会判断到它处于init状态,从而将其保存的多行修改操作应用到具体的行上)。
  • 第2步:然后更新具体要修改的行,将刚才写的事务记录的标识写到它的tran字段中。
  • 第3步:将事务记录的状态从init变成pending(如果在这时候操作中断,那么在重新启动时,会判断到它的状态是pending,这时查看其所有对应的多条要修改的记录,如果其tran值不为空,那么就进行第4步;如果值为空,说明第4步已经执行过了,直接将其状态从pending变成 commited就行)。
  • 第4步:将需要修改的多条记录的相应值加以修改,并且unset掉之前的tran字段。
  • 第5步:将事务记录那一条的状态从pending变成commited,事务至此完成。
其实上面的步骤并不罕见,在支持事务的DBMS中,其事务原子性提交的保证大多都与上面类似。而事务记录的tran那条记录,就类似于这些DBMS中的redolog。 

3、MongoDB数据同步 

 
MongoDB采用Replica Sets模式的同步流程

本流程可简要描述如下: 

  • 红色箭头表示写操作可以写到Primary上,然后异步同步到多个Secondary上。
  • 蓝色箭头表示读操作可以从Primary或Secondary任意一个中读取。
  • 各个Primary与Secondary之间一直保持心跳同步检测,用于判断Replica Sets的状态。
4、分片机制 


  • MongoDB的分片是指定一个分片key来进行,数据按范围分成不同的chunk,每个chunk的大小有限制。
  • 有多个分片节点保存这些chunk,每个节点保存一部分的chunk。
  • 每一个分片节点都是一个Replica Sets,这样保证数据的安全性。
  • 当一个chunk超过其限制的最大体积时,会分裂成两个小的chunk。
  • 当chunk在分片节点中分布不均衡时,会引发chunk迁移操作。
5、服务器角色 


前面讲了分片的机制,下面是具体在分片时几种节点的角色: 

  • 客户端访问路由节点mongos来进行数据读写。
  • config服务器保存了两个映射关系,一个是key值的区间对应哪一个chunk的映射关系,另一个是chunk存在哪一个分片节点的映射关系。
  • 路由节点通过config服务器获取数据信息,通过这些信息,找到真正存放数据的分片节点进行对应操作。
  • 路由节点还会在写操作时判断当前chunk是否超出限定大小。如果超出,就分列成两个chunk。
  • 对于按分片key进行的查询和update操作来说,路由节点会查到具体的chunk然后再进行相关的工作。
  • 对于不按分片key进行的查询和update操作来说,mongos会对所有下属节点发送请求然后再对返回结果进行合并。
英文原文:MongoDb Architecture

《Inside VCL(深入核心——VCL架构剖析)》.(李维) 一

一、回到从前:1.1、多任务操作系统是如何设计和实现的? 1.1.1、系统——多个应用程序 方案1:(系统不断读取应用程序状态) 系统通过大型循环(Loop)不断坚持么一个恶用用程序是否触发了特定的事...
  • liang08114
  • liang08114
  • 2016年12月20日 21:03
  • 491

深入剖析MongoDB架构

原文地址:http://www.open-open.com/lib/view/open1348919251822.html 近日,软件工程师Ricky Ho的在 他的博客里发表了一篇关于MongoD...
  • thinkone
  • thinkone
  • 2015年10月16日 09:49
  • 309

深入剖析MongoDB架构

转自:http://blog.csdn.net/java2000_wl/article/details/7596272 近日,软件工程师Ricky Ho的在他的博客里发表了一篇关于M...
  • tywei2012
  • tywei2012
  • 2013年11月15日 08:17
  • 2615

深入剖析MongoDB架构

近日,软件工程师Ricky Ho的在 他的博客里发表了一篇关于MongoDB架构( MongoDB Architecture)的博文,虽然这是一个听起来感觉很宽泛的话题,但是作者在文章中确实对Mo...
  • changan2001
  • changan2001
  • 2013年11月02日 22:51
  • 1235

《深入剖析tomcat》读书笔记2

《深入剖析tomcat》读书笔记准备写四篇,这篇是第二篇,分析默认连接器,对应书籍的第四章。第三篇分析容器,第四篇来个纵向总结,顺便回答第一篇开头提出的问题。 第四章  Tomcat默认连接器 ...
  • randyjiawenjie
  • randyjiawenjie
  • 2013年03月23日 17:11
  • 1876

深入剖析Tomcat-第一章

--开始学习Tomcat服务器,学习代码,自己注释一下。 import java.io.File; import java.io.IOException; import java.io.Input...
  • u011345136
  • u011345136
  • 2015年04月24日 20:17
  • 734

【MongoDB】深入了解MongoDB不可不知的十点

一、对象ID的生成 每个mongoDB文档那个都要求有一个主键,它在每个集合中对所有的文档必须是唯一的,主键存放在文档_id字段中。由12个字符组成; 4c291856       238d3b ...
  • sxb0841901116
  • sxb0841901116
  • 2014年11月01日 19:53
  • 2568

深入剖析MongoDB架构(数据存储架构)

近日,软件工程师Ricky Ho的在 他的博客里发表了一篇关于MongoDB架构( MongoDB Architecture)的博文,虽然这是一个听起来感觉很宽泛的话题,但是作者在文章中确实对Mo...
  • lantian0802
  • lantian0802
  • 2015年03月25日 10:01
  • 600

关于Mongodb的全面总结,学习mongodb的人,可以从这里开始!

原文地址:http://blog.csdn.net/jakenson/article/details/7060431  MongoDB的内部构造《MongoDB The Definitive G...
  • YiQiJinBu
  • YiQiJinBu
  • 2013年06月08日 09:56
  • 101589

深入剖析 mybatis 原理(一)

# 前言在java程序员的世界里,最熟悉的开源软件除了 Spring,Tomcat,还有谁呢?当然是 Mybatis 了,今天楼主是来和大家一起分析他的原理的。...
  • qq_38182963
  • qq_38182963
  • 2017年12月17日 13:13
  • 33
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深入剖析MongoDB架构
举报原因:
原因补充:

(最多只允许输入30个字)