PGconf.Asia 2021 主题分享:PostgreSQL 空闲空间管理

在2021年12月14-17日举行的PostgresConf.CN&PGConf.Asia 2021大会上,来自Greenplum原厂的VMware研发工程师王晓冉发表了《PostgreSQL 空闲空间管理》主题演讲。在演讲中,王晓冉结合PostgreSQL存储引擎,分析了FSM的实现机制,并结合源代码,分析了FSM代码中主要数据结构,存储、并发及recovery的实现。

在大会上,王晓冉将整个演讲内容分为了四个部分进行讲解,分别是:

  1. 背景
  2. 功能
  3. 实现机制
  4. 源代码分析

FSM出现的背景和Data Pages,MVCC和VACUUM相关。首先我们来看看Data Pages,PostgreSQL的数据是以page为逻辑单位存储于文件系统中的,下图中的存储路径是/data/base/16385/24692。16385对应的数据库OID,24692对应的是表的OID。PostgreSQL中一个页面的大小是8k,数据是以tuple的形式存储在页面中,一个tuple对应了表中的一行数据。

我们再来看看MVCC。PostgreSQL采用MVCC多版本控制协议来实现多版本控制。在删除数据时,只标记,不删除。在写新数据时,旧数据不删除,而是把新数据插入。例如图中的更新操作,原数据中只有Tuple1一行数据,在更新时,并不删除Tuple1,而是插入更新后的Tuple2。Tuple1这样的旧数据很快会对所有事务不可见,变为过期无用的数据,它们所占用的空间将被释放。VACUUM进程就是负责释放过期数据占用的空间。

更新前Tuple

更新后Tuple

VACUUM进程把page中这些不可见数据占用的空间标记为可用,当有新数据插入时,优先使用这些空间。FSM负责管理这些page中的空闲空间。当执行INSERT/COPY/UPDATE 操作,需要在页面插入一行数据时,调用FSM获取可用page。

FSM的功能主要包括以下四个方面:

  1. 查找可用page
  2. 更新page的可用空间
  3. 持久化(FSM FORK)
  4. 并发 & Recovery

点击下面链接观看演讲视频,即可了解FSM功能、实现机制、及源代码分析的具体内容。

https://www.bilibili.com/video/BV1934y1i7pk/

关注微信公众号

VMware 中国研发中心

Greenplum官方技术交流群

扫码添加小助手即可入群,添加时请备注 “GP网站”