PG内核解读-第2节PostgreSQL体系结构

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB PostgreSQL 版,企业版 4核16GB
推荐场景:
HTAP混合负载
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: 本文整理自阿里云数据库开源社区Maintainer于巍(花名漠雪),在PostgreSQL数据库内核解读系列的分享。本篇内容主要分为三个部分:1. PostgreSQL系统表2. PostgreSQL初始化、启动、查询流程3. PostgreSQL辅助进程


PG内核解读-第2节PostgreSQL体系结构

 

一、PostgreSQL系统表

image.png

系统表又叫database catalog。数据库实例的数据库目录由元数据组成,其中存储了数据库对象的定义。SQL标准指定了访问目录的统一方法,称为INFORMATION_SCHEMA。


在关系数据库中,信息模式(information_schema)是一组ANSI标准的只读视图,提供有关数据库中所有表、视图、列和过程的信息。它可以作为某些数据库,通过非标准命令提供信息的来源。例如MySQL的SHOw命令;Oracle的SQL*Plus的DESCRIBE命令;PostgreSQL的默认命令行程序。


image.png

在设计一个系统时,最先需要设计的数据结构是系统表。大多数系统表都是在数据库创建的过程中从模版数据库中拷贝过来的,因此都是数据库相关的。少数表是在整个安装中物理上所有数据库共享的。

image.png

用户可以输入:‘\d+pg_class’查看pg_class定义,pg_class记录了所有表、视图信息。


用户可以通过PG手册了解每个系统表的定义。相关链接如下:

https://www.postgresql.org/docs/current/catalogs-overview.html

https://www.postgresql.org/docs/current/catalog-pg-class.html

https://www.postgresql.org/docs/current/views-overview.html

用户也可以通过SQL语句,查看和筛选namespace系统表中的信息。

除此之外,用户可以通过查看database系统表信息

image.png

用户如何使用系统表呢?首先,用户可以查看系统中表的相关信息,例如select*from pg_class。


其次,用户可以对表进行调优,设置库命中率,表命中率以及调整表的大小。

除此之外,PG提供了一种跟踪服务器,能够执行所有SQL语句的规划和统计信息,即pg_stat_statements。


用户可以通过查询pg_stat_statements视图,得到数据库资源开销的统计信息。SQL语句中的一些过滤条件在pg_stat_statements中,会被替换成变量,从而减少重复显示的问题。

image.png

PostgreSQL的系统表的相关文件目录如下,大家可以根据自己的需要进行查找:

/home/michael.yw/postgres/src/backend/catalog

OID是PostgreSQL内部用于标识数据库对象的标识符,包括数据表,视图,存储过程等。OID在系统表中通常是作为隐藏列存在,在PostgreSQL数据库实例的范围内进行统一分配。


由于OID是系统表的隐藏列,所以用户在查看系统表中数据库对象的OID时,必须在SELECT语句中显式指定。


image.png

当用户有了一个系统表,在进程启动时,需要建立SysCache(CatCache)和RelCache缓存系统表的信息。


RelCache、CatCache和PlanCache加速系统访问,减少占用的资源。其中,relcache.c中存放了最近访问过的普通表缓存,RelCache使用Hash表进行管理。

image.png

如上图所示,用户可以通过命令:select*from pg_class,查询系统表的相关信息。

image.png

用户可以通过命令,查询系统表中的某一张表,用户可看到文件对应的编号。相关命令如下:

select oid,relname,relfilenode from pg_class where relname='t1'

image.png 

如上图所示,系统的库命中率达到了0.998。当用户需要查询库命中率,需要执行如下命令:

select blks_read,blks_hit,

blks_hit::numeric/(blks_read+blks_hit)as ratio

from pg_stat_database

where datname='postgres'

image.png 

当用户需要查询表命中率时,相关命令如下:

SELECT relname,heap_blks_read,heap_blks_hit,

round(heap_blks_hit::numeric/(heap_blks_hit+heap_blks_read),3)

FROM pg_statio_user_tables

WHERE heap_blks_read>0

ORDER BY 2 DESC

image.png 

当用户需要查询表的大小时,需要执行以下命令:

select relname,pg_size_pretty(pg_relation_size(relid))from pg_stat_user_tables where schemaname='public'order by pg_relation_size(relid)desc

image.png 

接下来,查询前五名最耗IO的SQL,相关命令如下:

select*from pg_stat_statements order by(blk_read_time+blk_write_time)desc limit 5

image.png 

接下来,查询前五名单次调用最耗时的SQL,相关命令如下:

select userid::regrole,dbid,query from pg_stat_statements order by mean_time desc limit 5

image.png 

接下来,如上图所示在catlog的目录下,查看系统表的相关文件,相关目录如下:/home/michael.yw/postgres/src/backend/catalog

