MongoDB架构图解

标签: DataBase Linux UNIX 外文翻译 MongoDB | 发表时间:2012-05-12 18:25 | 作者:谋万世全局者
出处:http://www.ha97.com

本文图片来自Ricky Ho的博文MongoDB构架(MongoDB Architecture),这是个一听就感觉很宽泛的话题,但是作者在文章中确实对MongoDB由内至外的架构进行了剖析。本文截取了其文章中的几张重点架构示意图片进行简单描述。希望对大家有用。

MongoDB数据文件内部结构


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

相关阅读:《 MongoDB数据文件内部结构

在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一样。

MongoDB数据同步

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

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

分片机制

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

服务器角色

上面讲了分片的标准,下面是具体在分片时的几种节点角色

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

更多详细内容请看原文: MongoDB Architecture

翻译:http://blog.nosqlfan.com/html/3887.html

相关 [mongodb 架构] 推荐:

MongoDB架构图解

- - 服务器运维与网站架构|Linux运维|互联网研究
本文图片来自Ricky Ho的博文MongoDB构架(MongoDB Architecture),这是个一听就感觉很宽泛的话题,但是作者在文章中确实对MongoDB由内至外的架构进行了剖析. 本文截取了其文章中的几张重点架构示意图片进行简单描述. MongoDB数据文件内部结构. MongoDB在数据存储上按命名空间来划分,一个collection是一个命名空间,一个索引也是一个命名空间.

[mongodb] java操作mongodb

- - 数据库 - ITeye博客
           //实例化Mongo对象,连接27017端口.                               //连接名为yourdb的数据库,假如数据库不存在的话,mongodb会自动建立. //从Mongodb中获得名为yourColleection的数据集合,如果该数据集合不存在,Mongodb会为其新建立.

第五部分 架构篇 第十五章 MongoDB Replica Sets 架构(动态增加删除结点)

- - CSDN博客推荐文章
1、Replica Set增加结点. MongoDB Replica Set不仅提供高可用性的解决方案,它也同时提供负载均衡的解决方案,增减Replica Sets结点在实际应用中非常普遍,比如当应用的读压力暴增时,3台结点的环境已经不能满足需求,那么就需要增加一些结点将压力平均分配一下,当应用的压力小时,可以减少一些结点来减少硬件资源的成本,总是是一个长期且持续的工作.

【MongoDB】MongoDB之优化器Profiler

- - CSDN博客数据库推荐文章
在mysql数据库中,慢查询日志经常作为优化数据库的依据, mongodb中依然有类似的功能. Mongodb自带的profiler,可以方便地记录所有耗时的操作,以便于调优;. 一、开始profiler功能. 开启profier功能有两种:. 第一种就是直接在启动参数里面进行设置,就在茄冬mongodb时候添加-profile=级别.

夜说mongodb

- Lianhui Wang - NoSQLFan
前两天本站刚刚分享了wordnik使用MongoDB经验的文章:《Wordnik 的 MongoDB 使用经历》,今天又看到一位朋友对这方面做的总结,分享在这里,供大家参考. 赋闲以后很长没有更新博客了,说忙完全是借口,多半因为没有兴致所致. 今天凌晨比赛多多,趁着比赛的前奏和间隙,遂浏览些技术文章.

MongoDB与内存

- 高春辉 - 火丁笔记
但凡初次接触MongoDB的人,无不惊讶于它对内存的贪得无厌,至于个中缘由,我先讲讲Linux是如何管理内存的,再说说MongoDB是如何使用内存的,答案自然就清楚了. 据说带着问题学习更有效,那就先看一个MongoDB服务器的top命令结果:. 这台MongoDB服务器有没有性能问题. 先讲讲Linux是如何管理内存的.

白话MongoDB(一)

- Ease - 江边潮未尽,枫红一季秋
按照官方的说法,MongoDB是一种可扩展的高性能的开源的面向文档(document-oriented )的数据库,采用C++开发. 注意mongo不是mango(芒果),这个词是从humongous中截取出来的,其野心不言而明,直指海量数据存储. 和其他很多NoSQL不太一样,MongoDB背后有一个专门的商业公司在提供支持和推广,有点类似MySQL AB的模式.

MongoDB 索引

- - 博客园_首页
索引是用来加快查询的,数据库索引与数据的索引类似,有了索引就不需要翻遍整本书,数据库可以直接在索引中查找,. 使得查询速度很快,在索引中找到条目后,就可以直接跳转到目标文档的位置.. 要掌握如何为查询配置最佳索引会有些难度.. MongoDB索引几乎和关系型数据库的索引一样.绝大数优化关系型数据库索引的技巧同样适用于MongoDB..

MongoDB sql操作

- - 数据库 - ITeye博客
1.  基本查询:. 下面的示例等同于SQL语句的where name = "stephen" and age = 35.      --返回指定的文档键值对. 下面的示例将只是返回name和age键值对.      --指定不返回的文档键值对. 下面的示例将返回除name之外的所有键值对.