因项目需要暂时停止es的学习,开始学习下mongodb基本使用。


一、MongoDB 中的应用场景及设计原理

          MongoDB 是一个基于分布式文件存储的数据库。由 C++语言编写。旨在为 WEB 应用提供可扩展的高性能 数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当 中功能最丰富,最像关系数据库的。在这里我们有必要先简单介绍一下非关系型数据库(NoSQL)。

1.1、什么是 NoSQL

            NoSQL,指的是非关系型的数据库。NoSQL 有时也称作 Not Only SQL 的缩写,是对不同于传统的关系 型数据库的数据库管理系统的统称。NoSQL 用于超大规模数据的存储。(例如谷歌或 Facebook 每天为 他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向 扩展。

1.2、关系型数据库 PK 非关系型数据库

mongpdb使用架构 mongodb底层原理_数据库

1.3、NoSQL 数据库分类

   

mongpdb使用架构 mongodb底层原理_数据库_02

   

mongpdb使用架构 mongodb底层原理_数据库_03

1.4、MongoDB 的数据结构与关系型数据库数据结构对比

1.5、MongoDB 中的数据类型

mongpdb使用架构 mongodb底层原理_数据存储_04

1.6、图解 MongoDB 底层原理

   MongoDB 的集群部署方案中有三类角色:实际数据存储结点、配置文件存储结点和路由接入结点。 连接的客户端直接与路由结点相连,从配置结点上查询数据,根据查询结果到实际的存储结点上查询和 存储数据。MongoDB 的部署方案有单机部署、复本集(主备)部署、分片部署、复本集与分片混合部署。
     副本集,认为就是一台存储数据的机器(mongo),一个副本集数据一定是一个完整的整体

复本集与分片混合部署 混合的部署方式如图:

      

mongpdb使用架构 mongodb底层原理_数据存储_05

mongodb 主要分为:mongo 客户端、mongos    路由器 、mongod    数据存储。

1 mongo 客户端 连接mongo的客户端

2 mongos    路由器  根据 mongod中的 config server 信息分配客户访问数据的分片。

混合部署方式下向 MongoDB 写数据的流程如图:

mongpdb使用架构 mongodb底层原理_数据库_06

混合部署方式下读 MongoDB 里的数据流程如图:

     

mongpdb使用架构 mongodb底层原理_数据存储_07

写数据的过程是只写到主结点中,由主 结点以异步的方式同步到从结点中:

        

mongpdb使用架构 mongodb底层原理_mongpdb使用架构_08

而读数据则只要从任一结点中读取,具体到哪个结点读取是可以指定的:

            

mongpdb使用架构 mongodb底层原理_数据库_09

mongodb 数据存储

1、微观的维度(你看不到的一个维度)
chunk(块)-->shard(片) --> Replica Set(副本) --> Data(数据)

2、宏观的维度(你能看到的)
Field(字段) -->  Document(文档) --> Collection(集合) -->  DataBase(数据库)

      对于 MongoDB 的分片,假设我们以某一索引键(ID)为片键,ID 的区间[0,50],划分成 5 个 chunk, 分别存储到 3 个片服务器中,如图所示:

           

mongpdb使用架构 mongodb底层原理_数据库_10

       假如数据量很大,需要增加片服务器时可以只要移动 chunk 来均分数据即可。 配置结点: 存储配置文件的服务器其实存储的是片键与 chunk 以及 chunk 与 server 的映射关系,用上面的数据表 示的配置结点存储的数据模型如下表: 

       

mongpdb使用架构 mongodb底层原理_数据库_11

路由结点: 路由角色的结点在分片的情况下起到负载均衡的作用。

    1.7、MongoDB 的应用场景和不适用场景
             1、适用场景 对于 MongoDB 实际应用来讲,是否使用 MongoDB 需要根据项目的特定特点进行一一甄别,这就要求我 们对 MongoDB 适用和不适用的场景有一定的了解。

          根据 MongoDB 官网的说明,MongoDB 的适用场景如下:

     1)网站实时数据:MongoDB 非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及 高度伸缩性。

     2)数据缓存:由于性能很高, MongoDB 也适合作为信息基础设施的缓存层。在系统重启之后,由 MongoDB 搭建的持久化缓存层可以避免下层的数据源过载。

     3)大尺寸、低价值数据存储:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很 多时候程序员往往会选择传统的文件进行存储。

    4)高伸缩性场景:MongoDB 非常适合由数十或数百台服务器组成的数据库。MongoDB 的路线图中已经包 含对 MapReduce 引擎的内置支持。

    5)对象或 JSON 数据存储:MongoDB 的 BSON 数据格式非常适合文档化格式的存储及查询。

  2、不适用场景 了解了 MongoDB 适用场景之后,还需要了解哪些场景下不适合使用 MongoDB,具体如下:

          1)高度事务性系统:例如银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂 事务的应用程序。

          2)传统的商业智能应用:针对特定问题的 BI 数据库会对产生高度优化的查询方式。对于此类应用, 数据仓库可能是更合适的选择。

          3)需要复杂 SQL 查询的问题。 相信通过上面的说明,你已经大致了解了 MongoDB 的使用规则,需要说明一点的是,MongoDB 不仅仅 是数据库,更多的使用是将 MongoDB 作为一个数据库中间件在实际应用中合理划分使用细节,这一点对 于 MongoDB 应用来讲至关重要