- MongoDB简介
MongoDB 是一个开源的、跨平台的、面向文档的、基于分布式文件存储的数据库系统,MongoDB 是由 C++ 语言开发,旨在为 Web 应用提供可扩展的高性能数据存储解决方案。在高负载的情况下,通过添加更多的节点,可以保证服务器性能。
MongoDB常常被归类为NoSQL数据库系统,也是当前NoSQL数据库的一种。 - MongoDB特点
- 高可用:MongoDB提供复制工具(副本集),支持自动故障转移,数据冗余,副本集一组相同数据集合的MongoDB实例,提供数据高可用的冗余数据。
- 高性能:MongoDB提供数据持久化方式,包含对嵌入式数据模型的支持,支持数据索引,并且索引可以包含文档及其数组的键
- 水平拓展:MongoDB提供分片来完成数据库水平上的扩展。分片(sharding)是指将数据拆分,将其分散存在不同的机器上的过程。分片也称为分区(partitioning)。将数据分散到不同的机器上,实现对数据的分布式存储,到达存储海量数据,负载更多请求。
- 支持多种存储引擎:MongoDB支持多个存储引擎:WiredTiger存储引擎、MMAPv1存储引擎、InMemory内存存储引擎。另外,MongoDB提供可插拔的存储引擎API供第三方开发自己的存储引擎。
- 丰富的查询语言:MongoDB提供丰富的查询语言以支持读写操作及其数据的聚会、文本搜索和地理信息查询。
- MongoDB体系结构MongoDB是一个实例,由多个数据库(Database)组成;一个数据库,由多个集合(Collection)组成;一个集合,又由多个文档(Document)组成。结构关系如下图MongoDB名词解释:
- 实例:由后台进程及其高速缓存组成,负责维护和访问数据库数据
- 数据库(Database):一个MongoDB实例可以创建多个数据库,需要注意不同的数据库存放在不同的文件中。
MongoDB中有三个特殊的数据库:admin、local(本地数据库,永远不可以复制,且一台服务器上的所有本地集合都可以放在这个数据库中)、config(用于分片设置、保存分片信息)。 - 集合(Collection):集合可以看做是关系型数据库中的表,不同的是关系型数据库中的表存放的是表数据,但 Collection 存放的是文档。需要注意的是:集合是“动态模式”的,对于文档的格式没有要求,所以十分自由。
编号 | MongoDB术语/概念 | SQL术语/概念 | 说明 |
1 | database | database | 数据库 |
2 | collection | table | 数据库/集合 |
3 | document | row | 数据记录行/文档 |
4 | field | column | 数据字段/域 |
5 | index | index | 索引 |
6 | primary key | primary key | 主键 |
7 | Embedded Documents | Table join | 表链接 |
- MongoDB 数据存储结构
MongoDB的默认数据目录是/data/db,它负责存储所有的MongoDB的数据文件。在MongoDB内部,每个数据库包含一个*.ns文件和一些数据文件,而且这些数据文件会随着数据量的增加而变得越来越多。
MongoDB 内部有预分配空间的机制,每个预分配的文件都用 0 进行填充,由于有了这个机制,MongoDB 始终保持额外的空间和空余的数据文件,从而有效避免了由于数据暴增而带来的磁盘压力过大的问题。
数据库的每张表都对应一个命名空间,每个索引也有对应的命名空间。这些命名空间的元数据都集中在在 *.ns 文件中。 - MongoDB体系结构详细说明
编号 | 名称 | 说明 |
1 | mongod | 数据库服务 |
2 | mongos | 分片集群部署中,数据和查询的路由服务 |
3 | mongo | shell客户端 |
4 | mongoimport / mongoexport | 导入导出工具 |
5 | mongodump / mongorestore | 备份恢复工具 |
6 | mongooplog | 拉取并重放oplog的工具 |
7 | mongostat、mongotop、mongosniff | 监控工具 |
8 | mongofiles | GridFS的命令行操作工具 |
9 | mongoperf | 性能测试工具-(当前版本只能测试I/O) |
10 | bsondump | 查看bson文件的工具 |
- MongoDB数据库文件类型MongoDB的数据库文件主要有3种:
- journal 日志文件
- namespace 表名文件
- data 数据及索引文件
- 日志文件
MongoDB的日志文件只是用来在系统出现宕机时候恢复尚未来得及同步到硬盘的内存数据。日志文件会存放在一个分开的目录下面。启动时候MongoDB会自动预先创建3个每个为1G的日志文件(初始为空)。除非你真的有持续海量数据并发写入,一般来说3个G已经足够。 - 命名文件 dbname.ns
用来存储整个数据库的集合以及索引的名字。这个文件不大,默认16M,可以存储24000个集合或者索引名以及那些集合和索引在数据文件中得具体位置。通过这个文件MongoDB可以知道从哪里去开始寻找或插入集合的数据或者索引数据。这个值可以通过参数调整至2G。 - 数据文件 dbname.0, dbname.1,… dbname.n
MongoDB的数据以及索引都存放在一个或者多个MongoDB数据文件里。第一个数据文件会以“数据库名.0”命名,如 my-db.0。这个文件默认大小是64M,在接近用完这个64M之前,MongoDB 会提前生成下一个数据文件如my-db.1。数据文件的大小会2倍递增。第二个数据文件的大小为128M,第三个为256M。一直到了2G以后就会停止,一直按这个2G这个大小增加新的文件。
当然MongoDB还会生成一些临时文件如 _tmp 和 mongod.lock等, 不过他们跟我们的讨论都没有太大相关性
- 数据文件结构MongoDB把所存储的BSON文档的数据和B树索引组织到逻辑容器“Extent”里面。Extent特性:
- 一个文件可以有多个Extent。
- 每一个Extent只会包含一个集合的数据或者索引。
- 同一个集合的数据或索引可以分布在多个Extent内。
- 同一个Extent不会又有数据又有索引。
- 每一个Extent存放多个Record,每个记录包含一个记录头及MongoDB的BSON文档,以及一些额外的padding空间。Padding是MongoDB在插入记录时额外分配一些未用空间。这样设计的目的是在文件变大的时候不至于把文档迁移到别处。记录头以整个记录的大小开始,包括该记录自己的位置以及前一个记录和后一个记录的位置。