MongoDB体系架构
前两篇文件初步介绍了MongoDB的安装及使用。在MongoDB命令之基本操作 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中可以看到同MySQL一样,MongoDB也是先创建数据库之后在创建collections;然后在collections中Insert数据。那么MongoDB内部数据如何分层存储的呢?下面聊聊MongoDB整体的架构。
MongoDB 与 MySQL 中的架构相差不多,底层都使⽤了可插拔的存储引擎以满⾜⽤户的不同需要。⽤户可以根据程序的数据特征选择不同的存储引擎,在最新版本的 MongoDB 中使⽤了 WiredTiger 作为默认的存储引擎,WiredTiger 提供了不同粒度的并发控制和压缩机制,能够为不同种类的应⽤提供了最好的性能和存储率。在存储引擎上层的就是 MongoDB 的数据模型和查询语⾔了,由于 MongoDB 对数据的存储与 RDBMS 有较⼤的差异,所以它创建了⼀套不同的数据模型和查询语⾔。
MongoDB整体层次结构如上图示,MongoDB实力与Database,Database与Collecitons均是一对多关系。其内部存储数据与关系型数据库有明显的差别——其存储的是Document。
RDBMS中熟悉的row/column的术语在MongoDB中不再适用,取而代之是document/field等——其中document是BSON格式的文档。
什么是BSON呢?BSON是⼀种类json的⼀种⼆进制形式的存储格式,简称Binary JSON,它和JSON⼀样,⽀持内嵌的⽂档对象和数组对象,但是BSON有JSON没有的⼀些数据类型,如Date和Binary Data类型。 BSON可以做为⽹络数据交换的⼀种存储形式,是⼀种schema-less的存储形式。
{key:value,key2:value2} 这是⼀个BSON的例⼦,其中key是字符串类型,后⾯的value值,它的类型⼀般是字符串,double,Array,ISODate等类型。BSON有三个特点:轻量性、可遍历性、⾼效性。
BSON的优点是灵活性⾼,⽐关系型数据库存储更⽅便。⽐如关系型数据库中处理⽤户、订单等数据要建⽴对应的表,还要建⽴它们之间的关联关系。但是BSON就不⼀样了,可以直接把⼀条数据和这条数据对应的数据都存⼊⼀个BSON对象中,这种形式更简单,通俗易懂。但它的缺点也很明显就是空间利⽤率不是很理想。
MongoDB中Document 中 可以出现的数据类型,如下:
以上数据均通过MongoDB提供的数据模型进行相应保存,其中数据模型有内嵌和引用两种。
内嵌指的是把相关联的数据保存在同⼀个⽂档结构之中。 MongoDB的⽂档结构允许⼀个字段或者⼀个数组内的值作为⼀个嵌套的⽂档。通常以下三种情况下选择使用内嵌数据模型:
1. 数据对象之间有包含关系 ,⼀般是数据对象之间有⼀对多或者⼀对⼀的关系 。
2. 需要经常⼀起读取的数据。
3. 有 map-reduce/aggregation 需求的数据放在⼀起,这些操作都只能操作单个 collection。
引⽤指通过存储数据引⽤信息来实现两个不同⽂档之间的关联,应⽤程序可以通过解析这些数据引⽤来访问相关数据。通常以下三种情况选择引用数据模型:
1. 当内嵌数据会导致很多数据的重复,并且读性能的优势⼜不⾜于覆盖数据重复的弊端 。
2. 需要表达⽐较复杂的多对多关系的时候 。
3. ⼤型层次结果数据集 嵌套不要太深。
那MongoDB内部具体是如何将数据保存到硬盘和内存的呢?这就是存储引擎的工作了——存储引擎是MongoDB的核⼼组件,专门,负责管理数据如何存储在硬盘和内存上。
MongoDB⽀持的存储引擎有好几种,有MMAPv1,WiredTiger和InMemory。 InMemory存储引擎⽤于将数据只存储在内存中,只将少量的元数据(meta-data)和诊断⽇志(Diagnostic)存储到硬盘⽂件中,由于不需要Disk的IO操作,就能获取所需的数据, InMemory存储引擎⼤幅度降低了数据查询的延迟(Latency)。从mongodb3.2开始默认的存储引擎是WiredTiger,3.2版本之前的默认存储引擎是MMAPv1, mongodb4.x版本不再⽀持MMAPv1存储引擎——整体而言其与MySQL存储引擎的思想一样。
配置文件中关于存储引擎的相关配置如下图:/etc/mongod.conf
可参考下图配置适合项目的存储引擎: