【PostgreSQL】【存储管理】存储管理器的体系结构

  • 数据库管理系统的本质任务是向存储设备上写入数据或者从存储设备上读出数据。
  • 在PostgreSQL中有专门的模块负责管理内存和外存的存储设备,我们称之为存储管理器
  • 存储管理器提供了一组统一的管理外存和内存资源的功能模块,所有对外存与内存的操作都将交由存储管理器处理,可以认为存储管理器是数据库系统与物理存取设备的接口

存储管理器的体系结构

【PostgreSQL】【存储管理】存储管理器的体系结构_第1张图片

存储管理器的主要功能:外存管理和内存管理

内存管理:

  • 内存管理包括:共享内存的管理和进程本地内存管理
    • 共享内存存储着所有进程公共数据,例如锁变量,进程通信状态,缓冲区。
    • 本地内存为每个后台进程所专有,是它们的工作区域,存储着属于该进程的Cache(高速缓存),事物管理信息,进程信息等。
  • 为了防止多个进程并发访问共享内存中数据时产生冲突,PostgreSQL提供了轻量级锁,用于支持对共享内存中同数据的互斥访问。
  • PostgreSQL使用共享内存实现了IPC(进程间通信)以及无效消息共享,以支持进程间的互相通信。
  • 内存上下文用于统一管理内存的分配和回收,从而更加有效地对内存空间进行管理。

外存管理:

  • 外存管理包括表文件的管理,空闲空间管理,虚拟文件描述符管理以及大数据存储等。
  • 在PostgreSQL中每个表都用一个文件(表文件)存储,表文件以表OID命名。对于超出操作系统文件大小限制(比如FAT32限制4G)的表文件,PostgreSQL会自动的其切分成多个文件来存储,并在原表文件名的尾部加上切分文件的顺序号来识别它们。
  • 从PostgreSQL8.4版本开始,每个表除了表文件外还拥有两个附属文件:VM(可见性映射表文件)和FSM(空闲空间映射表文件)
    • 前者用于加快清理操作(Vacuum)的执行速度
    • 后者则用于表文件空闲空间的管理
  • 为了避免超过操作系统对每个进程打开文件数的限制,存储管理器使用了虚拟文件描述符机制(VFD),使的后台进程可以打开“无限多个”文件。
  • 存储管理器还提供了大对象机制以及TOAST机制,用来支持大数据存储。
  • PostgreSQL还在存储管理选择器中封装了对具体存储器的操作接口,以便扩展支持多种存储介质(比如对闪存,光盘的支持)。

分页存储管理:

  • PostgreSQL中存储管理器采用与操作系统类似的分页存储管理方式,即数据在内存中是以页面块的形式存在。
  • 每个表文件由多个BLCKSZ(一个可配置的常量)字节大小的文件块组成,每个文件块又可以包含多个元组。BLCKSZ的默认大小是8192Byte,因此一个文件块的大小是8KB。
  • 表文件以文件快为单位读入内存中,每个文件快在内存中形成一个页面块。同样,文件的写入到磁盘也是以页面块为单位。
  • PostgreSQL采用传统的行式存储,即以元组为单位进行数据的存储。一个文件快可以放多个元组,但是不支持元组的夸块存储,这样保证了每个文件块中存储的是多个完整的元组。
  • 与操作系统一样,PostgreSQL在内存中开辟了缓冲区域用于存储这些文件块,我们将其在内存中开辟的缓冲区域称为缓冲池,缓冲池也划分成若干个固定大小(和文件块的尺寸相同)的缓冲区。
  • 磁盘上的文件块读入内存后被放在缓冲区中,称之为页面块或缓冲块。
  • 文件块,页面块,缓冲块总的来说同一个东西在不同环境下的不同名称而已,本质上都是一样的。

【PostgreSQL】【存储管理】存储管理器的体系结构_第2张图片

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

  1. 缓冲池管理
    • 缓冲池在PostgreSQL中起缓存的作用。
    • 数据库中的事物常常需要频繁地存取数据,为了减少对磁盘的读写,在事物执行时,数据首先将会放入缓冲池中,PostgreSQL设立了进程间共享的缓冲池(共享缓冲池)以及进程私有的缓冲池(本地缓冲池)
  2. Cache机制(高速缓存)
    • 将进程最近使用的一些系统数据缓存在其私有内存中,其级别高于缓冲池。
  3. 虚拟文件描述符管理
    • PostgreSQL通过虚拟文件描述符(VFD)来对物理文件进行管理,避免因为操作操作系统对进程打开文件数的限制出现错误。
  4. 空闲空间的管理:
    • 用于快速定位到文件中的空闲空间以便于插入新数据,从而提高空间利用率。
  5. 进程间通信机制
    • PostgreSQL是一个多进程的系统,IPC用来在多个进程之间进行通信和消息传递,比如使用消息队列来同步进程产生的无效消息,同时IPC还提供了对共享内存的管理。
  6. 大数据存储管理
    • PostgreSQL还提供了大对象和TOAST机制。大对象机制是一种由用户控制的大数据存储方法,它允许用户调用函数,通过SQL语句直接向表中插入一个大尺寸文件(图片,视频,文档等)。
    • TOAST机制则是用户插入变长数据超过一定限度时自动触发,用户无法对TOAST加以控制。

