Postgre内幕探索(一)

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核8GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
日志服务 SLS,月写入数据量 50GB 1个月
简介: Postgre内幕探索(一)

设计特性

天然集群

PostgreSQL天然集群,如果是单机系统则是单个集簇,相当于一个人组成一个集群的一部分。

PostgreSQL如何管理?是通过一个无符号4个字节的标识进行管理,一个对象就是集群里的一个数据库。

数据库对象和对象符号标识可以通过 pg database和pg classs查询,意味着数据库和对象之间映射。

另外集群在物理磁盘中通过文件目录形式表现,一个目录对应一个数据库,也就是一个base下子目录中有一个目录就是有一个数据库,

值得注意的是表空间表示包含基础目录之外数据目录,这和MySQL区别是表空间含义和存储内容完全不同,在 下面内容会介绍表空间的细节。


通常情况下集群的目录结构如下,可以看到pg_data充当数据库:


一切皆文件

如果观察PostgreSQL的目录结构就能发现他和Linux有相似的地方,就是一切细节都藏在物理文件

因为数据库充当一个目录,Postgresql会根据数据目录以及配置文件和端口号文件创建实例,其中包含版本号,日志,索引,事务状态等等一切相关信息,对于Postgresql来说都有相关文件进行管理和标识,所有信息类似列好的文件夹,所以可以说Postgresql的底层细节全部展示在数据目录文件当中。

表空间

表空间有点类似基础数据的一个映射,在基础数据中建立映射会按照版本和文件夹命名规则建立对应的表空间映射,用于存储基础数据以外的内容,但是表空间的引入是在9.3版本。

并行查询

并行查询的目的是为了利用现代多核心CPU的特性而逐渐发展的,这种特性被称为并行查询

如果没有并行查询,对于一些优化空间很小或者优化效益非常小的SQL使用并行查询可以显著的提升查询速度。

并行查询带来的速度提升是显著的,这和使用缓存不同并行查询会让整个SQL从根本上提升数倍(当然依然取决于SQL质量)。并行查询更大到优点是:那些访问大量数据但只返回其中少数行给用户的查询最能从并行查询中获益,这种场景在日常生活中经常见到。

并行查询的内容会放到后续的内容中进行记录。

数据页格式

PostgreSQL存储数据页的内容被称为堆表,一个堆表中数据页为固定为8kb,注意不管是索引还是数据还是其他类型在Postgresql数据库当中都看作堆表,都是固定大小8KB,当然可以在配置文件里面扩大单个数据页的大小,但是通常只有做OLAP业务的时候有可能用到,默认使用8KB的设置即可。

在堆表中数据分为三部分,文件头,行指针,和元组,元组就是真实数据的存储位置,空闲部分表示未使用空间,下面是对应的内容:

文件头:大小为24b,存储页面元数据,定义为page_header_data,主要成员变量如下:

  • pd Lsn:写日志(XLog)的相关lsn号码,可以看作是MVCC的记录ID。
  • pd checksum:校验和,用于校验数据页的完整性,需要注意校验和在9.x版本才加入此参数,为了兼容过去的版本,此参数有可能存放其他的内容
  • pd lower/pd upper :一个指向行指针尾部,另一个指向最新堆元组的起始位置。通过首尾指针标记当前未使用空间,数据未使用空间等情况。
  • 标记位:主要用于当前记录进行特殊标记。
  • pd speacial 特殊标记,普通数据页指向页尾,而索引文件指向特殊空间,也就是存放索引等信息的空间。
  • version:页面大小和布局版本信息
  • xid:最老元组的xid也就是元组的第一个数据位置
  • 行指针数据组,实例变量(注意这个参数不会存磁盘)

缓冲页的项目指针叫做行指针:

行指针分为三部分,存储为无符号类型

  • 15位偏移量,
  • 15位字节长度
  • 2位行指针标记

行指针的这种设计决定了数据页最大只能是32kb

另外大于2kb的堆元组会使用超大属性存储技术来单独存储数据,这是啥,有点类似MySQL的blob页。

元组读写方式

写入方式比较好理解,就是在行指针后面插入新的数据,以及在末端元组加入新数据,把新的行指针指向新加入元组,同时把数据堆表文件内部数据页的lower个upper往后和往前挪动,标记未使用空间。

读取方式分两种:

  • 第一种是通过行指针遍历,o1的查找速度
  • 第二种是BTree扫描,键存储索引值,值存储的是堆元组的tid,这个属性记录堆元组偏移量和长度信息,可以直接通过扫描堆元组找到,可以看到也是o1的速度

PostgreSQL扫描方式

  • tid扫描
  • 仅索引扫描
  • 位图扫描

进程架构

PostgreSQL是一款多进程协同配合的架构数据库,主要工作工作进程分为下面几种:

  • 服务器进程:运行PostgreSQL服务的主要进程
  • 后端进程:主要负责用户crud操作请求
  • 后台进程:负责各种维护服务端正常工作的进程以及负责各种数据库任务,比如清理缓存数据
  • 复制进程:负责流复制
  • 后台工作进程:用户可以自己编写进程,同时也是9.3引入的新功能

一共有2个后端进程,7个后台进程和2个客户端进程


服务器进程

也被叫做master进程,服务器进程主要负责整个PostgreSQL的服务启动,以及负责启动各种后端和其他工作进程的任务,如果有需要会启动复制进程和用户自己编写的进程

后端进程

后端进程需要依靠PostgreSQL启动,后端进程会在用户发出查询请求的时候被启动负责处理用户查询请求。

但是因为pgsql没有天生自带的连接池功能,所以需要配合连接池中间件减少频繁创建PostgreSQL后端进程的开销。

后台进程

后台进程的种类和工作非常丰富 要全部列举是不现实的,下面列举一些常见的后台进程

  • 后台写入进程:负责把脏页刷新回写到磁盘中
  • 检查点进程:负责处理检查点
  • 周期清理工作进程,更准确的是定时通知主进程创建工作清理进程工具
  • wal刷新进程:wal是啥后面会提到,主要工作是吧wal刷新同步
  • 日志收集进程:负责把错误日志收入到一处方便dba维护
  • 归档进场:其实还是把日志进行归档整理的一个进程。

问题:对于SQL的其他操作通过Postgresql的服务器完成相关工作。

检查是什么?检查点检查的是当前系统进程的状态,比如当前内存的脏数据页的大小,以及当前的系统运行状态等情况。

可以看到PostgreSQL的系统设计是通过小组件搭配的方式,每一个进程各司其职,使得整个工作配合的井井有条。

PostgreSQL内存结构

内存结构分为本地内存和进程共享内存。

本地内存针对每一个后端进程使用,没一个后端进程拥有独立的本地内存,这个区域会分为几个子区域,并且有的固定不变,有的可以改变,而共享的分配区域分为几个固定大小的子区域:

  • 访问控制子区域
  • 后台进程使用子区域
  • 事务处理子区域,比如2PC的特性支持。


相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍如何基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
存储 NoSQL 关系型数据库
Redis(六)set集合类型
set集合和list列表十分的相似,都可以存储多个字符串。但是list列表可以存储重复值,而set集合中不可重复。
7539 0
Redis(六)set集合类型
|
分布式计算 Java Linux
Java 生成 UUID
Java 生成 UUID
11134 1
|
SpringCloudAlibaba 监控 Dubbo
SpringCloudAlibaba篇(三)整合Sentinel(限流、流量整形、熔断降级、系统负载保护、热点防护,分布式服务架构的高可用流量防护组件)
SpringCloudAlibaba篇(三)整合Sentinel(限流、流量整形、熔断降级、系统负载保护、热点防护,分布式服务架构的高可用流量防护组件)
SpringCloudAlibaba篇(三)整合Sentinel(限流、流量整形、熔断降级、系统负载保护、热点防护,分布式服务架构的高可用流量防护组件)
|
3月前
|
缓存 弹性计算 数据挖掘
阿里云服务器经济型e与通用算力型u1实例怎么选?二则性能及适用场景区别参考
在当今数字化时代,云服务器已成为众多个人开发者、学生、小微企业以及中小企业开展业务、搭建网站、运行应用程序等不可或缺的基础设施。阿里云推出了多种类型的云服务器实例,以满足不同用户的需求。其中,经济型e实例和通用算力型u1实例备受关注。经济型e实例ECS云服务器2核2G3M带宽新购和续费同价99元1年,通用算力型u1实例2核4G5M带宽新购和续费同价199元1年(限企业用户)、4核8G云服务器955元1年。本文将为大家介绍阿里云服务器中的经济型e实例和通用算力型u1实例的特点、区别以及新手选择参考。
|
12月前
|
存储 监控 数据挖掘
飞轮科技携手观测云亮相云栖大会,全方位展示阿里云数据库 SelectDB 版核心优势
飞轮科技技术副总裁姜国强于「数据分析与洞察」专场分享[阿里云数据库 SelectDB 版在日志存储分析、实时报表生成、用户行为分析及 Lakehouse 场景应用方案
285 1
飞轮科技携手观测云亮相云栖大会,全方位展示阿里云数据库 SelectDB 版核心优势
|
11月前
|
监控 分布式数据库 Hbase
WAL 对写入性能的直接影响
WAL 对写入性能的直接影响
174 4
|
6月前
|
人工智能 自然语言处理 安全
详解:Claude 3.7 Sonnet 国内使用指南_claude使用教程
Claude 3.7在对话理解和生成能力上都进行了显著的提升
5484 14
|
11月前
|
存储 弹性计算 人工智能
阿里云弹性计算_通用计算专场精华概览 | 2024云栖大会回顾
阿里云弹性计算产品线、存储产品线产品负责人Alex Chen(陈起鲲)及团队内多位专家,和中国电子技术标准化研究院云计算标准负责人陈行、北京望石智慧科技有限公司首席架构师王晓满两位嘉宾,一同带来了题为《通用计算新品发布与行业实践》的专场Session。本次专场内容包括阿里云弹性计算全新发布的产品家族、阿里云第 9 代 ECS 企业级实例、CIPU 2.0技术解读、E-HPC+超算融合、倚天云原生算力解析等内容,并发布了国内首个云超算国家标准。
阿里云弹性计算_通用计算专场精华概览 | 2024云栖大会回顾
|
8月前
|
SQL Java 数据库连接
如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?
大家好,我是 V 哥。JSqlParser 是一个用于解析 SQL 语句的 Java 库,可将 SQL 解析为 Java 对象树,支持多种 SQL 类型(如 `SELECT`、`INSERT` 等)。它适用于 SQL 分析、修改、生成和验证等场景。通过 Maven 或 Gradle 安装后,可以方便地在 Java 代码中使用。
2548 11
|
10月前
|
Java Scala Kotlin
SpringBoot 读取配置的几种方式
本文介绍了SpringBoot中读取配置文件的几种方法,包括使用`@Value`、`Environment`和`@ConfigurationProperties`注解,以及如何通过`@PropertySource`指定配置文件位置和编码。还讲解了如何自定义工厂类以支持读取`.yaml`文件。
334 0