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数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
SQL 存储 缓存
PG内核解读-第2节PostgreSQL体系结构
本文整理自阿里云数据库开源社区Maintainer于巍(花名漠雪),在PostgreSQL数据库内核解读系列的分享。本篇内容主要分为三个部分: 1. PostgreSQL系统表 2. PostgreSQL初始化、启动、查询流程 3. PostgreSQL辅助进程
PG内核解读-第2节PostgreSQL体系结构
|
人工智能 关系型数据库 分布式数据库
沉浸式学习PostgreSQL|PolarDB 9: AI大模型+向量数据库, 提升AI通用机器人在专业领域的精准度, 完美诠释柏拉图提出的“知识是回忆而不是知觉”
越来越多的企业和个人希望能够利用LLM和生成式人工智能来构建专注于其特定领域的具备AI能力的产品。目前,大语言模型在处理通用问题方面表现较好,但由于训练语料和大模型的生成限制,对于垂直专业领域,则会存在知识深度和时效性不足的问题。在信息时代,由于企业的知识库更新频率越来越高,并且企业所拥有的垂直领域知识库(例如文档、图像、音视频等)往往是未公开或不可公开的。因此,对于企业而言,如果想在大语言模型的基础上构建属于特定垂直领域的AI产品,就需要不断将自身的知识库输入到大语言模型中进行训练。
2436 0
|
存储 NoSQL 网络协议
PG内核解读-第1节PostgreSQL系统概述
本文整理自阿里云数据库开源社区Maintainer于巍(花名漠雪),在PostgreSQL数据库内核解读系列的分享。本篇内容主要分为四个部分: 1. 本系列教程介绍 2. PostgreSQL概述(历史、架构) 3. PostgreSQL安装启动 4. PostgreSQL常用命令、调试
PG内核解读-第1节PostgreSQL系统概述
|
11月前
|
存储 算法 BI
xxljob本地运行
本文介绍XXL-JOB分布式任务调度框架的部署与使用,涵盖源码获取、服务端数据库初始化、配置启动、客户端注册及定时任务测试全过程,助您快速搭建并运行调度系统。
|
监控 Java 调度
SpringBoot中@Scheduled和Quartz的区别是什么?分布式定时任务框架选型实战
本文对比分析了SpringBoot中的`@Scheduled`与Quartz定时任务框架。`@Scheduled`轻量易用,适合单机简单场景,但存在多实例重复执行、无持久化等缺陷;Quartz功能强大,支持分布式调度、任务持久化、动态调整和失败重试,适用于复杂企业级需求。文章通过特性对比、代码示例及常见问题解答,帮助开发者理解两者差异,合理选择方案。记住口诀:单机简单用注解,多节点上Quartz;若是任务要可靠,持久化配置不能少。
1372 4
|
存储 弹性计算 安全
云基础设施处理器CIPU 2.0技术解读
本文深入解读阿里云的CIPU(Cloud Infrastructure Processing Unit)技术,探讨其在云计算中的定位与价值。面对当前XPU命名泛滥的问题,阿里云为何选择CIPU这一名称?CIPU旨在解决云计算中的弹性、安全、稳定、性能和成本五大核心需求。通过对比DPU和IPU,CIPU更专注于云环境下的基础设施处理,确保数据的安全性、传输的可靠性和存储的稳定性。此外,文章还回顾了神龙计算的历史发展,强调CIPU2.0在提升性能、优化资源调度和满足大客户需求方面的进展。最终,CIPU作为手段,其核心目标是为客户提供更高性价比和更稳定的云服务。
|
人工智能 数据中心 云计算
AI网络新生态ALS发起成立,信通院、阿里云、AMD等携手制定互连新标准
9月3日,在2024 ODCC开放数据中心大会上,阿里云联合信通院、AMD等国内外十余家业界伙伴发起AI芯片互连开放生态ALS(ALink System)。
AI网络新生态ALS发起成立,信通院、阿里云、AMD等携手制定互连新标准
|
负载均衡 Oracle 网络协议
Oracle中TAF与SCANIP全面解析
通过本文的解析,读者可以清晰地理解Oracle中TAF与SCAN IP的概念、工作原理及其在实际应用中的优势和局限性。TAF通过自动故障转移提升了会话的高可用性,而SCAN则通过简化客户端连接和负载均衡提升了集群的可管理性和扩展性。这两种技术在现代企业数据库架构中扮演着重要角色,能够显著提高系统的稳定性和可用性。
895 6

热门文章

最新文章