本文全部内容以MongoDB4.2版本为基础。
一、MongoDB是什么?
??MongoDB是一个可扩展、开源、表结构自由,由C++编写面向文档的高性能分布式数据库。它更像是介于关系型数据库(RDBMS)和非关系型数据库(NoSQL)之间的数据库,是非关系型数据库中功能最丰富、最像关系型数据库的非关系型数据库。MongoDB支持的数据结构非常松散,是类似json的bson格式,可以存储比较复杂的数据类型。
1. MongoDB中的概念
??为方便理解,下表以Mysql与MongoDB比较,Mysql中的表即对应MongoDB中的集合概念,Mysql中的行即对应MongoDB中的文档概念,数据库与索引的概念同Mysql一致。
Mysql | Mongodb |
---|
database | database | table | collection | row | document | index | index |
2. MongoDB的优势与不足
??首先引用官方文档的第一句话:
Welcome to the MongoDB 4.2 Manual! MongoDB is a document database designed for ease of development and scaling 翻译为中文即为: 欢迎使用MongoDB 4.2手册!MongoDB是一个文档数据库,旨在便于开发和扩展。
所以MongoDB设计之初想要提供的就是一个可以简化开发、支持扩展的数据库,同时它具有高性能、高可用的特点。
①简化开发: 数据是以类似于 JSON 文件的键值对形式的文档进行存储的,这种设计模式对数据的约束条件较少,同时文档对应于许多编程语言中的原生数据类型,十分便于开发。 ②可扩展: 传统垂直扩展局限于单台服务器的性能。而MongoDB分片模式支持水平扩展,通过增加服务器数量来对数据库扩容。 ③高性能: WiredTiger存储引擎下,数据写入内存即完成,持久化到硬盘的操作在后台异步完成。同时副本集的读写分离,分片模式的多写可以更大程度的提高吞吐量。 ④高可用: 副本集模式会将数据同步在一到多个副本服务器,并支持故障自动转移,同时提供了数据的冗余备份,提高了数据的可用性, 保证了数据的安全性。
??虽然MongoDB优点明显,在4.2版本也引入了分布式事务,但目前对事务性有较强要求的应用程序仍然不建议使用MongDB,另外在多个不同维度上对不同类型的数据进行连接是关系型数据库擅长的事情,此类场景同样不建议使用MongoDB。
二、MongoDB的特性
1. 嵌套文档模型
?? MongoDB的文档(为方便理解Mongo中的一个文档可以想象成Mysql的一条数据)采用类似Json的键值对格式存储数据,在Mongo中称为Bson。且MongoDB 文档可以将文档结构嵌入到文档中的字段或数组中,如下图所示。 ?? 嵌套文档模型允许应用程序将相关的信息片段存储在同一数据库记录中。因此,应用程序可以用更少的查询和更新来完成常见操作,提高了性能。而且这种非规范化数据模型将所有相关数据组合在一个文档中,而不是跨多个文档和集合进行规范化,有助于原子操作。
2. 模式自由
?? 在关系型数据库中,我们必须要先声明一个表结构,而在MongoDB中默认不要求一个集合(可以理解为约等于Mysql中的表)内的文档拥有相同的字段,而且相同字段在不同的文档中也可以有不同的数据类型。如下所示第一条数据为姓名、年龄、性别,第二条数据为性别、年龄、身高。
> db.test.insert({"name":"xiaoming","age":"18","sex":"男"});
WriteResult({ "nInserted" : 1 })
>
> db.test.insert({"name":"xiaohong","age":"16","height":"165"});
WriteResult({ "nInserted" : 1 })
>
> db.test.find()
{ "_id" : ObjectId("62b49cda779f3b59142bb909"), "name" : "xiaoming", "age" : "18", "sex" : "男" }
{ "_id" : ObjectId("62b49d25779f3b59142bb90a"), "name" : "xiaohong", "age" : "16", "height" : "165" }
>
?? 3.2版本开始MongoDB引入了指定验证规则,即在插入或更新时根据人为制定的校验规则进行数据校验。在3.6版本引入了Json模式的验证规则。
3. 可靠性
?? MongoDB支持副本集模式,提供数据实时备份与自动故障转移。 ?? 最小的副本集集群需要部署在3台服务器,分别为主节点(Primary)、从节点(Secondary)和仲裁节点(Arbiter)。主节点会将数据实时同步到从节点实现数据备份,若主节点异常时从节点会升级为主节点,实现自动故障转移。
4. 可扩展性
?? 当考虑提升系统负荷时,通常会考虑进行垂直扩展或水平扩展。垂直扩展即在单台服务器增加CPU、内存、存储等资源,这种扩展方式严重挑战单台服务器的硬件限制,且扩容成本较高。水平扩展即通过增加服务器数量来提升系统承载力,不受单台服务器硬件限制,多台服务器共同协作,但相比垂直扩展操作较为复杂。 ?? MongoDB的分片模式就是一种在多台机器分布数据的方法。可以使用分片模式来支持非常大的数据集和高吞吐量操作。分片模式各组件如下图所示。
5. 支持分布式事务
?? 对于需要对多个文档进行原子性操作的情况,MongoDB在4.0版本开始支持副本集模式的多文档事务,4.2版本开始支持分片集群的事务,实现了分布式事务,至此MongoDB也可以实现全面替代关系型数据库的使用。使用分布式事务,可以跨多个操作、集合、数据库、文档和分片使用事务。
6. 文件存储
?? BSON限制一个文档最多存储16MB数据,如果我们的文件小于16MB,可以将文件转换为二进制数据以文档的形式存入集合。同时MongoDB也提供了用于存储和检索超过16 MB 的文件规范,即GridFS。 ?? GridFS将文件拆分为块保存到多个文档中,这种方式使得我们想要读取文件的一部分信息时无需将整个文件加载到内存,面对大文件时可能比系统级文件系统效率更高。GridFS 不仅可用于存储超过 16 MB 的文件,还可存储任何文件,但MongoDB建议若我们想要存储的所有文件都小于16MB的限制时,应优先考虑将每个文件存储到单个文档中而非GridFS。
参考
《MongoDB核心原理与实践》郭远威 著 Mongodb官方文档:https://www.mongodb.com/docs/v4.2/
|