PG内核解读 - 第3节 存储管理(上)

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 本文整理自阿里云数据库开源社区Maintainer于巍(花名漠雪),在PostgreSQL数据库内核解读系列的分享。本篇内容主要分为四个部分:1. 主流存储引擎架构和原理2. 页面和元组3. Buffer管理4. 淘汰算法


PG内核解读-第3节存储管理1



 

一、主流存储引擎架构和原理

image.png 

目前,在选择存储引擎时,主要看性能和性价比。如上图所示,最快的是CPU Registers,然后是CPU Caches,Main Memory,Flash Disk以此类推。

同一件事CPU L1 Cache Ref的完成时间是0.5ns,Tape Archives完成的时间是31.7年。所以存储引擎间,性能差距非常大。

image.png 

接下来,讲一讲。存储引擎访问的原理。数据存储在磁盘上,磁盘里的数据一般以page或block的啊形式存在。page和block的页面在8k到64k之间。

用户在使用数据时,一般会创建一个Buffer Pool,把数据缓存到内存里。从而避免数据访问从磁盘读取,加速磁盘运行。当内存不够时,会淘汰不常用的数据。

image.png 

随着时代的发展,基于上述原理,扩展出了Cache Fusion架构,如上图所示。十年前,大家通常会使用Cache Fusion,同时在多个节点修改数据。

image.png 

上图是PolarDB共享存储架构,节点间的数据通过日志进行传递。目前,PolarDB共享存储架构已经开源。

image.png 

接下来,讲一讲XEngine的LSMTree架构。内存里的Active Memtable主要管理并更新热数据。当数据逐渐变成不可修改的Memtable,经过compactions变不同级别的文件,以Extent方式进行管理。

image.png 

云原生关系型数据库PolarDB综合了三层解耦,Serverless,多主架构,HTAP。当计算存储分离之后,在云上将资源池化,计算存储可以分别扩展,进一步节省资源。

目前,计算节点的内存层变成共享内存,CPU和内存通过解耦,可以分别扩展。节点数量按需自动横向扩展,线性扩展事务处理和数据分析能力,最大化资源利用率,降低客户成本。

 

二、页面和元组

image.png

接下来,介绍一下页面和元组。如上图所示,MySQLInnoDB通过段页式进行管理。segment包含了extent,extent包含了page,page包含了row。MySQLInnoDB的管理逻辑更清晰,代码更复杂。

image.png 

XEngine拥有类似于MySQLInnoDB的结构,它通过Extent和Block的方式进行存储管理。

image.png 

接下来,讲一下PG的页面结构。PG的页面结构相比MySQL的代码更清晰。8k里配置了Header,用来保存页面的基本信息。页面尾部的special标志,用来判断或检测。当增加一个Tuple时,会生成一个item。

Header有一个pd_lsn,在修改页面时,需要修改对应的日志。pd_lsn决定了页面的新旧程度。

image.png 

如上图所示,一个元组包括一个Header,以及各个字段的值。在Header里,元组的OID代表对象ID(可选);xmin代表创建交易id;xmax代表销毁交易id;cmin代表创建命令id;cmax代表破坏命令id;ctid代表元组id(页面/项目);natts代表属性数;infomask代表元组标志;hoff代表元组头的长度;bitsbit表示NULL的位图。

 

三、Buffer管理

image.png 

PG Buffer的Buffer table,相当于一个哈希表,映射Buffer的描述符和Buffer pool,从而快速定位查询。在启动PG时,会定义Buffer pool的大小,从而确定了Buffer pool的数据页。

首先,Buffer pool,descriptors,哈希表等,都存在SharedMemory里。创建内存之前,会计算大小,然后统一进行创建。

image.png 

接下来,讲一讲Buffer的描述符。PG11的bufferDesc,为了cache line对齐,将io lock单独管理,从而实现高效访问。

image.png 

上图是Bufferer的访问流程。其中,比较重要的函数是ReadBuffer_common。首先,isExtend会判断是否扩展新页面。通过获取页面编号,扩展新页面。

然后,BufferAlloe会获取buffer描述符,查找页面是否存在,不存在则用淘汰算法获取buffer。


如果发现在bufferpool中存在fbuf hash table,通过bufd获取buffer描述符,然后返回对应的buf描述符。


如果bufferpool不存在,可以利用Freelist或cocksweep获取可用buffer。


如果是脏页,则通过脏页刷盘,调用存储写buffer接口。然后,插入新的buf描述符到hash表,获取新的buffer描述符。


如果需要扩展新页面,则使用0填充新页面,调用存储接口写贝面到文件。

 

四、淘汰算法

image.png 

接下来,介绍一下淘汰算法。当Buffer用完后,需要淘汰Buffer里不常用的页面。常用的策略是FIFO,即先进先出。


