PostgreSQL的核心架构

本文详细介绍了PostgreSQL数据库的主进程Postmaster及其启动的辅助子进程,如Logger、BgWriter、WalWriter等的功能和作用,以及逻辑存储结构、物理存储结构,特别是表空间和WAL日志的组织方式。
摘要由CSDN通过智能技术生成

1. 进程及内存结构

在这里插入图片描述

1.1 主进程Postmaster介绍

1)启动PostgreSQL数据库时,会先启动一个叫Postmaster的主进程,还会fork出一些辅助子进程,这些辅助子进程各自负责一部分功能。辅
助子进程的分类如下:
·Logger(系统日志)进程。
·BgWriter(后台写)进程。
·WalWriter(预写式日志)进程。
·PgArch(归档)进程。
·AutoVacuum(系统自动清理)进程。
·PgStat(统计信息收集)进程。

2)PostgreSQL数据库的主要功能都集中于Postgres程序,该程序位于安装目录的bin目录下
[pgsql@pg2 ~]$ which postgres
/postgresql/pg13/bin/postgres
[pgsql@pg2 ~]$ ls -l /postgresql/pg13/bin/postgres
-rwxr-xr-x. 1 pgsql pgsql 8284296 Jul 27 04:35 /postgresql/pg13/bin/postgres

3)主进程Postmaster是整个数据库实例的总控进程,负责启动和关闭该数据库实例,,postmaster命令是一个指向Postgres的链接
[pgsql@pg2 ~]$ ls -l /postgresql/pg13/bin/postmaster 
lrwxrwxrwx. 1 pgsql pgsql 8 Jul 27 04:35 /postgresql/pg13/bin/postmaster -> postgres

4)fork出的子进程称为服务进程
postgres=# select pid,usename,client_addr,client_port from pg_stat_activity;
  pid  | usename  | client_addr | client_port 
-------+----------+-------------+-------------
 10387 | postgres |             |          -1
  1493 |          |             |            
  1498 |          |             |            
  1497 |          |             |      
PS:当某个服务进程出现错误的时候,Postmaster主进程会自动完成系统恢复。恢复过程中会停掉所有的服务进程,然后进行数据库数据的一致性恢复,等恢复完成后,数据库才可以接受新的连接。 

1.2 Logger系统日志进程介绍

--只有在参数logging_collect设置为“on”时,主进程才会启动Logger辅助进程。

1.3 BgWriter后台写进程介绍

在PostgreSQL中,BgWriter辅助进程是把共享内存中的脏页写到磁盘上的进程。当向数据库中插入或更新数据时,并不会马上把数据持久
化到数据文件中。这主要是为了提高插入、更新、删除数据的性能。BgWriter辅助进程可周期性地把内存中的脏数据刷新到磁盘中,刷新频
率既不能太快,也不能太慢。如果一个数据块被改变了多次,而此时刷新频率又太快,那么这些改变每次都会被保存到磁盘中,这会导致I/O
次数增多。在刷新频率太慢的情况下,若有新的查询或更新需要使用内存来保存从磁盘中读取的数据块时,由于没有空闲空间来存储这些数据
块,就需要把内存腾出来,即先把一些内存中的脏页写到磁盘中,这样就会导致查询或更新需要等更长的时间,自然就会降低性能。

1.4 WalWriter预写式日志写进程介绍

WAL是Write Ahead Log的缩写,中文名称为“预写式日志”。WAL日志也被简称为“xlog”。WalWriter进程就是写WAL日志的进程。预写
式日志的概念就是,在修改数据之前必须把这些修改操作记录到磁盘中,这样后面更新实际数据时就不需要实时地把数据持久化到文件中
了。如果机器突然宕机或数据库异常退出,导致一部分内存中的脏数据没有及时地刷新到文件中,在数据库重启后,通过读取WAL日志把最
后一部分的WAL日志重新执行一遍,就可以将数据库恢复到宕机时的状态。WAL日志保存在pg_xlog下。xlog文件的默认大小是16MB,为了满
足恢复要求,在xlog目录下会产生多个WAL日志,这样就可以保证在宕机后,未持久化的数据都可以通过WAL日志来恢复,那些不需要的
WAL日志会被自动覆盖。

