声明:该文章主要来自《MongoDB实战》一书内容,主要想通过该书学习MongoDB的相应知识,加深理解,故写在自己的博文当中,作为记录,在最后的章节中,会有一个自己集合MongoDB数据库应用的JavaEE的web应用。
MongoDB是一个可移植的数据库,它在流行的每一个平台上都可以使用,即所谓的跨平台性,在不同的操作系统上虽然略有差别,但是从整体架构上来看,MongoDB在不同的平台上是一样的,如数据逻辑结构和数据存储等等。
一个运行着的MongoDB数据库就可以看成是一个MongoDB Server,该Server由实例和数据库组成,在一般情况下,一个MongoDB Server机器上包含一个实例或者多个与之对应的数据库,但是在特殊情况下,如硬件投入成本或者特殊的应用需求,也允许一个Server机器上可以有多个实例或者多个数据库。
MongoDB中一系列物理文件(数据文件、日志文件等)的集合与之对应的逻辑结构(集合、文档等)被称之为数据库,简单的说,就是数据库是由一系列与磁盘有关系的物理文件的组成。
3.1、数据逻辑结构
很多人在学习MongoDB体系结构的时候会遇到各种各样的问题,我在这里给大家简单的介绍下MongoDB体系结构之一的逻辑结构,MongoDB的逻辑结构是一种层次结构,主要由:文档(Document)、集合(Collection)、数据库(database)这三部分组成,逻辑结构是面向用户的,用户使用MongoDB开发应用程序使用的就是逻辑结构。
- MongoDB的文档(Document),相当于关系数据库中的一行记录。
- 多个文档组成一个集合(Collection),相当于关系数据库的表。
- 多个集合(Collection),扩及上组织在一起,就是数据库(database)。
- 一个MongoDB实例支持多个数据库(database)。
文档(Document)、集合(Collection)、数据库(Database)的层次结构如下图:
对于习惯了关系型数据库的朋友们,我将MongoDB与关系型数据库的逻辑结构进行了对比,以便让大家更深刻的理解MongoDB的逻辑结构:
3.2、数据存储结构
MongoDB对国内用户来说比较新,它就像是一个黑盒子,但是如果对于它内部的数据存储了解多一些的话,那么就会很快的理解和驾驭MongoDB,让它发挥更大的作用。
MongoDB的默认数据目录是/daba/db,它负责存储所有的MongoDB的数据文件,在MongoDB内部,每个数据库都包含一个.ns文件和一些数据文件,而且这些文件会随着数据量的增加变的越来越多,所以如果系统中有一个叫做foo的数据库,那么构成foo这个数据库的文件就会由foo.ns、foo.0、foo.1、foo.2等组成,具体如下:
MongoDB内部有预分配空间的机制,每个预分配的文件都用0进行填充,由于有了这个机制,MongoDB始终保持额外的空间和空余的数据文件,从而有效避免了由于数据暴增而带来的磁盘压力过大的问题。
由于表中数据量的增加,数据文件每新分配一次,它的大小都会是上一个数据文件大小的2倍,每个数据文件最大2G,这样的机制有利于防止较小的数据库浪费过多的磁盘空间,同时又能保证较大的数据库有相应的预留空间使用。
数据库的每张表都对应一个命名空间,每个索引也有对应的命名空间,这些命名空间的元数据集中在*.ns文件中。
在下图中。foo这个数据库包含3个文件用于存储表和索引数据,foo.2文件属于预分配的空文件,foo.0和foo.1这两个数据文件被分为了相应的盘区对应不同的名字空间。
上图显示了命名空间和盘区的关系,每个命名空间可以包含多个不同的盘区,这些盘区并不是连续的,与数据文件的增长相同,每个命名空间对应的盘区大小的而是随着分配的次数不断增长的,这样做的目的是为了平衡命名空间浪费的空间与保持某一个命名空间中数据的连续性,上图中还有一个需要注意的命名空间:$freelist,这个命名空间用户记录不再使用的盘区(被删除的Collection或者索引),每当命令空间需要分配新的盘区的时候,都会先查看$freelist是否有大小合适的盘区可以使用,这样就回收空闲的磁盘空间。