MongoDB是全球领先的NoSQL数据库,是一个可扩展、开源、表结构自由,用C++语言编写且面向文档的高性能分布式数据库。

 MongoDB在持续演进中,不断优化自己的特色功能,保证了数据库的稳定性,同时吸收其它数据库的优点并完善其功能。MongoDB成为了最像关系数据库的NoSQL数据库,在NoSQL领域处于绝对领先的地位。

 如下图所示:

    里程碑MongoDB v3.0版本,第一次将存储引擎层与Server层解耦,支持分布式插件式存储引擎架构,引入了WiredTiger存储引擎;版本v3.6开始支持单文档事务,大大提高了数据库的并发性能,同时可以通过“两阶段提交”模拟多文档事务;版本v4.0开始真正支持多文档事务;v4.2版本开始支持分片集群的事务,解决了分布式事务的难题。

    文档为MongoDB最小逻辑存储单元,由键值对构成,如下图所示:

 MongoDB的文档数据模型类似于JSON格式,通过这种嵌套的文档或数组可以减少关系数据库中大量的Join操作。

 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的NoSQL数据库;如下图所示,RDBMS里面table的概念对应MongoDB的collection,row的概念对应document;同时MongoDB支持的查询语言非常强大,其语法有点类似面向对象的查询语言,几乎可以实现类似关系数据里绝大部分的SQL功能。

    MongoDB的出现主要基于以下几点考虑:需要一种新的数据库技术来满足数据存储层的水平扩展,且要容易开发,能够存储海量的数据;一种非关系的结构是使数据库能支持水平扩展的最好方案;文档数据模型(bson)容易编码和管理,将内部相关的数据放在一起能够提高数据库的操作性能。

     MongoDB原生支持Map Reduce并行编程模式,支持管道式的聚集框架,为大数据的分析提供了强有力的保障。此外,为了进一步丰富MongoDB的技术生态,给开发者或运营人员更多的选择,官方还提供了与Spark的连接器,可与其它第三方数据分析工具完美结合;提供了MongoDB Charts工具,以图形化报表的形式分析数据并展示;提供了MongoDB Compass工具实现对集群数据库可视化的管理。

     通常大数据平台由内到外分为:存储层,资源管理层,计算层,程序接口层,如下图所示:

 从上图可以看出,MongoDB可以替换HDFS,作为大数据平台中最核心的部分,且相较于HDFS,MongoDB具备如下优势:

  1. 存储方式上,HDFS以文件为单位,每个文件64MB~128MB不等,而MongoDB作为文档数据库则表现得更加细颗粒化;
  2. MongoDB支持HDFS所没有的索引的概念,所以在读取上更加快;
  3. MongoDB支持的增删改功能比HDFS更加易于修改写入后的数据;
  4. HDFS的响应级别为分钟, 而MongoDB通常是毫秒级别;
  5. 如果数据库已经是MongoDB的话, 那就不用再转存一份到HDFS上了;
  6. 可以利用MongoDB强大的Aggregate做数据的筛选或预处理。

 当前,数据库市场最少有上百种数据库(不包含那些重新编译后换个壳的产品),MongoDB经过短短十年左右的时间就发展成最受欢迎的NoSQL数据库,不但能支持大部分传统关系数据库的应用场景,还能更好地支持未来大数据、人工智能等应用场景,相较于其它数据库,MongoDB具有以下几个关键特性:

  1. 嵌套文档模型

 典型结构如下:

{
 "_id" : ObjectId("51e0c391820fdb628ad4635a"),
 "author" : { "name" : "Jordan","email" : "Jordan@123.com" },
 "postcontent" : "jordan is the god of basketball",
 "comments" : [
 {"user" : "xiaoming", “text" : "great player"},
 { "user" : "xiaoliang", "text" : "nice action" }
]
}

 用与以JSON格式类似的键值对来存储(在MongoDB中叫BSON对象),其中“值”的数据类型有常见的字符串、数字、日期、还可以是BSON对象、数组以及数组的元素也可以是BSON对象,通过这种嵌套的方式,使MongoDB的数据类型变得相当丰富。

  1. 模式自由

 MongoDB与传统关系数据库还有一个重大区别就是可扩展的表结构。也就是说collection(表)中的document(一行记录)所拥有的字段(列)是可以变化的,如下文档对象document(一行记录)比上面列出的文档对象document(一行记录)多一个time字段,但他们可以共存在同一个collection(表)中。

{
 "_id" : ObjectId("51e0c391820fdb628ad4635a"),
 "author" : { "name" : "Jordan","email" : "Jordan@123.com" },
 "postcontent" : "jordan is the god of basketball",
 "comments" : [
 {"user" : "xiaoming", “text" : "great player"},
 { "user" : "xiaoliang", "text" : "nice action" }
 ],
 “time”: “2013-07-13”
 }

 MongoDB查询语句不是按照SQL的标准来开发的,它是围绕JSON这种特殊格式的文档型存储模型开发了自己一套的查询体系,这就是现在非常流行的NoSQL体系。在关系数据库中常用的SQL语句在MongoDB中都有对应的解决方案。

 我们知道传统关系数据库中JOIN操作可能会产生笛卡尔积的虚拟表,消耗较多系统资源,而MongoDB的文档对象集合collection可以是任何结构,可以通过设计较好的数据模型尽量避开这样的操作需求,如果真的需要从多个collection(表)中检索数据,那可以通过做多次查询得到。

  1. 自带强大的计算框架

 在关系数据库中经常用到的group by等分组聚集函数,在MongoDB中也有,而且MongoDB提供了更加强大的Map Reduce方案,同时MongoDB官方还提供了与Spark的连接器,为海量数据的统计、分析提供了便利。

  1. 复制集保证数据高可靠性

 MongoDB支持复制集(replset),一个复制集在生产环境中最少需要3台独立的机器(测试的时候为了方便可能都部署在一台机器上),一台做主节点(primary),一台做次节点(secondary),一台做仲裁节点(只负责选出主节点),备份,自动故障转移,这些特性都是复制集支持的。

  1. 分片集群实现高可扩展性

 MongoDB支持自动分片sharding,分片的功能实现海量数据的分布式存储,分片通常与复制集配合起来使用,实现读写分离、负载均衡,当然如何选择片键?是实现分片功能的关键,后面章节会详细分析。

  1. 多文档事务的支持

 多文档事务特性从v4.0版本开始支持复制集部署模式,v4.2版本更加完善,并开始支持分片集群部署模式。这个关键特性促使MongoDB具备像关系数据库那样的高并发能力,能够支持对ACID要求比较高的应用场景,完全可以替代关系数据库,在生产环境中全面部署MongoDB。