1.5 PgArch归档进程

WAL日志会循环使用,也就是说,较早期的WAL日志会被覆盖。PgArch归档进程会在覆盖前把WAL日志备份出来。PostgreSQL从8.X版
本开始提供PITR(Point-In-Time-Recovery)技术,通俗来讲,就是在对数据库进行过一次全量备份后,使用该技术将备份时间点之后的WAL
日志通过归档进行备份,使用数据库的全量备份再加上后面产生的WAL日志,即可把数据库向前回滚到全量备份后的任意一个时间节点了。

1.6 AutoVacuum自动清理进程

在PostgreSQL数据库中,对表进行DELETE操作后,原有数据并不会立即被删除,而且在更新数据时,也并不会在原有数据上做更新,而
是会新生成一行数据。此时,原有数据只是被标识为删除状态,只有在没有并发的其他事务读到这些旧数据时,才会将其清除。这个清除工作就是由
AutoVacuum进程来完成的。

1.7 PgStat统计数据收集进程

PgStat辅助进程主要做数据的统计收集工作。收集的信息主要用于查询优化时的代价估算,这些信息包括在一个表和索引上进行了多少次
插入、更新、删除操作,磁盘块读写的次数,以及行的读次数。系统表pg_statistic中存储了PgStat收集的各类统计信息。

1.8 共享内存

PostgreSQL启动后会生成一块共享内存,共享内存主要用作数据块的缓冲区,以便提高读写性能。WAL日志缓冲区和CLOG(Commit
Log)缓冲区也存在于共享内存中。除此以外,一些全局信息也保存在共享内存中,如进程信息、锁的信息、全局统计信息等。
PostgreSQL 9.3之前的版本与Oracle数据库一样,都是使用SystemⅤ类型的共享内存,但自PostgreSQL 9.3版本之后,PostgreSQL使用
mmap()方式的共享内存。使用这种共享内存的好处是无须再配置SystemⅤ共享内存的内核参数kernel.shmmax和kernel.shmall,就能使用
较大的共享内存。

在这里插入图片描述

1.9 本地内存

后台服务进程除访问共享内存以外,还会申请分配一些本地内存,以便暂存一些不需要全局存储的数据。这些内存缓冲区主要有以下几
个:
·临时缓冲区:用于访问临时表的本地缓冲区。
·work_mem:内部排序操作和Hash表在使用临时磁盘文件之前使用的内存缓冲区。
·maintenance_work_mem:在维护性操作(比如VACUUM、CREATE INDEX和ALTER TABLE ADD FOREIGN KEY等)中使用的
内存缓冲区。

2 存储结构

对于数据库来说,存储结构一般分为逻辑存储结构和物理存储结构。逻辑存储结构通常指表、索引、视图、函数等逻辑对象,在本书中
逻辑对象也称为数据库对象。物理存储结构表示数据库在物理层面上是如何存储的

2.1 逻辑存储结构

在PostgreSQL中,逻辑对象是有层次关系的,数据库创建后,有一个叫数据库簇的概念,虽然数据库簇的英文为database cluster,但它并
不是数据库集群的意思,故而翻译为数据库簇。在数据库簇中可以创建很多数据库(使用create database创建),也就是说,数据库簇相当于是
一个数据库的容器。而PostgreSQL中的database与MySQL中的Database完全不是一个概念,PostgreSQL的Database是一个多租户的概念,与
Oracle 12C的Pluggable Database类似,主要实现租户隔离。在Database下,可以有多个模式(Schema)

在这里插入图片描述

2.2 软件目录结构

在这里插入图片描述

2.3 物理存储结构

