前言

  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. 使用solr进行配置文件

    我现在使用的是一个已经搭建好的solr环境下进行的测试: 第一步,需要配置solrhome中的一个配置文件schema.xml 配置内容如下,上面配置的是IK分词器,下面是配置完成的域. 因为我在这个 ...

  2. JS设计模式(13)状态模式

    什么是状态模式? 定义:将事物内部的每个状态分别封装成类,内部状态改变会产生不同行为. 主要解决:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为. 何时使用:代码中包含大 ...

  3. 使用JS调用手机本地摄像头或者相册图片识别二维码/条形码

    接着昨天的需求,不过这次不依赖微信,使用纯js唤醒手机本地摄像头或者选择手机相册图片,识别其中的二维码或者是条形码.昨天,我使用微信扫一扫识别,效果超棒的.不过如果依赖微信的话,又怎么实现呢,这里介绍 ...

  4. jquery easyui的应用-1

    下载地址是: www.jeasyui.com/download 当前版本是1.6.7 是由 jquery ui 扩展而来的. 像jquery ui, bootstrap, jquery easyui三 ...

  5. Qt信号和槽机制

    概述 信号和槽机制是QT的核心机制,要精通QT编程就必须对信号和槽有所了解.信号和槽是一种高级接口,应用于对象之间的通信,他是QT的核心特性,也是QT差别于其他工具包的重要地方.信号和槽是QT自行定义 ...

  6. Mac配置Hadoop最详细过程

    Mac配置Hadoop最详细过程 原文链接: http://www.cnblogs.com/blog5277/p/8565575.html 原文作者: 博客园-曲高终和寡 https://www.cn ...

  7. Pandas 基础(11) - 用 melt 做格式转换

    melt 也可以用来做数据格式转换, 请看下图, 我们可以用 melt 把左表转成右表的格式: 首先引入文件(已上传): df = pd.read_csv('/Users/rachel/Sites/p ...

  8. Codeforces 792 E. Colored Balls

    题目链接:http://codeforces.com/contest/792/problem/E 假设含球较少的那些堆有 $mi$ 个球,较多的那些堆有$ma$个球,$ma=mi+1$,考虑对于最小的 ...

  9. R 导出pdf设置字体

    主要参考自: https://blog.csdn.net/xmuecor/article/details/51462172 library(showtext)showtext.auto(enable ...

  10. 查看CPU温度

    因为不喜欢鲁大师,所以检索看有没有别的软件. 1)先是找到了aida64, 结果好像是要付费的,就没装. 2)因为自己也就想看cpu温度,于是寻思自己编程解决. 找到了下面的文章. 不但介绍了怎么编程 ...