1.简介
MongoDB是一个开源的,高性能无模式的文档型数据库,非关系型数据库。可用于替代传统的关系型数据库或键/值存储方式。
主要特点:
(1)高性能:非关系型,无模式,使用内存映射
(2)高可用:自动故障转移和副本集
(3)水平扩展:分片能把数据分发到一个集群的环境中
(4)支持多个存储引擎:WiredTiger 和MMAPv1 Storage Engine,可插拔,支持第三方引擎
与MySQL相比,也是从关系型和非关系型数据库间对比,主要有以下不同:
(1)非关系型,文档之间没有联系,数据自包含,MySql有外键,连接查询等
(2)不支持事务,但不代表不能用于管理重要数据(MySQL的MYISAM存储引擎也不支持事务...)
(3)无模式,集合中的文档结构不固定,可以存储各式各样的文档,文档可以嵌套,存储数组等
(4)没有表,行的概念,与之对应的是集合和文档
2.文档
MongoDB的集合不强制指定文档的结构,文档结构具有高度的灵活性,不像关系数据库在插入数据时,必须先指定表的结构。
MongoDB采用BSON类型文档存储,BSON是JSON的二进制表示,它包含更多的数据类型。如下一个简单的文档:
var mydoc = {
_id: ObjectId("5099803df3f4948bd2f98391"), ObjectId类型的属性
name: { first: "Alan", last: "Turing" }, embedded嵌套文档
birth: new Date('Jun 23, 1912'), date日期类型
death: new Date('Jun 07, 1954'),
contribs: [ "Turing machine", "Turing test", "Turingery" ], array数组类型
views : NumberLong(1250000) NumberLong类型
}
文档的局限性:每个文档最大不能超过16M,对于电影,图片等大文件MongoDB使用 GridFS 来进行分块存储。
文档的属性字段是字符类型,并且区分大小写,大多数MongoDB接口不支持属性重名,不能包含美元符号($),点(.),null 这些字符,每个文档都有”_id”为保留作 为一个主键字段。
文档中可以使用的数据类型如下表:
3.存储方式
MongoDB支持多种存储引擎,这里主要介绍两种,分别是MMAPv1和WiredTiger。主要从这几个方面来描述,并发写入,操作日志,内存使用
3.1 WiredTiger Storage Engine
主要特点有:
(1)WiredTiger存储引擎是MongoDB3.2的默认存储引擎。
(2)支持文档级别的并发。
(3)快照和检查点,WT先将所有数据写到一个快照中然后刷到磁盘数据文件,并把当前刷新的数据作为数据文件中的一个检查点,可用来确保数据的一致性和恢复 数据(也能作为恢复点),WT中每60秒或者journal文件大于2G会设置一个检查点,将数据刷到磁盘。
(4)Journal 操作日志,每50毫秒会记录每个检查点之间的所有修改操作,日志文件大小限制为100M,每创建新的文件会同步之前的日志文件,在dbpath的目录 下会有一个Journal的文件夹,日志文件命名为WiredTigerLog.<sequence>。
(5)内存使用,WT默认使用内存的60%-1G或者1G
3.2 MMAPv1 Storage Engine
MMAPv1基于内存映射,擅长处理大量的读写和就地更新操作。是3.2之前版本的默认存储引擎。
主要特点有:
(1)支持集合级别的并发
(2)Journal操作日志,每100毫秒就会写入journal files 一次,每60秒持久化一次数据文件data files到磁盘,所以当一个mongod实例还没刷数据到磁盘,可 以使用Journal进行数据恢复。在dbpath的目录下会有一个Journal的文件夹,日志文件命名为j._<sequence>,文件超过1G会创建新的。
(3)Avoid Preallocation Lag for MMAPv1 预先配置落后
(4)内存使用,MMAPv1会尽可能使用所有可用的内存作为缓存
4.权限
MongoDB默认不开启访问控制,单机可以使用—auth参数启用,集群使用keyfile方法启用。
MongoDB中的用户权限:
5.总结
MongoDB是一个分布式文件存储的数据库,由C++语言编写,旨在提供可扩展的高性能数据存储方案。
采用无模式结构存储,集合可以存储结构不同的文档,但一般还是存储相同的结构;支持索引,可以在任意属性上建立索引,包括内嵌文档;丰富的查询语言以及聚合工具,支持复制和数据恢复,内置自动数据分片等功能。
主要适用于以下场景:
(1) 适合实时插入,更新和查询,高度可伸缩性
(2) 缓存,性能高可作为缓存层
(3) 适合数十或数百台服务器组成的数据库