前言

  Mongodb是一个非常有名的缓存数据库,和它名气相当的还有redis和hbase。笔者之前使用过redis,memcache和elasticsearch,借着工作机会,正好可以好好学习一下mongodb。

安装,部署

  笔者在百度搜索下的mongodb官网上没有看到直接的下载链接,反而还要注册,比较麻烦。最后是在一篇博文里找到了直接的下载地址。直接选择一个较新的以msi为后缀的下载地址下载即可(笔者的环境是windows7 64位环境)。php的mongodb扩展也可搜索下载即可。在windows下每次启动mongodb需要在cmd进入对应目录启动,比较繁琐。按照这篇博文的做法,可以将mongodb注册为windows的一个服务,使用起来就非常的方便了。

  笔者使用的ide是netbean8.2,在里面插件管理搜索mongodb可以找到一款小型的mongodb可视化插件,对于简单的mongodb管理已经足够了。

定义

  MongoDB  是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB  是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。(来源:百度百科)

  让我们来仔细分析下定义:

  1)分布式文件存储。 这个名词听着就很厉害。顾名思义,就是存储的内容不在一台主机上,而是可以有多个节点主机,数据分散存在上面。  通过进一步查资料了解到, 对于客户端来说,无需知道数据被拆分了,也无需知道服务端哪个分片对应哪些数据。数据在分片之前需要运行一个路由进程,进程名为mongos。这个路由器知道所有数据的存放位置,知道数据和片的对应关系。好吧,的确很神奇。具体可以参考《浅谈MongoDB数据库分布式存储管理》。对于redis,也有类似的集群和分布式解决方案,比如Redis Sharding(应用时间较长)和Redis Cluster(redis3.0推出的官方解决方案),参考知乎的这个回答

  2)介于关系数据库和非关系数据库。

    关系型数据库是指mongodb有着类似于传统关系型数据库的组织结构。参考下面的对比:

    RDBMS:  数据库(DATABASE) ==》 表(TABLE) ==》 行(ROW) ==>  列(COLUMN)==》 表联合(TABLE JOI) ==>主键(PRIMARYKEY)

    MONGODB:数据库(DATABASE) ==》 集合(COLLECTION) ==》 文档(DOCUMENT) ==>  字段(FIELD) ==》内嵌文档(embeded docment) ==>主键.key为_id(PRIMARYKEY)

    我们可以用类似于sql语句中的增删改查的语句去操作mongodb,虽然有些麻烦,但还是可以很快上手的。

    另一方面。mongodb也是一个非关系型数据库。mongodb其实没有严格意义的行和列,而是将数据存储成文档。数据结构由键值(key=>value)对组成,MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

结构

  

  1. MongoDB在数据存储上按命名空间来划分,一个collection是一个命名空间,一个索引也是一个命名空间
  2. 同一个命名空间的数据被分成很多个Extent,Extent之间使用双向链表连接
  3. 在每一个Extent中,保存了具体每一行的数据,这些数据也是通过双向链接连接的
  4. 每一行数据存储空间不仅包括数据占用空间,还可能包含一部分附加空间,这使得在数据update变大后可以不移动位置
  5. 索引以BTree结构实现

存储策略

  以上是mongodb3.0的数据存储模型。mongodb3.0开始支持WiredTiger存储引擎,In-Memory引擎也支持不过是企业级别需要收费。以下图标做个对比:

  可以看到WiredTiger数据引擎,支持文档级锁(多个客户端可以并发的修改一个集合中多个不同的文档),提高了并发性。

  对于持久化,WiredTiger的做法是:在一个操作开始时,WiredTiger会拷贝该时间点的事务数据快照(snapshot)。快照表示的是内存中数据的一份一致性的视图。WiredTiger也会以数据一致的方式将快照中的所有数据写到磁盘所有数据文件中,并且记录一个检查点(checkpoint),这个检查点还可以扮演恢复点(recovery points)的角色,当MongoDB崩溃重启后,MongoDB可以从最后有效的检查点进行恢复。

  众所周知,mongodb的一大优势就是可以使用磁盘来存储数据。那么mongodb和操作系统,磁盘的数据交换机制是怎样的呢?参考这篇文章得到答案。虽然介绍的是MMAP存储引擎的机制。但也大同小异。利用操作系统的内存映射,映射到一个虚拟内存的区域。虚拟内存再对应物理内存,如果访问的数据不在物理内存中,则将数据从磁盘加载到物理内存中。

  • 有了内存映射文件,要访问的数据就好像都在内存里面,简单化了MongoDB访问和修改数据的逻辑
  • MongoDB读写都只是和虚拟内存打交道,剩下都交给OS打理
  • MongoDB占用内存比redis高,一般适合大数据量存储

  

优缺点

   优点:

  •  类似于传统数据库的数据访问方式,支持索引,数据组织更加灵活;
  •  官方提供了分片和主从复制的相关解决方案,使得在设置集群服务器方面更有优势;
  •  适合大数据量存储,依赖系统虚拟内存,采用镜像文件存储;内存占用率比较高;
  • 内置数据分析功能(mapreduce)

   缺点:

  •  访问的QPS不及redis;
  • 不支持事务;
  • 3.0版本以下,不要长时间占用写锁,会导致锁表。(3.0以上版本采用WiredTiger存储引擎,据说是document锁,不知道性能如何)。  

