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和BinData,MongoDB中document以BSON形式存放。
MongoDB与Redis对比
MongoDB和Redis都是NoSQL,采用结构型数据存储。二者在使用场景中,存在一定的区别,这也主要由于二者在内存映射的处理过程,持久化的处理方法不同。MongoDB建议集群部署,更多的考虑到集群方案,Redis
更偏重于进程顺序写入,虽然支持集群,也仅限于主-从模式。
指标 | MongoDB | Redis | 比较说明 |
---|---|---|---|
实现语言 | 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