读写元组的过程:

当一个PosgreSQL进程从数据库中读写一个元组的时候,对于以上各个功能模块的使用顺序可以下图来描述:
【PostgreSQL】【存储管理】存储管理器的体系结构_第3张图片

  1. 读取一个元组数据时首先
    • 需要获取表的基本信息(如表的OID,索引信息,统计信息等)及元组的模式信息,这些信息被分散记录在多个系统表中。
    • 通常一个表的模式在设定好后变化频率很低,因此在对同一个表的多个元组操作时,每次读取系统表来构建模式信息是没必要的,也会降低元组操作的频率。
    • 为了减少对系统表的访问,在每个进程的本地内存区域设置了两种Cache,一种用来存储系统表元组(SysCache),一种用来存储表的基本信息(RelCache),从而让进程以很高的效率快速构建出表的基本信息和元组的模式结构。
  2. 获取表的基本信息和元组的的模式信息后,接下来就需要读取元组所在的文件块来获取元组信息
    • PostgreSQL进程首先从共享缓冲池中查找所需文件块对应的缓冲块。
    • 如果能够找到对应的缓冲块,则直接从中取得元组的数据并合拼上一步得到的元组模式信息解析元组的各个属性值。
    • 如果找不到相应的缓冲块则要读入文件快,然后再从调入的缓冲块中获取元组信息。
    • PostgreSQL除了缓冲池外,还为每个进程设置了本地缓冲池,用于缓存临时表数据及其他进程不可见数据。
  3. 如果缓冲池中没有包含所需元组的缓冲块,则需要从存储介质中读取,并写入到缓冲区中
    • 缓冲区与存储介质的交互通过存储介质管理器(SMGR)来进行的。
    • 不同的存储介质的底层实现各有差异,SMGR负责统一管理各种介质,并对上一层的请求提供统一的接口,对下层则根据不同介质调用相应的介质管理器,因此SMGR是PostgreSQL外存管理部分的核心。
    • 在版本8.4.1中仅支持对磁盘的管理,磁盘管理器负责所有磁盘上的文件操作,包括创建,删除,读取等。
    • 磁盘管理器支持对大表(超过2G)的管理。
    • 当表文件超过RELSEG_SIZE大小限制时,将会文件扩展一个新的表文件,假定表的OID为12000,则该表的多个表文件被命名为12000.1,12000.2…依此类推,每个表文件的尺寸都不能超过RELSEG_SIZE。
  4. 在磁盘管理器和物理文件之间还存在一层虚拟文件描述符(VFD)机制,这是为了防止进程打开的文件数超过物理操作系统限制而引起不可预知的错误
    • 磁盘管理操作的是VFD,对于PostgreSQL的进程来说,VFD的个数是无限的,及VFD机制通过合理的使用有限个实际文件描述符来满足无线的VFD访问需求。
    • 而在VFD管理模块,通过维持一个LRU池来管理实际文件描述符(FD)。
    • 由于系统的允许的进程FD个数有限的,因此当LRU池满时需要执行替换机制。
  5. 在写入元组的时候,需要使用一定的策略找到一个具备合适空闲的缓冲块,然后将该元组装填到缓冲块中
    • 系统会在适当的时候将这些被写入的缓冲块“刷”回到存储介质。
    • 对于单个进程而言,应尽量连续插入的数据放在一个缓冲块中,因此在表的基本信息(RelationData)中记录了最近执行插入操作的缓冲块块号。
    • 如果其中有足够的空闲空间,就是使用该缓冲块,否则需要去寻找一个合适的文件块,将其读入内存并进行插入。
    • 显然,如果遍历所有文件块查询其空闲空间,效率是很低的。
    • 为了加快查询速度,在PostgreSQL8.4.1中,为每个表增加了一个附属文件,及空闲空间映射表(FSM),用于记录每个表文件块的空闲空间大小,通过一定的查找机制和数据组织实现了文件块的快速选择。
    • 在FSM查找过程中,还提供了一些额外的特性,例如尽量使不同的进程选择不同的缓冲块以提高效率。
  6. PostgreSQL使用标记删除的方式来处理元组的删除,即对元组做上删除标记,而非从物理上删除元组
    • 元组的物理清理工作将由VACUUM机制来完成,VACUUM操作将会把这类元组所占用的空间置为可用,并且根据不同的VACUUM策略会选择是否将这些腾出来的空间还给操作系统。
    • 显然,在做VACUUM操作的时候去遍历所有文件块查找被删除的元组效率也使很低的,在版本8.4.1中同样也为表设计了一个附属文件来快速查找的速度,该文件被称为可见性映射表(VM)。
  7. 除了一般的数据类型外,PostgreSQL还支持大数据存储,大数据的存储使用TOAST机制和大对象机制来实现,前者主要用于变长字符串,后者则主要用于大尺寸的文件
    • 在写入元组时,如果该元组的大小超过一定限制,会自动触发TOAST机制对该元组进行相应的处理,使其大小满足系统限制。
    • 而大对象机制则用户来调用,当用户需要在数据库中存放一个大的文件时,可以调用PostgreSQL提供的接口函数创建一个大对象并获得一个大对象OID,用户通过该大对象OID来存储并使用大对象。

你可能感兴趣的:(PostgreSQL,postgresql,数据库)