1.MongoDB保留数据库
MongoDB安装完成后,默认会创建local、admin、config和test数据库。test是一个默认的数据库,用来做各种测试等。local数据库存储本地单台数据库的任意集合,local数据库里的内容不会同步到副本集的其他节点上去。admin数据库主要存储MongoDB的用户、角色等信息,将用户添加到此数据库中,该用户会自动继承数据库的所有权限;执行一些特定的服务器端命令,比如列出所有的数据库或者关闭服务。config数据库主要存储分片集群基础信息,config数据库在内部使用,用于保存分片的相关信息。
2.复杂文档模型的设计
MongoDB是模式自由的数据库,不需要预先定义模式,其文档是BSON格式的,任何一个集合都可以保存任意结构的文档,它们的格式千差万别。在实践,考虑业务数据分类和查询优化机制的应用需求,每个集合中文档的数据结构应该比较接近。复杂文档模型的设计可以通过内嵌和引用的方法来实现,“引用”是将不同实体的数据分散到不同的集合中,“内嵌”是将每个文档所需的数据都嵌入文档内部。
索引:用来提高查询性能,默认情况下在文档的键字段上创建唯一索引;索引需占用内存和磁盘,建议建立有限个索引且不重复;每个索引都需要一定的空间。
大集合拆分:例如一个用于存储日志的集合,日志分为两种——dev和debug,结果大致为{"log":"dev","content":"…"}和{"log":"debug","content":"…"}。这两种日志的文档个数比较接近,即使建立索引也不高效,可以考虑将它们分别存放在两个集合中,如log_dev和log_de-bug,以提高查询效率。
数据生命周期管理:MongoDB提供了过期机制,指定文档保存的时长。文档过期后自动删除,MongoDB启动后台线程来删除过期的文档。
3.MongoDB数据库文件类型
MongoDB的数据库文件主要有3种:日志文件,命名文件,数据及索引文件。
日志文件为MongoDB提供了数据保障能力,用于当数据库异常失效后,重启时进行数据恢复;对于写操作,首先写入日志,然后在内存中修改数据,后台线程间歇性地将内存中修改的数据写到底层的数据文件中,从而保证了数据库的可恢复性。MongoDB的日志文件仅用来在系统出现宕机时恢复尚未来得及同步到硬盘的内存数据。日志文件会存放在一个独立的目录下面。启动时MongoDB会自动预先创建3个、每个为1GB的日志文件(初始为空)。除非你真得有持续海量数据并发写入,否则3GB已经足够。
命名文件用来存储整个数据库的集合以及索引的名字,默认为16MB,可以存储24000个集合或者索引名以及那些集合和索引在数据文件中的具体位置。通过这种文件,MongoDB可以知道从哪里开始寻找或插入集合的数据或者索引数据。命名文件可以通过参数调整至2GB。
数据文件如dbname.0, dbname.1, …,dbname. n , MongoDB的数据以及索引都存放在一个或者多个MongoDB数据文件里。第一个数据文件会以“数据库名.0”命名,如my-db.0。这个文件默认大小是64MB,在快用完这个64MB时,MongoDB会提前生成下一个数据文件,如my-db.1。数据文件的大小会两倍递增。第二个数据文件的大小为128MB,第三个为256MB。到了2GB以后就会停止,一直按2GB这个大小增加新的文件。
当然MongoDB还会生成一些临时文件,如_tmp和mongod.lock等。
4.MongoDB数据库文件
MongoDB的默认数据目录是“/data/db”,负责存储所有数据文件,每个数据库都包含一个.ns命名文件和一些数据文件,这些文件随着数据量的增加变得越来越多,如果系统中有一个叫作test的数据库,则test数据库的文件就包括test.ns、test.0、test.1、test.2等。
MongoDB内部有预分配空间的机制,每个预分配的文件都用0进行填充;由于表中数据量的增加,数据文件每重新分配一次,它的大小都会是上一个数据文件大小的两倍,每个数据文件最大为2GB;数据库的每张表都对应一个命名空间,每个索引也有对应的命名空间;test这个数据库包含3个文件,用于存储表和索引数据,test.2文件属于预分配的空文件,test.0和test.1这两个数据文件被分为相应的盘区,对应不同的命名空间。每个命名空间可以包含多个不同的盘区,这些盘区并不是连续的,与数据文件的增长相关。
在每一个数据文件内,MongoDB把所存储的BSON文档的数据和B树索引组织到逻辑容器Extent里面。一个文件可以有多个Extent,每一个Extent只会包含一个集合的数据或索引,同一个集合的数据或索引可分布在多个Extent内,这几个Extent也可以分布在多个文件内,同一个Extent不会又有数据又有索引。在每个Extent里面存放多个记录(Record), 每一个记录里包含一个记录头以及MongoDB的BSON文档,记录头以整个记录的大小开始,包括该记录的位置以及前一个记录和后一个记录的位置。