进程概述
PostgreSQL 系统的主要功能都集中于 Postgres 程序,其入口是 Main 模块中的 main 函数,在初始化数据集簇、启动数据库服务时,都将从这里开始执行。
PostgreSQL 使用一种专用服务器进程体系结构,其中最主要的两个进程就是守护进程 Postmaster 和服务进程 Postgres 。从本质上来说,Postmaster 和 Postgres 都是通过载入 Postgres 程序而形成的进程,只是在运行时所处的分支不同而已。守护进程 Postmaster 负责整个系统的启动和关闭。它监听并接受客户端的连接请求,为其分配服务进程 Posgres 。服务进程 Postgres 接受并执行客户端发送的命令。它在底层模块(如存储、事务管理、索引等)之上调用各个主要的功能模块(如编译器、优化器、执行器等),完成客户端的各种数据库操作,并返回执行结果。
PostgreSQL 守护进程 Postmaster 除为用户连接请求分配后台Postgres 服务进程外,还将启动相关的后台辅助进程:
- SysLogger (系统日志进程)
- CheckPoint (检查点进程)
- BgWriter (后台写进程)
- WalWriter (预写式日志写进程)
- AutoVacuum (系统自动清理进程)
- PgStat (统计数据收集进程)
- PgArch (预写式日志归档进程)
这些辅助进程的用途在下一节有详细介绍。
详细说明
守护进程 Postmaster
负责整个系统的启动和关闭、后端崩溃时重置系统;管理各服务进程的初始化、启动和恢复;调用 ServerLoop 循环遍历监听套接字等待客户 端的连接请求,当收到客户端链接请求时,fork 一个服务进程。客户端连接通过该进程执行各种命令。同时 Postmaster 还管理与数据库运行相关的辅助进程。
服务进程 Postgres
接收用户的操作命令请求,并将结果返回给用户。如此循环,直到用户断开连接。
辅助进程
Syslogger 进程
系统日志进程,负责收集所有进程的stderr输出,并将这些输出写入到日志文件中。
CheckPoint 进程
检查点进程,检查点是系统设置的事务序列点,设置检查点保证检查点前的日志信息更新到磁盘中。
BgWriter 进程
BgWriter 进程是把共享内存中的脏页写到磁盘上的进程。它的作用有两个:
一是定期把脏数据从内存缓冲区刷出到磁盘中,减少查询时的阻塞;
二是数据库在定期作检查点时需要把所有脏页写出到磁盘,通过 BgWriter 预先写出一些脏页,可以减少设置检查点(CheckPoint,数据库恢复技术的一种)时要进行的 IO 操作,使系统的IO 负载趋向平稳。
WalWriter 进程
预写式日志WAL(Write Ahead Log,也称为Xlog)的中心思想是对数据文件的修改必须是只能发生在这些修改已经记录到日志之后,也就是先写日志后写数据(日志先行)。使用这种机制可以避免数据频繁的写入磁盘,可以减少磁盘I/O。数据库在宕机重启后可以运用这些 WAL 日志来恢复数据库。
AutoVacuum 进程
自动清理进程,在PostgreSQL 数据库中,对数据进行 UPDATE 或者 DELETE 操作后,数据库不会立即删除旧版本的数据,而是标记为删除状态。这是因为 PG 数据库具有多版本的机制,如果这些旧版本的数据正在被另外的事务打开,那么暂时保留他们是很有必要的。当事务提交后,旧版本的数据已经没有价值了,数据库需要清理垃圾数据腾出空间,而清理工作就是 AutoVacuum 进程进行的。
PgStat 进程
PgStat进程是 PostgreSQL 数据库的统计信息收集器,用来收集数据库运行期间的统计信息,如表的增删改次数,数据块的个数,索引的变化等等。收集统计信息主要是为了让优化器做出正确的判断,选择最佳的执行计划。
PgArch 进程
归档进程, WAL 日志会被循环使用,也就是说,过去的WAL日志会被新产生的日志覆盖,PgArch 进程就是为了在覆盖前把 WAL 日志备份出来。归档日志的作用是为了数据库能够使用全量备份和备份后产生的归档日志,从而让数据库回到过去的任一时间点。
补充说明
当配置 PostgreSQL 主备流复制环境时,还会拉起一对新的辅助进程,分别是 WalSender 和 WalReceiver 进程。此时备节点还会常驻一个 startup 进程,负责日志回放。
WalSender 进程
WAL 日志发送进程,在流复制环境中发送本节点产生的 WAL 日志到对应节点的 WalReceiver 进程。
WalReceiver 进程
WAL 日志接收进程,在流复制环境中接收来自上游节点发送过来的 WAL 日志,并将其写入本节点的日志目录中,供回放进程使用。
startup 进程
日志回放进程。当数据库正常启动时拉起的第一个子进程,若上次数据库非正常停止,那么本次启动就可能进行相应的 WAL 日志回放,回放完成后 startup 退出,Postmaster 进入正常的启动流程。
在流复制场景中,备节点 startup 进程会常驻,负责回放 WalReceiver 进程接收到的 WAL 日志,保证本节点的数据与上有节点的一致性。