跳到主要内容

体系架构

前言

在PostgreSQL的体系架构中,最重要的组成部分是数据的存储结构,而数据的存储结构分为以下两种:

  • 逻辑存储结构:数据库内部组织和管理数据的方式。
  • 物理存储结构:操作系统中组织的管理数据的方式。

逻辑存储结构

逻辑存储结构主要是指数据库中的各种数据库对象,包括数据库集群、数据库、表、索引、视图等。 所有数据库对象都有各自的对象标识符(Object Identifier, OID)。OID是一个无符号的4字节整数。相关对象的OID都存储在相关的系统目录表中。

数据库集群(Database Cluster)

数据库集群是指由单个PostgreSQL服务器端实例管理的所有数据库集合。组成数据库集群的所有数据库使用相同的全局配置文件和监听端口,公用数据库的后台进程和内存结构。

一个数据库集群可以包括多个数据库、多个用户,以及数据库中的所有对象。

在文件系统中,一个数据库集群是一个单一目录,该目录被称为数据目录或数据区域,所有数据都被存储在该目录中。

数据库(Database)

在pg中,数据库本身也是数据库对象。不同的数据库在逻辑上彼此分离。处理数据库,其他数据库对象都属于它们各自的数据库。

表空间(Tablespace)

在逻辑上可以将数据库分为多个存储单元,这些存储单元被称作表空间。表空间用来把逻辑上相关的数据结构放在一起。从逻辑上来看,数据库是由一个或多个表空间组成的。

初始化数据库时会自动创建两个表空间,分别为 pg_dfaultpg_global

模式(Schema)

再创建一个数据库时,会为其自动创建一个名为 public 的默认模式。模式是数据库中的命名空间,在数据库中创建的所有其它数据对象(如表、视图和序列等)都是在模式中创建的。

一个用户可以在同一个客户端连接中访问不同的模式。而在不同的模式中可以有多个同名的表、索引、视图、序列和函数等不同的数据库对象。

段(Segment)

段时分配给一个数据对象的逻辑存储结构,由一组区间组成。段是数据库对象使用空间的集合。段分为表段、索引段、回滚段、临时段和告诉缓存段等,最常用的是表段和索引段。

区(Extent)

区是数据库存储空间分配的一个逻辑单位,由连续的块组成。如果一个段的所有空间已被占用,那么pg会自动为该段分配一个新的区。

块(Block)

块是pg管理数据文件中存储空间的单位,是数据库使用的IO的最小单位,是最小的逻辑存储单位,默认值为 8KB。

物理存储结构

在初始化数据库完成后,数据目录下会有以下目录和文件。这里以15.3版本为例

-rw------- 1 postgres postgres    3 Jan 18 22:00 PG_VERSION
drwx------ 1 postgres postgres 6 Jan 18 22:00 base
drwx------ 1 postgres postgres 616 Jan 19 20:36 global
drwx------ 1 postgres postgres 0 Jan 18 22:00 pg_commit_ts
drwx------ 1 postgres postgres 0 Jan 18 22:00 pg_dynshmem
-rw------- 1 postgres postgres 4.8K Jan 18 22:00 pg_hba.conf
-rw------- 1 postgres postgres 1.6K Jan 18 22:00 pg_ident.conf
drwx------ 1 postgres postgres 76 Jan 19 20:40 pg_logical
drwx------ 1 postgres postgres 28 Jan 18 22:00 pg_multixact
drwx------ 1 postgres postgres 0 Jan 18 22:00 pg_notify
drwx------ 1 postgres postgres 0 Jan 18 22:00 pg_replslot
drwx------ 1 postgres postgres 0 Jan 18 22:00 pg_serial
drwx------ 1 postgres postgres 0 Jan 18 22:00 pg_snapshots
drwx------ 1 postgres postgres 0 Jan 19 20:35 pg_stat
drwx------ 1 postgres postgres 0 Jan 18 22:00 pg_stat_tmp
drwx------ 1 postgres postgres 8 Jan 18 22:00 pg_subtrans
drwx------ 1 postgres postgres 0 Jan 18 22:00 pg_tblspc
drwx------ 1 postgres postgres 0 Jan 18 22:00 pg_twophase
drwx------ 1 postgres postgres 76 Jan 18 22:00 pg_wal
drwx------ 1 postgres postgres 8 Jan 18 22:00 pg_xact
-rw------- 1 postgres postgres 88 Jan 18 22:00 postgresql.auto.conf
-rw------- 1 postgres postgres 29K Jan 18 22:00 postgresql.conf
-rw------- 1 postgres postgres 36 Jan 19 20:35 postmaster.opts
-rw------- 1 postgres postgres 94 Jan 19 20:35 postmaster.pid

文件和目录说明

文件或目录说明
PG_VERSION版本信息
base各个数据库文件
global集群范围的各个表和相关视图
pg_commit_ts已提交事务的时间
pg_dynshmem动态共享内存子系统使用的文件
pg_hba.conf客户端认证控制文件,用于黑白名单的设置
pg_ident.conf用来配置哪些操作系统用户可以映射为数据库用户
pg_logical逻辑解码的状态数据
pg_multixact多事务的状态数据,比如等待锁定的并发事务
pg_notify包含LISTEN/NOTIFY状态数据
pg_replslot复制槽数据
pg_serial已经提交的序列化事务的有关信息
pg_snapshots导出的快照
pg_stat统计子系统的永久文件
pg_stat_tmp统计子系统的临时文件
pg_subtrans子事务的状态数据
pg_tblspc表空间的符号链接信息
pg_twophase预备事务的状态文件
pg_wal数据库的预写日志
pg_xact事务提交的状态数据
postgresql.auto.conf参数文件,只保留 alter system 命令修改的参数
postgresql.conf主参数文件
postmaster.opts记录服务器最后一次启动时使用的命令行参数
postmaster.pidpid文件

日志文件

postgresql的日志分为运行日志、预写日志、事务日志和服务器日志。

运行日志

默认情况下,运行日志不开启。postgresql.conf 中相关配置参数有:log_destinationlogging_collectorlog_directorylog_filename

预写日志

pgsql在对数据文件进行修改时,必须先写入预写日志,才能更改数据文件。当数据库因宕机发生数据丢失时,可以根据预写日志来恢复数据。