image.png 

接下来,查看SysCache(CatCache)和RelCache。

 

二、PostgreSQL初始化、启动、查询流程

image.png 

在PostgreSQL初始化过程中,用户在编译阶段,通过genbki.pl获得postgres.bki。然后通过InitDB创建目录,bootstrap_templatel-利用BKI脚本在bootstrap模式生成templatel数据库。make_templateo-拷贝templatel生成template0,template0不接收连接,不可修改。

image.png 

PostgreSQL有三种启动模式,分别是Postmaster、bootstrap和single通过这三种方法,用户创建TopMemoryContext,信号处理函数、加载GUC参数、监听端口。


当用户收到新用户请求,建立新的backend处理请求,共享内存,开始辅助进程启动。

image.png 

上图是PostgreSQL执行流程。Client App通过Interface Library,连到Post master进行监听,创建一个Postgres Server进行服务,收到SQL之后,进行解析,生成Parse tree,判断类型和执行路径之后,进行优化。

image.png 

路径优化之后,形成plan tree并在执行器里执行,然后用不同的方法提取数据,将最终结果返回给客户。

image.png 

初始化流程中,PostgreSQL在编译阶段,检查生成OID。通过命令setap.pgdata,以PGIDATA环填变量生成数捆目录路径。


通过initialize_data_directory初始化数据目录。用命令create_data_directory,创建数据目录。通过命令setup_confg,生成配置文件并修改。命令bootstrap_template,利用BKI脚本在bootstrap模式生成templatel数据库。


最终,setup_sysviews基于system_views_file,生成sysview。

setup_schema基于information_schema.sql"生成系统表。


make_templateo-拷贝templatel生成template0,template0不接收连接,不可修改。


make_postgres-拷贝templatel生成postgres库。

image.png 

接下来,演示PostgreSQL的启动流程。当PostgreSQL通过Postmaster启动时,通过AllocSetContextCreate(TopMemoryContext),创建TopMemoryContext。然后,通过pqsignal_pm(SIGHUP,SIGHUP_handler),设置信号处理函数;用户通过InitializeGUCOption,加载GUC参数。


用户通过StreamServerPort建立监听端口,然后,完成创建共享内存及互斥变量。通过命令SysLogger_Start,启动日志进程。


当用户完成启动Startup回放进程,启动注册worker进程之后,通过ServerLoop建立循环。其中,BackendStartup负责创建服务进程。然后开始共享内存,启动辅助进程。

 

三、PostgreSQL辅助进程

image.png 

上图展示了PostgreSQL的部分辅助进程。


postmaster和postgres是一个进程,只是启动方式不同。当用户与postgresql数据库建立连接时,先与postmaster进程建立连接,postmaster会fork出一个子进程来为这个连接服务。fork出的子进程为服务进程。


Syslogger是指系统日志进程,当用户打开日志,它就会收集日志信息。只有在参数logging_collect设置为“on”时,主进程才会启动syslogger辅助进程。


syslogger辅助进程通过从postmaster进程、所有的服务进程及其他辅助进程,收集所有的stderr输出,并将这些输出写入到日志文件中。


bgwriter是指辅助进程,把共享内存中的脏页,写到磁盘上的进程。bgwriter辅助进程可周期性的把内存中的脏数据,刷新到磁盘中。


walwriter是指预写式日志写进程,wal是writer ahead log的缩写,中文称之为预写式日志。wal log也被简称为xlog。walwriter进程就是写wal日志的进程,预写式日志的概念就是在修改数据之前,必须要把这些修改操作记录在磁盘中。

在数据库重启后,通过读取wal日志,把最后一部分的wal日志重新执行一遍,就可以恢复到宕机时的状态。


pgarch是指归档进程,由于wal日志会被循环使用较早时间的wal日志会被覆盖,pgarch进程会在覆盖前把wal日志备份出来。


autovacuum是指自动清理进程在PG数据库中,对表进行DELETE操作后,旧的数据并不会立即被删除此时旧数据只是被标识未删除状态只有并发的其他事务,不会读到这些旧数据时,它们才会被删除,这个清除工作就是由autovacuum进程来完成的。


pgstat是指统计数据收集进程pgstat辅助进程主要做数据的统计收集工作,收集的信息主要用于查询优化的代价估算系统表pg_statistic中存储了pgstat收集的各类统计信息

image.png 

接下来,演示PG后台的部分进程参数及扩展。

image.png 

由于PostgreSQL将旧版本存放relation文件中,所以dead tuple很多。随着relation文件不断增大,导致空间不断膨胀。


