MongoDB实现---存储机制

news2024/11/28 2:49:00

储存

GridFS机制

  • GridFS:将大文件分隔成多个小文档存放,这样我们能够有效的保存大文档,而且解决了BSON对象有限制的问题
  • 通过两个集合实现:两个集合分别存储存储实际数据和存储文件的元数据
    • 元数据文件:记录包括文档的id、长度、分块大小(每块默认大小为256k)、数据文件的md5值等;
    • 数据文件每一块作为一个单独的文档来存储

实现介绍

  • GridFS会将两个集合放在一个普通的buket中,并且这两个集合使用buket的名字作为前缀。默认使用fs命名的buket存放两个文件集合。元数据集合fs.files ,数据文件fs.chunks
    • 在这里插入图片描述
  • MongoDB为了提高检索速度 MongoDB为GridFS的两个集合建立了索引fs.files集合使用是filename与uploadDate字段作为唯一、复合索引fs.chunk集合使用的是files_id与n字段作为唯一、复合索引。
  • 实现方式:先保存数据文件,再构建元数据文件;
    • 上传文件过程中是先把文件数据保存到fs.chunks,最后再把文件信息保存到fs.files中,所以如果在上传文件过程中失败,有可能在fs.chunks中出现垃圾数据。这些垃圾数据可以定期清理掉。
    • 如果文件大于chunksize,则把文件分割成多个chunk,再把这些chunk保存到fs.chunks中,最后再把文件信息存入到fs.files中。

fs.file

  • 在这里插入图片描述
  • _id:当前文档id(即chuck集合的files_id)

fs.chuck

  • img
  • n:为片位移(初始为0)
  • id:当前文档Object_id
  • file_id:父fs文档的id
  • data:数据域

文件保存

组织形式

文档数据库最重要的是快速定位文档,包括:找到集合中文档的初始位置、找到集合中对应的文档,为此MongoDB通过命名空间的概念快速定位集合

img
  • namespace(命名空间):数据库名.集合名;
    • MongoDB的命名空间可以快速定位集合中的文档可能的位置;保存在mydb.ns;
    • ns文件通过hash表保存、通过线性探测解决冲突
    • 每个节点大小为628Bytes,节点有三部分组成:hashcode、key(命名空间)和value(节点元数据)
      • **节点元数据:记录了头尾文档位置(DiskLoc:数据文件编号和位偏移);**数据文件使用mmap映射到内存空间进行管理;
  • 数据文件
    • 每个数据文件包含一个固定长度头部DataFileHeader
    • 记录数据文件版本、文件大小未使用空间位置及长度空闲extent链表起始及结束位置。extent被回收时,就会放到数据文件对应的空闲extent链表里。
  • event
    • 每个数据文件被划分成多个extent同一个namespace的所有extent之间以双向链表形式组织。
    • 每个extent包含多个Record(对应mongodb的document),同一个extent下的所有record以双向链表形式组织。

总结

  • 数据文件的分配:类似操作系统的分页系统的分配方式
    • 数据文件就像是应用的内存,extent就是块(操作系统是物理分块、逻辑分页实现分页存储的)
      • 为了避免数据文件碎片化,MongoDB使用激进的预分配策略;
    • 每个extent大小固定,可以保存一系列的文档数据
      • 操作系统中:也大小一致,页内分配数据;
    • 通过位偏移计算event位置
      • 操作系统:通过页表的地址变换计算位置
    • 通过空闲分区表记录空闲分区
  • extent内部:是动态分区分配(即文档/记录大小不一致)
    • 有足够的内存直接在event内分配;否则将申请新的固定分区分配的的新event;
    • 通过空闲分区表记录可用的分区,通过最佳分配进行分配。(所以会有很大可能产生碎片)
    • 当删除很多时,可能产生很多不能重复利用的"存储碎片",从而导致存储空间大量浪费;
      • 操作系统通过紧凑的方式进行内存压缩回收,
      • MongoDB通过对集合进行compact来整理存储碎片。
    • 当进行更新时:
      • 更新的文档比原来小,可以直接复用现有的空间(原地更新);多余的空间如果足够多,会将剩余空间插入到DeletedRecord链表;
      • 更新的文档比原来大,更新相当于删除 + 新写入;
  • namespace:快速定位集合的文档,加上索引将快速查找集合指定文档;如果没有索引将需要遍历集合所有记录;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/423413.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一篇文章搞定《动手学深度学习》-(李沐)PyTorch版本的所有内容

目录 目录 简介 阅读指南 1. 深度学习简介 2. 预备知识 3. 深度学习基础 4. 深度学习计算 5. 卷积神经网络 6. 循环神经网络 7. 优化算法 8. 计算性能 9. 计算机视觉 10. 自然语言处理 环境 参考(大家可以在这里下载代码) 原书地址&#…

四结(4.13)多线程学习

今天又进行了一次学长授课,关于MySQL和JDBC本来学了增删查改操作,用IDEA也可以操作数据库,今天讲了一些数据库的规范(三大范式)、以及er图。了解了一下项目。 项目要分为客户端和服务端(C/S)来写…

vue面试题2023

1.$route和$router的区别? routes : 数组。 路由匹配规则 router : 对象。 路由对象 $router : 对象。 用于跳转路由 和 传递参数 $route :对象。 用于接收路由跳转参数 1.Vue的生命周期方法有哪些? - beforeCreate 初始化实…

科技云报道:“云减碳”成趋势,如何用“计算”帮助企业碳减排?

科技云报道原创。 将数据中心“丢进”水里、“扔进”山里,使用风能、太阳能等清洁能源为数据中心供电……这些都是通过物理方法为数据中心减碳。 数据中心的重要工作在于计算,计算导致了能源消耗,使其成为耗能大户,而通过云计算…

基于imx8m plus开发板全体系开发教程1:Windows/Linux 开发环境配置(连载中)

前言: i.MX8M Plus 开发板是一款拥有 4 个 Cortex-A53 核心,运行频率 1.8GHz;1 个 Cortex-M7 核心,运行频率 800MHz;此外还集成了一个 2.3 TOPS 的 NPU,大大加速机器学习推理。 全文所使用的开发平台均为与NXP官方合作的FS-IMX8…

Terraform 系列-什么是 IaC?

系列文章 👉 Terraform 系列文章 前言 聊到 Terraform, 必然绕不开 IaC 这个概念?那么,什么是 IaC? 🤔 基本概念 基础架构即代码 (Infrastructure as Code, IaC) 是指通过代码而不是手动流程/控制台点击来管理和配置基础架构…

互联网+制造业:图扑数字孪生智慧工厂车间生产线

前言 随着信息技术、自动化技术和人工智能等技术的快速发展和应用,智能制造已成为全球制造业发展的主流趋势。智能制造是将智能化、自动化、数字化和网络化等技术手段运用到制造过程中,使生产过程具有高度智能化、自动化和数字化的特点,进而…

Linux安装宝塔,并实现公网远程登录宝塔面板【内网穿透】

文章目录前言1. 安装宝塔2. 安装cpolar内网穿透3. 远程访问宝塔4. 固定http地址5. 配置二级子域名6. 测试访问二级子域名转发自CSDN远程穿透的文章:Linux安装宝塔,并实现公网远程登录宝塔面板【内网穿透】 前言 宝塔面板作为建站运维工具,它…

网络编程2(套接字编程)

套接字编程UDP协议通信:TCP通信:套接字编程:如何编写一个网络通信程序 1.网络通信的数据中都会包含一个完整的五元组: sip,sport,dip,dport,protocol(源IP,源…

计算机组成原理——第三章存储系统(上)

提示:吾与春风皆过客,君携秋水揽星河 文章目录前言3.1 存储系统基本概念3.2.1 主存储器的基本组成3.2.2 SRAM DRAM\3.2.3 只读存储器ROM3.3.1 主存储器与CPU的连接3.3.2 双端口RAM和多模块存储器前言 提示:以下是本篇文章正文内容&#xff0c…

带你理解运算放大器

复习一下电子设计基本元器件,运算放大器 ...... 矜辰所致目录前言一、运放基本说明1.1 基本认识1.2 运放中的电流1.3 运放工作特性二、负反馈2.1 什么是负反馈?2.2 为什么要引入负反馈?负反馈电路分析2.3 正反馈三、提一下虚短与虚断结语前…

MAX14808 八通道3级电平 数字脉冲发生器

MAX14808八通道3级电平 高压(HV) 脉冲发生器,利用低压控制逻辑输入产生高频、高压双极性脉冲(高达105V) ,用于驱动超声系统的压电传感器,MAX14808有八个集成的发送/接收(T/R)开关。 应用 超声医疗成像工业探伤检测压电驱动器测试设备 芯片…

RocketMQ 是是如何管理消费进度的?又是如何保证消息成功消费的?

RocketMQ 消费者保障 作者: 博学谷狂野架构师GitHub:GitHub 地址 (有我精心准备的 130 本电子书 PDF)只分享干货、不吹水,让我们一起加油!😄 消息确认机制 consumer 的每个实例是靠队列分配来决定如何消费消…

五、MyBatis各种查询功能

MyBatis的各种查询功能 如果查询出的数据只有一条,可以通过 实体类对象接收List集合接收Map集合接收 如果查询出的数据有多条,一定不能用实体对象接收,会抛TooManyResultsException,可以通过 实体类类型的List集合接收Map类型的L…

Python爬虫自动化从入门到精通第10天(Scrapy框架的基本使用)

Scrapy框架的基本使用Scrapy框架简介Scrapy框架的运作流程安装Scrapy框架Scrapy框架的基本操作Scrapy常用命令Scrapy框架简介 Scrapy框架主要包含以下组件: Scrapy Engine(引擎):负责Spiders、Item Pipeline、Downloader、Scheduler之间的通信&#xf…

手把手教你安装Visual Studio 2019(史上最全)

前言: 本文是以Visual Studio Community 2019为例子,介绍如何在微软官网下载Visual Studio Community 2019并安装.net桌面开发程序环境(主要是winform开发环境)。 下载请点击这里Visual Studio Community 2019下载,然后点击下图的箭头的DownLoad下载,要注意的是下载时要…

微信自定义菜单

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目…

全链路压测时动态路由数据源MySQL、MongoDB、Redis

目录 一、全链路压测 二、动态路由Mysql 1. 参数配置application-localDynamic.yml 2. 加载配置参数DynamicDataSourceProperties.java 3. 动态数据源DynamicDataSource.java 4. 动态数据源供应DynamicDataSourceProvider.java 5. 动态数据源bean 6. 动态数据源上下文D…

PWN-ret2shellcode原理

我们之前做过很简单的pwn题目 buuctf-rip这种 是在程序中存在shellcode 直接返回地址改为这个shellcode的地址即可 但是如果程序里面没有呢 这种类型就是ret2shellcode 常见的shellcode shellcode "\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5…

一起读源码 —— Fastjson 的核心方法及其实现原理

源码介绍 Fastjson 是阿里巴巴开源的一个 Java 工具库,它常常被用来完成 Java 的对象与 JSON 格式的字符串的相互转化。 此文读的源码是撰写此文时 Fastjson 的最新的发布版本,即 1.2.83 下载源码 请前去 github 找到 release 最新版下载后解压&…