LFU淘汰一定时期内被访问次数最少的页面,以次数作为参考。LRU淘汰最长时间未被使用的页面,以时间作为参考。


2Q算法有两个缓存队列,一个是FIFO队列,一个是LRU队列。新的淘汰算法CAR,通过Frequency和Recency作为参考。

image.png 

PG使用ClockSweep算法,把Buffer看成一个环,通过指针判断环上的数据。ClockSweep通过REFCOUNT和USAGECOUNT,实现整个淘汰过程。Buffer中淘汰页面代码的引用数为O,使用数减1,使用为O可淘汰。

image.png 

函数CreateSharedMemory在post master启动时,会创建共享内存。首先,利用size添加所有的共享内存,然后创建SharedMemory。淘汰算法就是把磁盘里的数据加载到页面,再返回描述符,访问对应的内容。

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
SQL 存储 缓存
PG内核解读-第2节PostgreSQL体系结构
本文整理自阿里云数据库开源社区Maintainer于巍(花名漠雪),在PostgreSQL数据库内核解读系列的分享。本篇内容主要分为三个部分: 1. PostgreSQL系统表 2. PostgreSQL初始化、启动、查询流程 3. PostgreSQL辅助进程
PG内核解读-第2节PostgreSQL体系结构
|
存储 缓存 算法
【Linux】基础IO(二)--- 理解内核级和用户级缓冲区、磁盘与ext系列文件系统、inode与软硬连接(下)
【Linux】基础IO(二)--- 理解内核级和用户级缓冲区、磁盘与ext系列文件系统、inode与软硬连接(下)
177 1
|
存储 Linux 编译器
【Linux】基础IO(二)--- 理解内核级和用户级缓冲区、磁盘与ext系列文件系统、inode与软硬连接(上)
【Linux】基础IO(二)--- 理解内核级和用户级缓冲区、磁盘与ext系列文件系统、inode与软硬连接(上)
207 0
|
SQL 存储 缓存
23 PostgreSQL 监控4 动态内核跟踪 stap 篇|学习笔记
快速学习23 PostgreSQL 监控4 动态内核跟踪 stap 篇
653 0
23 PostgreSQL 监控4 动态内核跟踪 stap 篇|学习笔记
|
存储 SQL 缓存
PostgreSQL 内核解读系列 - 第4节 存储管理(下)
本文整理自阿里云数据库开源社区 Maintainer 于巍(花名漠雪),在PostgreSQL数据库内核解读系列的分享。本篇内容主要分为四个部分: 1. 磁盘管理 2. 空闲空间映射表(FSM) 3. 可见性映射表(VM) 4. 内存管理。
PostgreSQL 内核解读系列 - 第4节 存储管理(下)
|
数据安全/隐私保护
驱动开发:内核中实现Dump进程转储
多数ARK反内核工具中都存在驱动级别的内存转存功能,该功能可以将应用层中运行进程的内存镜像转存到特定目录下,内存转存功能在应对加壳程序的分析尤为重要,当进程在内存中解码后,我们可以很容易的将内存镜像导出,从而更好的对样本进行分析,当然某些加密壳可能无效但绝大多数情况下是可以被转存的。
277 0
驱动开发:内核中实现Dump进程转储
|
存储 算法 调度
操作系统之磁盘调度——SCAN实例讲解
磁盘是高速、大容量、旋转型、可直接存取的存储设备。它作为计算机系统的辅助存储器,担负着繁重的输入输出工作,在现代计算机系统中往往同时会有若干个要求访问磁盘的输入输出要求。系统可采用一种策略,尽可能按最佳次序执行访问磁盘的请求。由于磁盘访问时间主要受寻道时间T的影响,为此需要采用合适的寻道算法,以降低寻道时间。本实验要求学生模拟设计一个磁盘调度程序,观察调度程序的动态运行过程。通过实验让学生理解和掌握磁盘调度的职能。
893 0
操作系统之磁盘调度——SCAN实例讲解
|
存储 Unix
AIX存储管理(一)概述
摘自《IBMAIX从入门到精通》 1、物理卷     physical volume,简称pv,实际指的是物理磁盘,是系统的主要存储设备,该设备可以是内部的、外部的,也可以是活动的。
877 0
|
关系型数据库 数据库 PostgreSQL
Postgresql数据库体系结构-进程和内存结构
数据库体系结构-进程和内存结构(Process and Memory Architecture) 进程结构 服务器进程postmaster后台工作进程后端进程 内存结构 本地内存区 work_memmaintenance_work_memtemp_buffers 共享内存区 shared buffer poolWAL buffercommit log 数据库启动过程 数据库连接过程 PostgreSQL是一个client/server架构rdbms,一个服务器上运行多个进程。
2251 0
|
JavaScript 网络协议 前端开发
ceph驱动引起的内核Crash分析
大家好,今天跟大家分享一个Linux core dump分析的案例。