3

初闻MongoDB(一)、从零带你了解MongoDB的前世今生

 3 years ago
source link: https://leishen6.github.io/2020/11/29/mongodb_one/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
20201129150452.png

最近在看MongoDB相关知识,刚开始听到MongoDB时,一脸懵圈,这是个啥子数据库呀 。

20201127133906.gif

但是通过学习后,发现这个数据库挺牛掰的呀;嘿嘿 。。。。

下面就带大家一起聊聊这个数据库 ,看看它到底有什么牛掰之处 。

本文主线:

①、MongoDB 简介

②、MongoDB支持的功能有哪些?

③、MongoDB的存储引擎简述

④、MongoDB知识扩展

MongoDB 简介:

MongnDB是一个 分布式文件存储数据库 (或叫文档数据库);

MongoDB是一个介于 关系数据库和非关系数据库 之间的产品,是非关系数据库当中功能最丰富,最像关系数据库,最接近关系型数据库的。

20201128182359.png

MongoDB的数据逻辑结构:

首先说下 MongoDB 的数据逻辑层次: 数据库(database)、集合(collection)、文档(document)

MongoDB数据逻辑层次的关系如下图:

20201128182744.png

MongoDB与关系数据库的数据逻辑结构比较:

20201127120442.png

通过上图可以知道MongoDB和关系数据库之间的数据逻辑结构对应关系了吧,再来将关系对应一下子:

数据库 ------ 数据库 、 Table表 ------ Collection集合 、 Row 行记录 ------ Document 文档

下面咱来聊聊上图Document文档中 { "name" : "lyl", "age" : 25} 看起来跟 JSON 格式一样的数据到底是个什么东东?

MongoDB中文档的数据存储结构:

MongoDB的文件数据存储结构是 BSON ;Bson是 Binary JSON 缩写,是类似于JSON的文档的二进制编码序列化。

Bson的特点:

  • 轻量性

  • 可遍历性

  • 高效性

来再具体看看MongoDB的Bson格式文档数据到底长神魔样呢?

20201128173842.png

通过上图我们对MongoDB整体有了一个基本的了解,接下来我们在简单聊聊它到底有哪些功能呢?看看它到底支持了什么 牛掰 的功能让它一直这么火。

MongoDB支持的功能:

咱先贴一张摘抄自网上的大图:描述MongoDB的主要特性;

20201128191128.png

除了支持上文的特性外,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 这三种存储引擎,更加清晰的明确多种存储引擎之间的区别。

点击看大图:

20201127110209.png

注意:当各位大大阅读本文时,请一定要结合自己使用的 MongoDB的版本 ,因为不同版本支持的功能可能是不同的,确认好自己使用的版本是否支持想要的功能。

MongoDB 知识扩展:

为什么很吃内存?

在使用MongoDB数据库的时候,发现安装了MongoDB的服务器可用内存一直在减少,通过查找发现MongoDB在使用时一直在不断的吃内存,MongoDB占用的内存的越来越多。

为什么MongoDB这么占用内存呢?

下面简单从两方面说下:

  1. 通过上面的存储引擎的描述可以知道,例如 : WiredTiger存储引擎的写操作会先写入Cache中,将数据保存在内存中,然后再通过机制将内存中的数据落盘,但是最终内存中的数据还是会保留下来的,只是会将已经落盘的数据坐下标记。

  2. 当大量并发请求MongoDB数据库时,它使用的内存也会上涨;因为在并发连接比较多时,会大量创建处理连接的线程,这些线程也会占用内存的;除此之外,建立好连接后,处理连接中传输的数据包,这些数据包的存储也需要占用内存的;但是这种占用的内存会在请求下降后,慢慢的将内存释放的。

如何控制内存的使用:

下面简单在两方面聊下怎么控制MongoDB对内存的使用,希望别再触发服务器内存耗尽的告警了。

  1. 合理配置 WiredTiger cacheSizeGB 参数:
    • 如果一台机器上只部署 MongoDB,MongoDB可以使用所有可用内存,则是用默认配置即可。

    • 如果一台机器上不止部署了MongoDB,还运行一些其他的进程服务,则需要根据分给MongoDB的内存配额来配置 cacheSizeGB ,也可按配额的60%左右配置。

  2. 控制对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技术文章,福利多多哟!

还有大家如果想看系列后续的文章话,请多多点赞评论呀,你们的支持就是我不断创作的动力!

20201127105439.png

参考资料:

①、 MongoDB中文手册|官方文档中文版

②、 MongoDB 入门篇

③、 MongoDB存储引擎(中)——WiredTiger

- END -


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK