【PostgreSQL内核学习(十八)—— 存储管理(存储管理的体系结构)】

news2024/9/24 21:21:35

存储管理

  • 概述
    • 存储管理器的体系结构
    • 存储管理器的主要任务
    • 读写元组过程

声明:本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在适用的情况下注明引用来源。
本文主要参考了《PostgresSQL数据库内核分析》一书以及一些相关参考资料

概述

  数据库管理系统(DBMS)的本质是向存储设备上写入数据或者读出数据,因此存储的管理是一项非常基础且重要的技术。在 PostgreSQL 中,存储管理器是专门负责管理存储设备的模块,其提供了一组统一管理外存和内存的功能模块。因此从本质上看,存储管理器提供了 PostgreSQL 与物理存取设备的接口。因为外存对应着各种磁盘设备,而内存则对应着各种随机存储器。存储管理器是整个 PostgreSQL 系统的底层模块,各种需要访问底层硬件的操作都需要调用其提供的接口。数据库存储管理系统的一般组件和功能的描述如下所示:

  1. 缓存管理: 这是数据库系统的核心部分,负责缓存数据页以提高访问速度。它与磁盘存储进行交互,将频繁访问的数据页保存在内存中,以减少直接的磁盘 I/O 操作
  2. 基础存储管理: 这一层处理与磁盘的实际交互,包括数据页的读写。它确保数据能够持久化存储在磁盘上,并在需要时加载到缓存中。
  3. 大对象存储: 数据库中的大对象(如文本或图像)通常需要特殊的存储管理,因为它们的大小通常超过标准数据页的大小。
  4. 内存/日志文件管理: 这部分负责管理事务日志,确保所有的数据库操作都可以在系统故障后进行恢复。日志文件通常存储了所有的事务操作记录。
  5. 数据库备份与恢复: 这部分涉及到的操作包括数据库的备份,以及在数据丢失损坏时的恢复
  6. 空间管理: 数据库需要跟踪磁盘上的可用空间,这通常涉及到文件空间管理FSM)和可见性图VM),以跟踪哪些页是空的,哪些页是可见的
  7. 垃圾回收: 为了优化存储空间和性能,数据库需要定期进行垃圾回收,如 PostgreSQL 中的 VACUUM 操作。这个过程包括清理不再需要的数据,如已删除的行
  8. 可视化文件描述符(VFD): 这可能是指管理文件描述符的组件,这些是操作系统提供的用于引用打开文件的句柄。
  9. 进程间通信(IPC): 数据库系统可能包括多个进程或线程,这个部分负责这些进程之间的通信
  10. 并发控制: 数据库系统必须处理多个并发操作,这部分负责管理并发访问,保证事务的隔离性和一致性。
  11. 索引管理: 数据库使用索引来快速定位数据,这部分负责索引的创建、维护和优化
  12. 外部接口: 数据库需要与外部世界进行交互,例如,通过 SQL 接口与用户或其他系统通信

存储管理器的体系结构

  PostgreSQL存储管理器主要包括两个功能:内存管理外存管理。存储管理器的体系结构如下图所示:
在这里插入图片描述

  • 内存管理: 负责共享内存管理以及进程本地内存的管理。在共享内存中存储着所有进程的共享数据,包括锁变量进程通信状态缓冲区等。而本地内存为各个后台进程所有,是它们的工作区域,存储着属于该进程的 Cache事务管理信息进程信息等。为了防止多个进程并发地访问共享数据PostgreSQL 还提供了轻量级的锁,用于支持对共享数据的互斥访问。此外,存储管理器还提供了内存上下文(MemoryContext)用于统一管理内存的分配与回收,从而更加安全有效地对内存空间进行管理
  • 外存管理: 负责表文件管理空闲空间管理虚拟文件描述符管理以及大数据存储管理。在 PostgreSQL 中,每个表都用表文件存储,表文件以表的 OID 命名。当一个表文件超过文件大小限制时PostgreSQL会自动将其切分为多个文件进行存储,并在 OID 的基础上加上编号作为该文件的名字。每个表除了表文件以外,还有两个附属文件可见性映射表文件(VM)空闲空间映射表文件(FSM)。前者用于加快清理操作VACUUM),后者则用于对表的空闲空间进行管理。为了避免打开的文件超过 OS 的限制,存储管理器还引入了虚拟文件描述符管理的机制。此外,存储管理器还提供了大对象机制以及 TOAST 机制用于支持对大数据的存储。

  PostgreSQL 的存储管理是为了优化和保证数据库操作的效率和安全内存管理负责处理运行时数据和进程间的快速交互,而外存管理确保数据持久性和有效的空间利用。通过这样的机制,PostgreSQL 能够高效地处理大量数据,支持高并发的数据库操作,并且提供了数据的持久化存储和恢复能力。同时,这种架构也支持了大数据和复杂数据类型的存储,满足现代应用对数据库的多样化需求。
  PostgreSQL 的存储管理器采用与操作系统类似的分页存理方式,即据在内存中是以页面块的形式存在。每个表文件由多个 BLCKSZ (一个可配置的常量) 字节大小的文件块组成,每个文件块又可以包含多个元组表文件文件块为单位读入内存中,每一个文件块在内存中形成一个页面块。由于页面块是文件块在内存中的存在形式,因此在后文中如不进行特殊说明也会使用页面来指代文件块。同样,文件的写入也是以页面块为单位PostgreSQL 采用传统的行式存储,即以元组为单位进行数据的存储。一个文件块中可以存放多个元组,但是 PostgreSQL 不支持元组的跨块存储,每个元组最大为 MaxHeapTupleSize。这样保证了每个文件块中存储的是多个完整的元组
  与操作系统一样,PostgreSQL在内存中开辟了缓冲区域用于存储这些文件块,我们将其在内存中开辟的缓冲区域称为缓冲池,缓冲池被划分成若于个固定大小(和文件块的尺寸相同,也是 BLCKSZ)的缓冲区,磁盘上的文件块读入内存后被存放在缓冲区中,称之为页面块或者缓冲块BLCKSZ 的默认值是 8192,因此一个标准缓冲块的大小默认为 8KB
  用 AI 生成了一张图,但貌似有点抽象。。。
在这里插入图片描述

存储管理器的主要任务

  总的来说,存储管理器的主要任务包括:

  1. 缓冲池管理: 为了提高事务执行的效率,事务在执行时,首先会先把数据放入的缓冲区中,PostgreSQL设立了进程间共享的缓冲池以及进程私有的缓冲池
  2. Cache机制: 将进程最近使用的一些数据缓存到其私有内存中,其级别高于缓冲池
  3. 虚拟文件描述符(VFD)管理: PostgreSQL 通过 VFD对物理文件进行管理,避免因为操作系统对进程打开文件数的限制出现错误
  4. 空闲空间管理: PostgreSQL 通过 FSM 快速定位到表文件中的空闲空间以便插入新数据,从而提高对空间的利用率。
  5. 进程间通信机制(IPC): PostgreSQL 是一个多进程系统IPC 用来在多个后台进程间进行通信消息传递
  6. 大数据存储管理: 提供大对象TOAST 机制。大对象是一种由用户控制的大数据存储方法,它由用户调用函数,通过 SQL 语句直接向表中插入一个大尺寸文件。而 TOAST 机制则是在用户插入变长数据超过一定限度时自动触发的,用户无法对其加以控制。(但是可以更改存储模式,比如说)

读写元组过程

  当一个 PostgreSQL 进程从数据库中读写一个元组时,对于以上各个功能模块的使用顺序如下图所示:
在这里插入图片描述

  1. 读取一个元组数据时,首先需要先获取表的基本信息,如表OID索引信息以及统计信息,这些信息分散在多个系统表中。因此读写一个表需要访问多个系统表,但是这些每次都去读取系统表是没有必要的。因此每个进程在都会在本地内存区域设置两种 Cache,分别保存系统表元组存储表的基本信息,从而使得进程能够快速地构建出表的基本信息和元组的模式结构
  2. 获取表基本信息和元组的模式信息后,需要从元组所在的文件块中获取元组数据。这时首先判断元组所在的文件块是否在缓冲池里面,若是则直接返回,否则需要从存储介质中读取相应的文件块到缓冲区中,再从缓冲区中读取元组
  3. 缓冲区存储介质的交互是通过存储介质管理器SMGR)进行。不同存储介质的底层实现各有差异,SMGR 负责统管各种存储介质,并对上层请求提供统一的接口,对下层则根据不同的介质调用相应的介质管理器,因此 SMGRPostgreSQL 外存管理的核心。
  4. 在磁盘管理器与物理文件之间还存在一层虚拟文件描述符机制(VFD),这是为了防止PostgreSQL 打开的文件数超过 OS 限制而引起不可预知的错误。VFD 机制通过合理利用有限个实际文件描述符为 PostgreSQL 提供了虚拟的无限的文件描述符。
  5. 在写入元组的时候,当目标表的目标文件块容量不足时,需要查找该表中具有空闲区域的文件块读入内存。但是如果遍历该表所有的文件块效率是很的。为了加快查找的速度PostgreSQL 为每个表增加了一个附属文件(FSM)用于记录每个文件块的空闲空间大小,通过一定的查找机制和数据组织实现文件块的快速选择。
  6. 删除元组时,PostgreSQL 使用标记的方法快速处理。该元组的物理清除工作将由VACUUM 机制来完成。当然,如果 VACUUM 依次遍历所有的文件块也是非常慢的,于是 PostgreSQL 设计了一个可见性映射表VM)来加快查找速度。
  7. 除了一般的数据外,PostgreSQL 还提供了大对象机制TOAST 机制存储大对象数据。前者发生在用户需要为数据库存储一个大文件时,PostgreSQL 为用户提供一个创建大对象的接口函数用于存储并获得一个大对象 OID。后者则主要用于变长字符串

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

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