总结

  以上,只是我初次使用mongodb的一点学习总结,很多地方不完善,原理也不是很透彻,甚至不少是直接引用网上别人的文章语句。但我觉得,这也是一个自己学习思考的过程,有必要记录下来。毕竟信息爆炸的时代,不是每个人都有时间和有必要去重读官方文档和深入了解细节,毕竟自己的理解还没有到达那个高度,容易掉入纸上谈兵的陷阱。在以后具体项目用到的时候再进行学习和总结也会更加的深刻一些。

  

参考文档:

MongoDB架构图解

MongoDB数据服务的逻辑结构

MongoDB如何存储数据

Mongodb Wiredtiger存储引擎实现原理

mongodb初步使用体验的更多相关文章

  1. Github 的注册教程和初步使用体验

    我叫许晴,是网工143的学生,学号是1413042064,兴趣包括手绘,看书和手游.学习过c++和汇编语言课程,但在编程方面没什么独立实践经验. 我的Githup用户名是 XQ123 .下面是我在gi ...

  2. mongodb初步使用

    下载安装: 下载MongoDB:http://www.mongodb.org/. 安装MongoDB:傻瓜式安装 配置: 把bin目录添加到系统环境变量 启动: 打开一个 cmd编辑框,输入: mon ...

  3. MongoDB初步(一)

    1.软件下载:mongodb-win32-x86_64-2008plus-ssl-3.4.1-signed.msi 2.下载补丁:hotfix kb2731284

  4. MongoDB Windows 下安装部署

    下面主要是我在Windows上(Win7)安装.运行.安装Windows服务的笔记,以作备忘. 1.下载 下载地址:http://www.mongodb.org/downloads 从其下载页面就可以 ...

  5. MongoDB 走马观花(全面解读篇)

    目录 一.简介 二.基本模型 BSON 数据类型 分布式ID 三.操作语法 四.索引 索引特性 索引分类 索引评估.调优 五.集群 分片机制 副本集 六.事务与一致性 一致性 小结 一.简介 Mong ...

  6. 了解 MongoDB 看这一篇就够了【华为云技术分享】

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...

  7. 了解 MongoDB 看这一篇就够了【华为云分享】

    目录 一.简介 二.基本模型 BSON 数据类型 分布式ID 三.操作语法 四.索引 索引特性 索引分类 索引评估.调优 五.集群 分片机制 副本集 六.事务与一致性 一致性 小结 一.简介 Mong ...

  8. [ASP.NET Core 3框架揭秘] 跨平台开发体验: Windows [下篇]

    由于ASP.NET Core框架在本质上就是由服务器和中间件构建的消息处理管道,所以在它上面构建的应用开发框架都是建立在某种类型的中间件上,整个ASP.NET Core MVC开发框架就是建立在用来实 ...

  9. react-redux学习初步总结

    1.index.js文件中需要引入 a.React(把jsx编译到js需要调用一个函数, 这个函数在React叫React.createElement. 解答地址:https://segmentfau ...

随机推荐

  1. SQLite的时间差判断--删除N天前的数据的两种写法

    比如我有个用SQLite Studio创建的Sqlite3类型数据库,里面有个表名为StatisticsData的表结构是 : -- 表:StatisticsData CREATE TABLE &qu ...

  2. 20190408Linux权限管理week1_day5

    权限概述 Linux系统一般将文件可存/取访问的身份分为3个类别:owner(拥有者).group(和所有者同组的用户).others(其他人,除了所有者,除了同组的用户以及除了超级管理员),且3种身 ...

  3. pyCharm的第一个项目

    首先打开编译器pyCharm 创建一个项目 在location :新建文件夹 在interpreter:指定python解释器的路径 python解释器下载官网: https://www.python ...

  4. Redis学习-string数据类型

    Redis 是一个开源的使用 ANSI C 语言编写.支持网络.可基于内存亦可持久化的日志 型.Key-Value 数据库. redis提供五种数据类型string,hash,list,set及sor ...

  5. 2015全国大学生数学建模B题浅谈

    题目请自主上网获取. 分析下思路.第一问,不同时空的出租车的“供求匹配”程度. 也就是说要选取的数据要有时间和地理两个维度.实体对象是出租车.关键的问题就是地点怎么选? 选择的城市具备如下经济较发达, ...

  6. 详解 Nginx如何配置Web服务器

    概述 在高层次上,将NGINX配置作为Web服务器有一些问题需要了解,定义它处理哪些URL以及如何处理这些URL上的资源的HTTP请求. 在较低层次上,配置定义了一组控制对特定域或IP地址的请求的处理 ...

  7. POJ 1038 Bugs Integrated, Inc.(DFS + 三进制状压 + 滚动数组 思维)题解

    题意:n*m方格,有些格子有黑点,问你最多裁处几张2 * 3(3 * 2)的无黑点格子. 思路:我们放置2 * 3格子时可以把状态压缩到三进制: 关于状压:POJ-1038 Bugs Integrat ...

  8. Jenkins安装及配置

    Jenkins 简介 Jenkins 是一个开源项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能.它的功能包括: 1.持续的 ...

  9. QT 设置应用程序名称和主窗口标题

    1.设置应用程序名称 在工程文件.pro文件中,修改Target为想设置的名称 TARGET = MXEditer 2.设置主窗口标题,在main文件中,我的主窗口是MainWindow. int m ...

  10. Java对象的访问方式

    之前写过一篇随笔 https://www.cnblogs.com/qianjinyan/p/10352749.html 现在看看,貌似不是很准确,方法区和栈应当区分开来,两者有很大的区别 看下面的一个 ...