PostgreSQL数据库启动时会启动若干个进程,其中有Postmaster(守护进程)、postgres(服务进程)、syslogger、checkpointer、bgwriter、walwriter等辅助进程
1.进程和内存架构图

Postgresql数据库启动时,先启动一个叫 Postmaster 的主进程。它会fork 出一些辅助子进程,这些辅助子进程各自负责自己的功能。主要辅助子进程如下:
SysLogger(系统日志)进程 #需要打开参数logging_collector=on
BgWriter(后台写)进程
WalWriter(预写式日志)进程
PgArch(归档)进程 #需要打开参数archive_mode=on
AutoVAcuum(系统自动清理)进程
PgStat(统计收集)进程
以下图的版本是PostgreSQL15,其中统计收集被优化了

2.架构详解:
Postmaster进程
Postmaster是守护进程,实际上是第一个postgres进程,主要职责有:
• 数据库的启停
• 监听客户端连接
• 为每个客户端连接衍生(fork)专用的postgres服务进程
• 当postgres进程出错时尝试修复
• 管理数据文件
• 管理数据库的辅助进程
postgres进程
Postgres进程是实际上是postmaster的子进程:
• 直接与客户端进程通讯
• 负责接收客户端所有的请求
• 包含数据库引擎,负责解析SQL和生成执行计划等
• 根据命令的需要调用各中辅助进程和访问各内存结构
• 负责返回命令执行结果给客户端
• 在客户端断开连接时释放进程
本地内存
• 本地内存是服务器进程独占的内存结构,每个postgre子进程都会分配一小块相应内存空间,随着连接会话的增加而增加,它不属于实例的一部分
• work_mem:用于排序的内存
• maintenance_work_mem:用于内部运维工作的内存,如VACUUM垃圾回收、创建和重建索引等等
• temp_buffers:用于存储临时表的数据
数据库实例
• 实例是管理和访问数据库的一套方法,即所有客户端的请求,最终都会转换成实例对数据库磁盘文件的各种操作,从而达到读写数据的目的
• 一个实例包含多个数据库
• 实例包含了若干个内存结构和进程
共享内存
• Shared Buffer:
– 用于缓存表和索引的数据块
– 数据的读写都是直接对BUFFER操作的,若所需的块不再缓存中,则需要从磁盘中读
取
– 在buffer中被修改过的,但又没有写到磁盘文件中的块被称之为脏块
– 由shared_buffers参数控制尺寸
• WAL(Write Ahead Log) Buffer:
– 预写日志缓存用于缓存增删改等写操作产生的事务日志
– 由wal_buffers参数控制尺寸
• Clog Buffer:
– Commit Log Buffer是记录事务状态的日志缓存
辅助进程
• Backgroup writer:
– 工作任务是将shared buffer中的脏数据页写到磁盘文件中
– 使用LRU算法进行清理脏页
– 平时多在休眠,被激活时工作
• Autovacuum launcher/workers:
– 自动清理垃圾回收进程
– 当参数autovacuum设为on的时候启用自动清理功能
– Launcher为清理的守护进程,每次启动的时候会调用一个或多个worker
– Worker是负责真正清理工作的进程,由autovacuum_max_workers参数设定其数量
• WAL writer:
– 将预写日志写入磁盘文件
– 触发时机:
• WAL BUFFER满了
• 事务commit时;
• WAL writer进程到达间歇时间时;
• checkpoint发生时;
• Checkpoint:
– 用于保证数据库的一致性
– 它会触发bgwriter和wal writer动作
– 拥有多个参数控制其启动的间隔
– 采集PostgreSQL的运行状态,并将运行日志写入日志文件
– logging_collector参数为on时启动,不建议关闭
– log_directory设定日志目录
– log_destination设定日志输出方式,甚至格式
– log_filename设定日志文件名
– log_truncate_on_rotation设定是否重复循环使用且删除日志
– log_rotation_age设定循环时间
– log_rotation_size设定循环的日志尺寸上线
• Archiver:
– 用于将写满的WAL日志文件转移到归档目录,该进程只有在归档模式才会启用
• Statistics Collector:
– 统计信息的收集进程。收集表和索引的空间信息和元组信息等,甚至是表的访问信
息。收集到的信息除了能被优化器使用以外,还有autovaccum也能利用,甚至给数
据库管理员作为数据库管理的参考信息
数据库 Database cluster
• PostgreSQL在磁盘上的一整套文件集合叫做database cluster
• 数据库包含了数据文件、日志文件等多种文件,用于存储用户数据和保证数据一致性
3.PostgreSQL目录结构
1.安装目录结构
Postgresql安装目录下,可以在安装编译时指定安装目录,软件目录结构如下:


2.数据库data数据目录

• base: 该目录包含数据库用户所创建的各个数据库,同时也包括postgres、 template0和template1的pg_default tablespace
• pg_wal:该目录包含wal日志,WAL日志目录,非常重要。
日志文件默认为16M,编译安装时可指定大小: --with-wal-segsize=64( 64M)
格式:000000010000000000000008
当空间不足,导致数据库启动不了。可以把比较旧的xlog移动到别的目录。
wal_keep_segments=100 保留文件数。占用空间wal_keep_segments*16M
• log: 该目录包含数据库日志。 (目录名可自定义)
• global: 该目录包含集群范围的各个表和相关视图。 ( pg_database、 pg_tablespace )
• pg_clog: 该目录包含事务提交状态数据。文件并不大,不需要特别维护。
• pg_multixact: 该目录包含多事务状态数据(等待锁定的并发事务)
• pg_notify :该目录包含LISTEN/NOTIFY状态数据。
• pg_serial:该目录包含了已经提交的序列化事务的有关信息。
• pg_snapshots:该目录包含导出的快照。
• pg_stat_tmp:该目录包含统计子系统的临时文件。
• pg_subtrans:该目录包含子事务状态数据。
• pg_tblspc:该目录包含表空间的符号链接。
• pg_twophase:该目录包含预备事务的状态文件。
• pg_commit_ts:该目录包含已提交事务的时间。
• pg_dynshmem:该目录包含动态共享内存子系统使用的文件。
• pg_logical:该目录包含逻辑解码的状态数据。
• pg_replslot:该目录包含复制槽数据。
• pg_stat:该目录包含统计子系统的永久文件。
• PG_VERSION:包含版本信息。
• pg_hba.conf:客户端认证配置文件,可以配置客户的连接协议、加密方式、 ACL等等• pg_xact: Commit log目录,非常重要。 V9版本以前为pg_clog目录
• postgresql.conf: 该database cluster的配置文件,文本格式
• postgresql.auto.conf: 也是参数配置文件,所有通过alter命令修改的命令,都会保存在这个文件中,该文件中的参数将会覆盖postgresql.conf文件相同参数的值,该文件为二进制
• postmaster.pid:Postmaster主进程的操作系统PID,数据库实例正常启动以后就会生成该文件。




