在2021年12月14-17日举行的PostgresConf.CN&PGConf.Asia 2021大会上,来自Greenplum原厂的VMware研发工程师王晓冉发表了《PostgreSQL 空闲空间管理》主题演讲。在演讲中,王晓冉结合PostgreSQL存储引擎,分析了FSM的实现机制,并结合源代码,分析了FSM代码中主要数据结构,存储、并发及recovery的实现。
在大会上,王晓冉将整个演讲内容分为了四个部分进行讲解,分别是:
背景
功能
实现机制
源代码分析
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的功能主要包括以下四个方面:
查找可用page
更新page的可用空间
持久化(FSM FORK)
并发 & Recovery
领取专属 10元无门槛券
私享最新 技术干货