前言:
最近在看MongoDB相关知识,刚开始听到MongoDB时,一脸懵圈,这是个啥子数据库呀 。html
可是经过学习后,发现这个数据库挺牛掰的呀;嘿嘿 。。。。java
下面就带你们一块儿聊聊这个数据库 ,看看它到底有什么牛掰之处 。数据库
本文主线:
①、MongoDB 简介缓存
②、MongoDB支持的功能有哪些?安全
③、MongoDB的存储引擎简述服务器
④、MongoDB知识扩展并发
MongoDB 简介:
MongnDB是一个 分布式文件存储数据库 (或叫文档数据库);app
MongoDB是一个介于 关系数据库和非关系数据库 之间的产品,是非关系数据库当中功能最丰富,最像关系数据库,最接近关系型数据库的。分布式
MongoDB的数据逻辑结构:
首先说下 MongoDB 的数据逻辑层次: 数据库(database)、集合(collection)、文档(document) 。函数
MongoDB数据逻辑层次的关系以下图:
MongoDB与关系数据库的数据逻辑结构比较:
经过上图能够知道MongoDB和关系数据库之间的数据逻辑结构对应关系了吧,再来将关系对应一会儿:
数据库 ------ 数据库 、 Table表 ------ Collection集合 、 Row 行记录 ------ Document 文档
下面咱来聊聊上图Document文档中 { "name" : "lyl", "age" : 25} 看起来跟 JSON 格式同样的数据究竟是个什么东东?
MongoDB中文档的数据存储结构:
MongoDB的文件数据存储结构是 BSON ;Bson是 Binary JSON 缩写,是相似于JSON的文档的二进制编码序列化。
Bson的特色:
- 轻量性
- 可遍历性
- 高效性
来再具体看看MongoDB的Bson格式文档数据到底长神魔样呢?
经过上图咱们对MongoDB总体有了一个基本的了解,接下来咱们在简单聊聊它到底有哪些功能呢?看看它到底支持了什么 牛掰 的功能让它一直这么火。
MongoDB支持的功能:
咱先贴一张摘抄自网上的大图:描述MongoDB的主要特性;
除了支持上文的特性外,MongoDB还支持不少强大的功能:
- BSON文档模型:
- 动态的数据模式
- 使用高效的二进制数据存储,包括大型对象(如视频等)。
- 动态查询
- 全文搜索
- 聚合操做:
- 聚合管道
- Map - Reduce
- 单一目的聚合方法
- 水平扩展(高扩展):
- 主从复制(搭建主从复制集群)
- 数据分片(搭建数据分片集群)
- 数据分片 + 主从复制 = 更增强大的集群系统
- 高可用、支持故障恢复
- 支持大文件存储GridFS
- 企业级安全
- 支持强大的索引:
- 单字段索引
- 复核索引
- 多键索引
- 文本索引
- 通配符索引
- 地理位置索引
- 哈希索引
- 索引特性:
- TTL索引
- 惟一索引
- 部分索引
- 稀疏索引
- 索引交集
- 4.0版本支持多文档事务,4.2版本支持分布式事务
- 支持多种存储引擎
- MMAP 存储引擎
- MMAPV1 存储引擎
- WiredTiger存储引擎
- In-Memory 存储引擎
注:上面只是列出的MongoDB主要支持的功能,想要了解具体的每项功能,能够自行去查阅资料昂。
下面来聊聊MongoDB中十分重要的存储引擎,由于存储引擎是MongoDB负责管理数据的主要组件,而且像 事务、并发锁、存储数据的操做等 都是由存储引擎支持的。
MongoDB的存储引擎:
MongoDB支持多种存储引擎,下面我们就简单聊聊MongoDB的这几种存储引擎;
原生存储引擎MMAP:
MMAP 全称为 Memory Mapped Storage Engine,即 内存映射存储引擎 ,在 3.0版本以前 使用的 。
MMAP能够把磁盘文件的一部分或所有内容直接映射到内存,这样文件中的信息位置就会在内存中有对应的地址空间,这时对文件的读写能够直接用指针来作,而不须要read/write函数了,但这并不表明将文件map到物理内存,只有访问到这块数据时才会被操做系统以Page的方式换到物理内存。
在MongoDB的写操做时,先将数据放在内存中,而后再经过顺序IO将数据刷新保存到磁盘上,这样会大大提高写操做性能;而且MongoDB将内存管理工做交给操做系统的虚拟内存管理器来完成,这样也大大简化了MongoDB的工做 。
原生升级 MMAPV1 存储引擎:
在 MongoDB3.0版本时 ,推出了 MMAPV1 存储引擎,这是在原生存储引擎基础上更新升级的新存储引擎 。
在 MMAPV1 存储引擎中有一个很重要的日志文件: journal预写事务日志 ,使用这个日志文件保证数据的持久化,并保证在数据库硬关闭时帮助数据库恢复。
插入式 WiredTiger 存储引擎:
WiredTiger是在 MongoDB3.0版本 引入的,而且在 MongoDB3.2版本 开始成为MongoDB默认的存储引擎。
相比较MMAPv1,WiredTiger存储引擎功能更强大,并且具备更高的性能。
WiredTiger存储引擎中也有 journal预写事务日志 ,用来保证数据持久化及数据库故障时数据恢复 。
In-Memory 存储引擎:
In-Memory存储引擎将数据库数据都存储在 内存 中,只将少许的元数据和诊断日志、临时数据存储到硬盘文件中,避免了磁盘I/O操做,查询速度很快。
若是MongoDB使用 In-Memory 存储引擎的话,是否是很相似于 Redis 内存数据库呢。
存储引擎之间的比较:
下面将经过在各方面比较下 MMAPV1 、WiredTiger 、In-Memory 这三种存储引擎,更加清晰的明确多种存储引擎之间的区别。
点击看大图:
注意:当各位大大阅读本文时,请必定要结合本身使用的 MongoDB的版本 ,由于不一样版本支持的功能多是不一样的,确认好本身使用的版本是否支持想要的功能。
MongoDB 知识扩展:
为何很吃内存?
在使用MongoDB数据库的时候,发现安装了MongoDB的服务器可用内存一直在减小,经过查找发现MongoDB在使用时一直在不断的吃内存,MongoDB占用的内存的愈来愈多。
为何MongoDB这么占用内存呢?
下面简单从两方面说下:
- 经过上面的存储引擎的描述能够知道,例如 : WiredTiger存储引擎的写操做会先写入Cache中,将数据保存在内存中,而后再经过机制将内存中的数据落盘,可是最终内存中的数据仍是会保留下来的,只是会将已经落盘的数据坐下标记。
- 当大量并发请求MongoDB数据库时,它使用的内存也会上涨;由于在并发链接比较多时,会大量建立处理链接的线程,这些线程也会占用内存的;除此以外,创建好链接后,处理链接中传输的数据包,这些数据包的存储也须要占用内存的;可是这种占用的内存会在请求降低后,慢慢的将内存释放的。
如何控制内存的使用:
下面简单在两方面聊下怎么控制MongoDB对内存的使用,但愿别再触发服务器内存耗尽的告警了。
- 合理配置 WiredTiger cacheSizeGB 参数:
- 若是一台机器上只部署 MongoDB,MongoDB可使用全部可用内存,则是用默认配置便可。
- 若是一台机器上不止部署了MongoDB,还运行一些其余的进程服务,则须要根据分给MongoDB的内存配额来配置 cacheSizeGB ,也可按配额的60%左右配置。
- 控制对MongoDB的并发请求数,进行合理的TCP链接数;
MongoDB的应用场景:
根据MongoDB的特性和支持的功能,简单聊聊它适用的应用场景:
- 应用服务器日志存储。
- MongoDB的高性能足够支撑关系型数据库2-3倍以上的TPS/QPS;
- 磁盘数据压缩存储,在进行数据读取时下降磁盘IO的次数,提高数据读取性能;
- 支持功能强大的索引
- 动态的数据模式,不受表结构的限制;
- 地理位置信息存储,经过地理位置索引,能够方便、快速的查询出具体的位置信息。
- 看成缓存数据库,使用其In-Memory 存储引擎;
- 网站实时数据处理;它很是适合实时的插入、更新与查询,并具有网站实时数据存储所需的复制及高度伸缩性。
------end
到此本文就结束了,本文只是和你们聊了聊MongoDB的基础知识,细节部分都没有具体描述,你们若是感兴趣的能够自行去查阅资料。
最后了,再和你们唠叨下, 打算最近写下MongoDB系列文章,系列文章题目都已经想好了,以下:
①、初闻MongoDB(一)、从零带你了解MongoDB的前世此生
②、初识MongoDB(二)、数据库安装及可视化工具的安装使用
③、相识MongoDB(三)、MongoDB经常使用的SQL语句和索引知识
④、相知MongoDB(四)、使用java链接和操做MongoDB数据库
⑤、相爱MongoDB(五)、一文带你了解MongoDB的实战操做使用
♡ 点赞 + 评论 + 转发 哟
您能够VX搜索【木子雷】公众号,坚持高质量原创java技术文章,福利多多哟!
还有你们若是想看系列后续的文章话,请多多点赞评论呀,大家的支持就是我不断创做的动力!