zoukankan      html  css  js  c++  java
  • 文档型数据库Mongodb

    MongoDB介绍

       MongoDB是一个开源、高性能、基于分布式文件存储的文档型数据库,是NoSQL数据库产品中的一种,采用了BSON这种数据存储格式就是用于简化开发和方便扩展。是最像关系型数据库(MySQL)的非关系型数据库。

       

    关系型数据库和NoSql数据库对比

     关系型数据库适合存储结构化数据,如用户的帐号、地址:

      1. 关系型数据库存储的是结构化数据,每一个数据都严格遵守数据表的所规定的格式,数据表中的列代表数据的属性(姓名,地址等)。数据表之间不同的数据还可以通过相同的列进行关联,这也是关系型数据库最大的特点,这些数据通常需要做关联查询,比如join。这时候,关系型数据库就要胜出一筹。

      2. 这些数据的规模、增长的速度通常是可以预期的。

      3. 事务性、一致性。

       NoSQL适合存储非结构化数据,如文章、评论:

      1. 这些数据通常用于模糊处理,如全文搜索、机器学习。

      2. 这些数据是海量的,而且增长的速度是难以预期的。

      3. 根据数据的特点,NoSQL数据库通常具有无限(至少接近)伸缩性。

      4. 按key获取数据效率很高,但是对join或其它结构化查询的支持就比较差

       和传统关系型数据库(比如MYSQL)对比,MongoDB有下面的应对优势。

      1. High performance:对数据库高并发读写。

      2. Huge Storage:对海量数据的高效率存储和访问。

      3. High Scalability && High Availability :对数据的高可扩展性和高可用性。

    MongoDB应用场景

      1. 日志存储:因为mongodb本身存的就是json,可以很方便的接入各种存储日志的地方。然后可以做成相关监控报表。

      2. 大数据方面:mongodb自带sharding,快速得水平扩展,为存储海量数据带来便捷。官方提供驱动,可以直接对接hadoop或者spark。

      3. 社交场景:使用mongodb可以存储用户信息,以及用户发表的朋友圈这种信息,可以通过地理位置索引来实现附近的人,地点等功能。

      4. 游戏场景:可以存储用户相关信息,比如用户的装备,积分等直接以内嵌文档等形式存储,方便查询,高效率存储和访问。

    MongoDB体系结构

      MongoDB 的逻辑结构是主要由:文档(document)、集合(collection)和数据库(database)这三部分组成的。

      MongoDB 的文档(document),相当于关系数据库中的一行记录,集合(collection), 相当于关系型数据库中的表的概念。

    MongoDB存储格式

      MongoDB存储格式:BSON格式。

        BSON是由10gen开发的一个数据格式,目前主要用于MongoDB中,是MongoDB的数据存储格式。BSON基于JSON格式,选择JSON进行改造的原因主要是JSON的通用性及JSON的schemaless的特性。 二进制的JSON,JSON文档的二进制编码存储格式BSON有JSON没有的Date和BinDataMongoDB中document以BSON形式存放。

    MongoDB与Redis对比

      MongoDB和Redis都是NoSQL,采用结构型数据存储。二者在使用场景中,存在一定的区别,这也主要由于二者在内存映射的处理过程,持久化的处理方法不同。MongoDB建议集群部署,更多的考虑到集群方案,Redis
    更偏重于进程顺序写入,虽然支持集群,也仅限于主-从模式。

    指标 MongoDBRedis比较说明
    实现语言  C++ C/C++ 采用C语言,性能都很高
    协议 BSON、自定义二进制 类Telnet -
    性能 依赖内存,TPS较高 依赖内存,TPS非常高 Redis优于MongoDB
    可操作性 丰富的数据表达、索引;最类似于关系数据库,支持丰富的查询语言 数据丰富,较少的IO MongoDB优于Redis
    内存及存储 适合大数据量存储,依赖系统虚拟内存管理,采用镜像文件存储;内存占有率比较高,官方建议独立部署在64位系统(32位有最大2.5G文件限制,64位没有改限制) Redis2.0后增加虚拟内存特性,突破物理内存限制;数据可以设置时效性,类似于memcache 不同的应用角度看,各有优势
    可用性 支持master-slave,replicaset(内部采用paxos选举算法,自动故障恢复),auto sharding机制,对客户端屏蔽了故障转移和切分机制 依赖客户端来实现分布式读写;主从复制时,每次从节点重新连接主节点都要依赖整个快照,无增量复制;不支持自动sharding,需要依赖程序设定一致hash机制 MongoDB优于Redis;单点问题上,MongoDB应用简单,相对用户透明,Redis比较复杂,需要客户端主动解决。(MongoDB 一般会使用replica sets和sharding功能结合,replica sets侧重高可用性及高可靠性,而sharding侧重于性能、易扩展)
    可靠性 从1.8版本后,采用binlog方式(MySQL同样采用该方式)支持持久化,增加可靠性 依赖快照进行持久化;AOF增强可靠性;增强可靠性的同时,影响访问性能 MongoDB优于Redis
    一致性 不支持事物,靠客户端自身保证 支持事物,比较弱,仅能保证事物中的操作按顺序执行 Redis优于MongoDB
    数据分析 内置数据分析功能(mapreduce) 不支持 MongoDB优于Redis
    应用场景 海量数据的访问效率提升 较小数据量的性能及运算 MongoDB优于

    MongoDB和Redis的区别是什么

      1、内存管理机制

        Redis 数据全部存在内存,定期写入磁盘,当内存不够时,可以选择指定的 LRU 算法删除数据。

        MongoDB 数据存在内存,由 linux系统 mmap 实现,当内存不够时,只将热点数据放入内存,其他数据存在磁盘。

      2、支持的数据结构

        Redis 支持的数据结构丰富,包括hash、set、list等。

        MongoDB 数据结构比较单一,但是支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富。

      3、数据量和性能:

        当物理内存够用的时候,redis>mongodb>mysql

        当物理内存不够用的时候,redis和mongodb都会使用虚拟内存。

        实际上如果redis要开始虚拟内存,那很明显要么加内存条,要么你换个数据库了。

        但是,mongodb不一样,只要,业务上能保证,冷热数据的读写比,使得热数据在物理内存中,mmap的交换较少。

        mongodb还是能够保证性能。

      4、性能

        mongodb依赖内存,TPS较高;Redis依赖内存,TPS非常高。性能上Redis优于MongoDB。

      5、可靠性

        mongodb从1.8版本后,采用binlog方式(MySQL同样采用该方式)支持持久化,增加可靠性;  

        Redis依赖快照进行持久化;AOF增强可靠性;增强可靠性的同时,影响访问性能。

        可靠性上MongoDB优于Redis。

      6、数据分析

        mongodb内置数据分析功能(mapreduce);而Redis不支持。

      7、事务支持情况

        Redis 事务支持比较弱,只能保证事务中的每个操作连续执行;mongodb不支持事务。

      8、集群

        MongoDB 集群技术比较成熟,Redis从3.0开始支持集群。

    MongoDB安装

         MongoDB官网:https://www.mongodb.com/

        1. 普通安装

         

        从官网下载前时候得先注册下。

          安装

    1. 下载文件 mongodb-osx-ssl-x86_64-4.0.18.tgz
    2. 解压缩 tar -zxvf mongodb-osx-ssl-x86_64-4.0.18.tgz
    3. 重命名为mongodb目录 mv mongodb-osx-ssl-x86_64-4.0.18.tgz/ mongodb
    4. 添加到环境变量 export PATH=/usr/local/mongodb/bin:$PATH

       验证是否成功  mongo -version

       

      通过命令帮助mongod --help查看默认数据存储目录

      

       创建挂载数据目录:sudo mkdir -p data/db (注意:需要给目录相应的操作权限)

       启动mongodb:sudo mongd

       启动后这里会多了一些文件

      

       进入mongodb shell :输入命令mongo就可以进入mongodb命令行中,如下图

      

      关闭mongo进程: sudo kill mongod进程pid

       

      2. docker安装mongodb

         MongoDB docker镜像地址:  https://hub.docker.com/_/mongo

        下面是安装步骤

    1. 下载mongodb官方docker镜像
        docker pull mongo:4
    2. 查看下载好的镜像
        docker images | grep mongo
        mongo             4         3f3daf863757        3 days ago         388MB
    3. 启动一个mongodb服务器容器
        docker run --name mymongodb -v /data:/data/db -d mongo:4
      docker run --name mymongodb -v mongodata:/data/db  -d mongo:4
      说明:
      #1. --name mymongodb设置容器的名称mymongodb
      #2. -v mongodata:/data/db挂载数据目录到/data/db目录下
      #3. -d以后台方式运行容器
      ce54aea1d8e10c9a73457560a0dbc3b22a6402b4d287fe7e7e011193fabe0e44 #看到这个说明命令执行成功,得到容器id

     上面第三步在Mac系统下会有个问题,data目录docker不能识别,将data添加到docker共享目录即可。

    4. 查看容器状态
    docker ps 
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    235d9f8ac861        mongo:4             "docker-entrypoint.s…"   7 minutes ago       Up 7 minutes        27017/tcp           mymongodb
    
    5. 查看数据库服务器日志
    docker logs mymongodb
     NETWORK  [listener] Listening on /tmp/mongodb-27017.sock
    2020-04-28T10:45:26.786+0000 I  NETWORK  [listener] Listening on 0.0.0.0
    2020-04-28T10:45:26.786+0000 I  NETWORK  [listener] waiting for connections on port 27017  #mongodb默认监听端口是27017

    MongoDB图形化界面(Mongo Express)安装

    #下载mongo-express 镜像
    docker pull mongo-express 
    
    #运行mongo-express 
    docker run --link mymongodb:mongo -p 8081:8081 mongo-express

    运行命令结束之后,打开浏览器输入localhost:8081可以看到Mongo Express的界面。

      

       界面说明:

        1. Database:三个默认的数据库,这里面保存的都行系统相关配置信息。不建议修改里面的内容。点击local查看startup_log(下图),里面存放的是一些MongoDB启动时候的记录信息。

           

        2. Server Status。

    MongoDB监控

       MongoDB中提供了mongostat 和 mongotop 两个命令来监控MongoDB的运行情况。

       1. mongostat 命令

        mongostat是mongodb自带的状态检测工具,在命令行下使用。它会间隔固定时间获取mongodb的当前运行状态,并输出。如果你发现数据库突然变慢或者有其他问题的话,你第一手的操作就考虑采用mongostat来查看mongo的状态。

         启动你的Mongod服务,进入到你安装的MongoDB目录下的bin目录, 然后输入mongostat命令,如下所示:

        

       2. mongotop 命令

        mongotop也是mongodb下的一个内置工具,mongotop提供了一个方法,用来跟踪一个MongoDB的实例,查看哪些大量的时间花费在读取和写入数据。 mongotop提供每个集合的水平的统计数据。默认情况下,mongotop返回值的每一秒。

        启动你的Mongod服务,进入到你安装的MongoDB目录下的bin目录, 然后输入mongotop命令,如下所示:

       

     MongoDB底层原理

       MongoDB 的架构与 MySQL 非常类似,它们底层都使用了可插拔的存储引擎以满足用户的不同需求。mongodb 3.0默认存储引擎为MMAPV1,还有一个引擎wiredTiger可选,可以提高一定的性能。

    参考资料

      https://www.runoob.com/mongodb/mongodb-mongostat-mongotop.html

         https://www.runoob.com/docker/docker-install-mongodb.html

      https://blog.csdn.net/qq506930427/article/details/99658808


  • 相关阅读:
    <<< Tomcat运行报错IOException while loading persisted sessions: java.io.EOFException
    <<< Tomcat 部署项目There are no resources that can be added or removed from the server
    <<< tomcat启动报错StandardServer.await: create[8005]
    【LeetCode】最接近的三数之和【排序,固定k1,二分寻找k2和k3】
    【LeetCode】三数之和【排序,固定一个数,然后双指针寻找另外两个数】
    【LeetCode】最长公共前缀【二分】
    【LeetCode】盛最多水的容器【双指针+贪心 寻找最大面积】
    【LeetCode】整数反转【不能借助辅助空间,需要处理溢出】
    【LeetCode】最长回文子串【动态规划或中心扩展】
    【LeetCode】寻找两个有序数组的中位数【性质分析+二分】
  • 原文地址:https://www.cnblogs.com/songgj/p/8471761.html
Copyright © 2011-2022 走看看