相关文章

最新鸿蒙HarmonyOS 使用Progress、Toggle开发一个接单界面

Progress 进度条组件,用于显示内容加载或操作处理等进度。 接口 Progress(options: {value: number, total?: number, type?: ProgressType}) Toggle组件提供勾选框样式、状态按钮样式及开关样式。 接口 Toggle(options: { type: ToggleType, isOn?: boolean …

SpringBoot actuator应用监控

文章目录 引入依赖端点(Endpoints)端点种类端点开启配置暴露端点手动暴露端点 端点保护引入spring security依赖配置security 端点响应缓存访问端点路径修改CORS跨域支持健康信息(/actuator/health)自定义healthInfo 应用信息(/actuator/info) 监控信息可视化引入依赖配置查看配…

【LeetCode刷题】--245.最短单词距离III

245.最短单词距离III class Solution {public int shortestWordDistance(String[] wordsDict, String word1, String word2) {int len wordsDict.length;int ans len;if(word1.equals(word2)){int prev -1;for(int i 0;i<len;i){String word wordsDict[i];if(word.equa…

Unity中Shader测试常用的UGUI功能简介

文章目录 前言一、锚点1、锚点快捷修改位置2、使用Anchor Presets快捷修改3、Anchor Presets界面按下 Shift 可以快捷修改锚点和中心点位置4、Anchor Presets界面按下 Alt 可以快捷修改锚点位置、UI对象位置 和 长宽大小 二、Canvas画布1、UGUI中 Transform 变成了 Rect Transf…

One Wire协议解析

引言 One Wire是一种串行扩展总线技术&#xff0c;由DALLAS公司推出。它采用一根信号线进行通信&#xff0c;既传输时钟信号又传输数据&#xff0c;而且能够进行双向通信。由于其节省I/O口线、资源结构简单、成本低廉、便于总线扩展和维护等诸多优点&#xff0c;One Wire在许多…

go语言指针变量定义及说明

go语言指针主要需要记住两个特殊符号&#xff0c; 一个是 & 用来获取变量对应的内存地址 另一个是 * 用来获取指针对应的变量值 下面是个最简单的go语言指针说明 package mainimport "fmt"//指针为内存地址func main() {var a string "指针对应的变量&…

2023数字化发展推动家庭教育走向科学评价

近年来,随着人工智能、大数据、区块链等新一代数字技术的教育应用,在实践探索中形成了无感式数据采集、智能化诊断分析、即时性精准反馈等新样态,为破解教育评价难题提供了新的可能。 过去,传统教育评价体系是学校以及家庭教育最核心的焦虑和压力来源之一。“唯分数论”以及“…

实验一传统的结构化的软件工程方法、实验二面向对象的软件工程、实验三软件测试

背景&#xff1a; 实验一 传统的结构化的软件工程方法 1实验目的 了解传统的软件工程方法的基本原理&#xff0c;掌握软件生命周期的全过程依次划分为需求分析、总体设计、详细设计、编码、测试、维护等几个重要阶段。每个阶段所要完成的任务以及提交的文档。 2实验内容 …

手把手教你在 windows 上安装 Docker

前言 大家好&#xff0c;我是潇潇雨声&#xff0c;今天为大家带来一篇关于在 Windows 环境下使用 Docker 的教程。对于 Docker&#xff0c;我们可以简单地将其看作一种方便的软件安装方式&#xff0c;而无需深入涉及其复杂的概念。选择使用 Docker 主要是为了省事&#xff0c;比…

爬虫请求指纹检测与绕过 TLS/JA3/Http2

说明&#xff1a;仅供学习使用&#xff0c;请勿用于非法用途&#xff0c;若有侵权&#xff0c;请联系博主删除 作者&#xff1a;zhu6201976 一、什么是请求指纹检测&#xff1f; TLS/JA3、HTTP/2 指纹检测是一种网络流量分析技术&#xff0c;用于识别和分析网络通信中使用的加密…

阿里云k8s集群搭建

文章目录 一、安装前准备1.环境2.k8s集群规划 二、k8s 安装1. centos基础设置2. docker 安装3. k8s安装3.1 添加阿里云 yum 源3.2 安装 kubeadm、kubelet、kubectl3.3 部署 Kubernetes Master3.4 加入 Kubernetes Node3.5 部署 CNI 网络插件3.6 测试 kubernetes 集群 一、安装前…

MATLAB - 最优控制(Optimal Control)

系列文章目录 前言 - 什么是最优控制&#xff1f; 最优控制是动态系统满足设计目标的条件。最优控制是通过执行以下定义的最优性标准的控制律来实现的。一些广泛使用的最优控制方法有&#xff1a; 线性二次调节器 (LQR)/线性二次高斯 (LQG) 控制 模型预测控制 强化学习 极值…

管理类联考——数学——真题篇——按题型分类——充分性判断题——蒙猜A/B

老规矩&#xff0c;看目录&#xff0c;平均3-5题 文章目录 A/B2023真题&#xff08;2023-19&#xff09;-A-选项特点&#xff1a;两个等号&#xff1b;-判断需联立的难易&#xff1a;难&#xff0c;看着感觉需要联立&#xff0c;所以判断联立需要有理论支撑&#xff0c;不然还…

【AI美图】第08期效果图,AI人工智能3D效果图,让创意和想象力在一张简单的底图上绽放!

让创意和想象力在一张简单的底图上绽放 探索未来&#xff0c;体验无限可能&#xff01;我们的AI技术可以将一张简单的底图转化为令人惊叹的3D效果图&#xff0c;让你瞬间拥有超凡的视觉体验。无论是房屋建筑、汽车设计、游戏开发&#xff0c;还是艺术创作&#xff0c;我们的AI…

LabVIEW开发振动数据分析系统

LabVIEW开发振动数据分析系统 自动测试系统基于LabVIEW平台设计&#xff0c;采用了多种高级硬件设备。系统的硬件组成包括PCB振动加速度传感器&#xff0c;这是一种集成了传统压电加速度传感器和电荷放大器的先进设备&#xff0c;能够直接与采集仪器连接。此外&#xff0c;系统…

漏洞复现-亿赛通任意文件读取漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

鸿蒙ArkTS语言介绍与TS基础法

1、ArkTS介绍 ArkTS是HarmonyOS主力应用开发语言&#xff0c;它在TS基础上&#xff0c;匹配ArkUI框架&#xff0c;扩展了声明式UI、状态管理等响应的能力&#xff0c;让开发者以更简洁、更自然的方式开发跨端应用。 JS 是一种属于网络的高级脚本语言&#xff0c;已经被广泛用…

精通服务器远程管理:全面指南

引言 在当今数字化世界中&#xff0c;IT专业人员和管理员能够远程管理服务器的能力是无价之宝。远程服务器管理不仅提高了效率&#xff0c;而且在无法物理访问服务器的情况下确保了持续的运营。本指南将深入探讨远程管理的不同类型、远程桌面的使用方法&#xff0c;以及如何安全…

ie-tab插件平替插件IEability-Open in IE

ie-tab插件仅可试用两周&#xff0c;之后就要收费 IEability-Open in IE可以平替 IE tab 下载IEability.exe并进行安装 在浏览器的输入界面输入搜索内容&#xff0c;点击插件按钮即可进入IE模式

sectigo多域名通配符证书

多域名通配符SSL证书是一种特殊的SSL证书&#xff0c;它综合了多域名SSL证书和通配符SSL证书的特点&#xff0c;可以同时保护多个泛域名以及它的主域名&#xff0c;适合域名多&#xff0c;子域名也比较多的单个或多个站点使用。今天就随SSL盾小编了解Sectigo旗下的DV多域名通配…