设为首页 收藏本站
查看: 957|回复: 0

[经验分享] MongoDB内部结构

[复制链接]

尚未签到

发表于 2015-7-8 07:14:16 | 显示全部楼层 |阅读模式
一、前言
    本文主要讲述MongoDB使用的数据类型BSON,使用的传输协议Mongo Wire Protocol,MongoDB数据文件的内部结构。
  二、BSON
  
     BSON [bee · sahn], short for Bin­ary JSON, is a bin­ary-en­coded seri­al­iz­a­tion of JSON-like doc­u­ments.
    JSON相信大家都很熟悉,官网上用一个页面,几百字就把JSON的规则讲清楚了,JSON只包括六种数据类型:null,对象,布尔,数字,字符串以及数组。而BSON支持更多的数据类型,比如日期类型等。
  BSON官网的一个例子{"hello": "world"},分析BSON的存储结构如下:
  TotalSize(4)| { BSONType(1)| FieldName | Data } * EOO(1)
  TotalSize:Document转换为BSON后的总长度,4个字节表示
  BSONType:Data的数据类型,占一个字节
  FieldName:字段名,例子中的hello,key/value的"key",UTF-8字符串,字符串都有一个结束符'\0'
  Data:key/value的value,例子中的"world",如果是字符串则在Data前需要另加四个字节存储Data的长度,如果是其他格式可以参考官网规范。
  *:key/value的对数,比如{"hello":"world", "hello1":"world1"},有两对
  EOO:结束符,\x00
  分析例子{"hello":"world"}的长度:
  TotalSize(4) + BSONType(1) + FieldName(5+1) + Data(4 + 5 + 1) + EOO(1) = 22 字节
  进入Mongo Shell可以通过Object.bsonsize 查看bson大小。
DSC0000.jpg
  而且在http://bsonspec.org/#/specification的example中也可以看到BSON的前四个字节为\x16\x00\x00\x00,十进制正好是22。
  BSON牺牲一些空间来换取更容易遍历的格式,不用每次都检查是否等于'\0',可遍历性是BSON非常重要的性质。
  三、 Mongo Wire Protocol
    Mongo Wire Protocol 与 http, ftp都属于应用层协议,只不过该协议目前只是应用于MongoDB 的相关应用中。每个Mongo Wire Protocol 消息都是由标准消息头部和具体的请求数据组成。
  标准消息头部格式如下:
DSC0001.jpg
  而具体的请求,比如修改集合
DSC0002.jpg
  具体可以参考http://www.mongodb.org/display/DOCS/Mongo+Wire+Protocol。
  四、 MongoDB数据文件的内部结构
   DSC0003.jpg
  每个数据库都有一个.ns文件和若干个数据文件组成(.0,.1,.2,.....),其中.ns文件为16M,而.0文件16M,.1文件32M,往后则翻倍,最大值为2G,这样可以让小数据库不浪费太多的空间,大数据库能够使用磁盘上连续的空间。
  数据库里面的每个集合和索引都对应着命名空间。
DSC0004.jpg
  这是local数据库中的命名空间,可以看到集合,固定集合(capped collection),索引都有自己的命名空间。
  .ns文件记录着若干个集合命名空间和索引命名空间。
  一个集合命名空间又有多个数据域(extent),集合命名空间里存储着集合的元数据,比如集合名称,集合的第一个数据域和最后一个数据域的位置等等。而一个数据域由若干条文档(document)组成,每个数据域都有一个头部,记录着第一条文档和最后一条文档的为知,以及该数据域的一些元数据。extent之间,document之间通过双向链表连接。
  索引的存储数据结构是B树,索引命名空间存储着对B树的根节点的指针。MongoDB数据内部结构图如下(图片来自NoSQLFan)
DSC0005.png

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-84220-1-1.html 上篇帖子: PHP MongoDB 扩展安装配置 下篇帖子: 1. MONGODB启动&关闭
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表