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

简介: 本文整理自阿里云数据库开源社区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数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
ffmpeg中--enable-gpl什么意思
ffmpeg中--enable-gpl什么意思
946 0
ffmpeg中--enable-gpl什么意思
|
SQL 存储 缓存
PG内核解读-第2节PostgreSQL体系结构
本文整理自阿里云数据库开源社区Maintainer于巍(花名漠雪),在PostgreSQL数据库内核解读系列的分享。本篇内容主要分为三个部分: 1. PostgreSQL系统表 2. PostgreSQL初始化、启动、查询流程 3. PostgreSQL辅助进程
PG内核解读-第2节PostgreSQL体系结构
|
存储 NoSQL 网络协议
PG内核解读-第1节PostgreSQL系统概述
本文整理自阿里云数据库开源社区Maintainer于巍(花名漠雪),在PostgreSQL数据库内核解读系列的分享。本篇内容主要分为四个部分: 1. 本系列教程介绍 2. PostgreSQL概述(历史、架构) 3. PostgreSQL安装启动 4. PostgreSQL常用命令、调试
PG内核解读-第1节PostgreSQL系统概述
|
7月前
|
SQL 关系型数据库 MySQL
JOIN顺序优化:小表驱动大表的执行原则
在数据库查询优化中,“小表驱动大表”是一种提升SQL查询效率的常用策略。其核心思想是优先处理数据量较小的表,再与大表进行连接操作,从而减少数据扫描量、降低I/O开销并提高内存使用效率。通过显式指定JOIN顺序、使用EXISTS替代IN以及合理创建索引等方式,可以有效实现该原则。例如,在连接部门表(小表)和员工表(大表)时,先处理小表可显著提升查询性能。掌握这一原则有助于编写高效SQL语句,优化数据库整体表现。
|
存储 SQL 缓存
Perf Arm SPE介绍与使用
本次分享的主题是 Perf Arm-SPE 的介绍及使用,本次分享主要介绍如何在倚天 710 平台上利用 Arm-SPE 特性定位伪共享问题、分析内存访问、分析指令延时以及监控访存延时等功能。 1. 背景介绍 2. Arm SPE的原理 3. Arm SPE在倚天服务器上的应用 4. Arm SPE 更多特性与功能的探索
1218 0
|
机器学习/深度学习 算法
【机器学习】揭秘GBDT:梯度提升决策树
【机器学习】揭秘GBDT:梯度提升决策树
|
监控 关系型数据库 分布式数据库
PolarDB产品使用问题之如何配置端口
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
SQL 关系型数据库 MySQL
MySQL因为hung住,自动重新启动,InnoDB: Semaphore wait has lasted > 600 seconds
从错误日志中检查,有两个信号量等待时间超长,MySQL自动crash了
778 0
|
存储 固态存储 关系型数据库
PostgreSQL核心操作之数据备份恢复
PostgreSQL核心操作之数据备份恢复
1585 0
|
设计模式 移动开发 Java
浅谈交易链路中的一些设计原则&模式
作者对设计原则、模式等学习后,通过本文谈谈自己的感受。
160506 28