一般使用环境变量PGDATA指向数据目录的根目录。该目录是在安装时指定的,所以在安装时需要指定一个合适的目录作为数据目录的根
目录,而且每一个数据库实例都需要一个根目录。目录的初使化是使用initdb来完成的,初始化完成后,数据根目录下就会生成以下6个配置文
件。
·postgresql.conf:此数据库实例的主配置文件,基本上所有的配置参数都在此文件中。
·postgresql.auto.conf:使用ALTER SYSTEM修改的配置参数存储在该文件中(PostgreSQL 9.4及更高版本)。
·pg_hba.conf:认证配置文件,用于配置允许哪些IP的主机访问数据库、认证的方法是什么等信息。
·pg_ident.conf:ident认证方式的用户映射文件。
·PG_VERSION:存储PostgreSQL主版本号。
·postmaster.opts:记录服务器上次启动的命令行参数。
·此目录下还会生成如下子目录。
·base:默认表空间的目录。
·global:一些共享系统表的目录。
·log:程序日志目录,在查询一些系统错误时可查看此目录下的日志文件。在10版本之前此目录是“pg_log”。
·pg_commit_ts:视图提交的时间戳数据(PostgreSQL 9.5及更高版本)。
·pg_dynshmem:动态共享内存子系统使用的文件(PostgreSQL 9.4及更高版本)。
·pg_logical:逻辑复制的状态数据(PostgreSQL 9.4及更高版本)。
·pg_multixact:多事务状态数据。
·pg_notify:LISTEN/NOTIFY状态数据。
·pg_repslot:复制槽数据(PostgreSQL 9.4及更高版本)。
·pg_serial:已提交的可串行化事务相关信息(PostgreSQL 9.1及更高版本)。
·pg_snapshot:PostgreSQL函数“pg_export_snapshot”导出的快照信息文件(PostgreSQL 9.2及更高版本)。
·pg_stat:统计子系统的永久文件。
·pg_stat_tmp:统计子系统的永久文件。
·pg_subtrans:子事务状态数据。
·pg_tblsp:存储了指向各个用户自建表空间实际目录的链接文件。
·pg_twophase:使用两阶段提交功能时分布式事务的存储目录。
·pg_wal:WAL日志的目录,在PostgreSQL 10版本之前此目录是“pg_xlog”。
·pg_xact:Commit Log的目录,在PostgreSQL 10版本之前此目录是“pg_clog”。

在默认表空间的base目录下有很多子目录,这些子目录的名称与相应数据库的OID相同
postgres=# select oid, datname from pg_database;
  oid  |  datname  
-------+-----------
 13581 | postgres
 16386 | test
     1 | template1
 13580 | template0
 16391 | repmgr

[pgsql@pg2 pgdata]$ ll $PGDATA/base 
total 60
drwx------ 2 pgsql pgsql 8192 Jul 30 22:36 1
drwx------ 2 pgsql pgsql 8192 Jul 30 22:36 13580
drwx------ 2 pgsql pgsql 8192 Sep 14 05:42 13581
drwx------ 2 pgsql pgsql 8192 Sep 14 05:42 16386
drwx------ 2 pgsql pgsql 8192 Sep 12 10:51 16391

2.4 表空间的目录

1)对于用户创建的表空间,相当于一个对应的目录,在创建完一个表空间后,会在表空间的根目录下生成带有“Catalog version”的子目录
postgres=# CREATE TABLESPACE tbs01 LOCATION '/postgresql/pgdata/tbspace';
WARNING:  tablespace location should not be inside the data directory
CREATE TABLESPACE

[pgsql@pg1 tbspace]$ ll /postgresql/pgdata/tbspace/
drwx------ 2 pgsql pgsql 6 Sep 14 23:24 PG_13_202007201

2)子目录“PG_13_202007201”中的“13”代表大版本,而“202007201”就是“Catalog version”,“Catalog version”可以由pg_controldata命令查询出
来:
[pgsql@pg1 pgdata]$ pg_controldata |grep "Catalog version number"
Catalog version number:               202007201

3)PG_13_202007201子目录下,又会有一些子目录,这些子目录的名称就是数据库的oid
postgres=# create table a(id int) tablespace tbs01;
[pgsql@pg1 PG_13_202007201]$ ll /postgresql/pgdata/tbspace/PG_13_202007201/
drwx------ 2 pgsql pgsql 19 Sep 14 23:31 13581

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韶博雅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值