为了解决这个问题,PG引入了vacuum后台进程,专门来清理dead tuple,并回缩空间。用户一般不需要手动操作vacuum,autovacuum会自动对表进行vacuum操作。


  • autovacuum进程会自动执行VACUUM和ANALYZE命令。autovacuum启用后,自动清理,更新或删除。
  • 接下来,介绍一些常用的vacuum命令。
  • autovacuum_max_workers用于配置autovacuum worker的个数
  • autovacuum_freeze_max_age可以指定表上事务的最大年龄,一般默认为2亿,达到这个阀值将触发autovacuum进程,从而避免wraparound。表上的事务年龄可以通过pg_class.relfrozenxid查询。
  • autovacuum_analyze_threshold和autovacuum_analyze_scale_factor参数可以控制analyze的触发的频率。
  • vacuum_cost_delay:计算每个毫秒级别所允许消耗的最大IO,vacuum_cost_limit/vacuum_cost_dely。默认vacuum_cost_delay为20毫秒。
  • vacuum_cost_limit:当超过此值时,vacuum会sleep。默认值为200。
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
1月前
|
存储 关系型数据库 Java
polardb有没有搞过pg 全量及增量备份管理的
【1月更文挑战第3天】【1月更文挑战第11篇】 polardb有没有搞过pg 全量及增量备份管理的
52 1
|
1月前
|
存储 关系型数据库 分布式数据库
【PolarDB开源】深入PolarDB内核:探究存储计算分离架构的设计哲学
【5月更文挑战第20天】PolarDB是阿里巴巴的云原生分布式数据库,以其存储计算分离架构为核心,解决了传统数据库的扩展性和资源灵活性问题。该架构将数据存储和计算处理分开,实现高性能(通过RDMA加速数据传输)、高可用性(多副本冗余保证数据可靠性)和灵活扩展(计算资源独立扩展)。通过动态添加计算节点以应对业务流量变化,PolarDB展示了其在云时代应对复杂业务场景的能力。随着开源项目的进展,PolarDB将持续推动数据库技术发展。
82 6
|
1月前
|
SQL 关系型数据库 分布式数据库
|
20天前
|
关系型数据库 分布式数据库 数据库
PolarDB产品使用合集之诊断内核问题时,除了增加日志还有什么诊断手段
PolarDB是阿里云推出的一种云原生数据库服务,专为云设计,提供兼容MySQL、PostgreSQL的高性能、低成本、弹性可扩展的数据库解决方案,可以有效地管理和优化PolarDB实例,确保数据库服务的稳定、高效运行。以下是使用PolarDB产品的一些建议和最佳实践合集。
|
1月前
|
关系型数据库 Serverless 分布式数据库
高峰无忧,探索PolarDB PG版Serverless的弹性魅力
在数字经济时代,数据库成为企业命脉,面对爆炸式增长的数据,企业面临管理挑战。云原生和Serverless技术革新数据库领域,PolarDB PG Serverless作为阿里云的云原生数据库解决方案,融合Serverless与PostgreSQL,实现自动弹性扩展,按需计费,降低运维成本。它通过计算与存储分离技术,提供高可用性、灾备策略和简化运维。PolarDB PG Serverless智能应变业务峰值,实时监控与调整资源,确保性能稳定。通过免费体验,用户可观察其弹性性能和价格力,感受技术优势。
|
1月前
|
关系型数据库 测试技术 Serverless
5分钟免费体验PolarDB PG版Serverless的极致弹性!
基于阿里云瑶池数据库解决方案体验馆,带你体验PolarDB PG版 Serverless形态下的性能压测环境,基于可选择的标准压测工具进行压测,构造弹性场景进行压测,实时动态展示弹性能力、价格和性价比结果,压测环境可开放定制修改、可重复验证。参与活动即有机会获得小爱随身音响、体脂秤、极客时间VIP月卡、鼠标垫等精美礼品。
|
1月前
|
负载均衡 监控 关系型数据库
PostgreSQL从小白到高手教程 - 第48讲:PG高可用实现keepalived
PostgreSQL技术大讲堂 - 第48讲:PG高可用实现keepalived
98 1
|
1月前
|
SQL 关系型数据库 数据库
PostgreSQL从小白到高手教程 - 第44讲:pg流复制部署
PostgreSQL技术大讲堂 - 第44讲:pg流复制部署
103 0
|
1月前
|
安全 关系型数据库 数据库
上新|阿里云RDS PostgreSQL支持PG 16版本,AliPG提供丰富自研能力
AliPG在社区版16.0的基础上,在安全、成本、可运维性等多个方面做了提升,丰富的内核/插件特性支持,满足业务场景的需求
|
1月前
|
SQL 关系型数据库 数据库
postgresql|数据库|pg数据库的文件系统详解---最全面的解析
postgresql|数据库|pg数据库的文件系统详解---最全面的解析
235 0

相关产品

  • 云原生数据库 PolarDB