探索PostgreSQL开发与实战(6.1)的体系结构

发表时间: 2024-03-12 10:01

作者:太阳

一、进程结构

PG数据库启动时会先启动一个主进程(9.3之前称为postmaster,9.3以后称为postgres server process),然后fork出一些辅助子进程(backend、backgroud相关进程),不同的辅助子进程负责不同的工作。当客户端请求访问时,客户端先与主进程创建连接并进行身份验证,身份验证成功后fork出一个子进程(服务进程)为这个连接服务。所以说PG数据库其实是一个多进程架构模型。

postgres server process 是所有进程的父进程
backend process 每一个客户端的连接都有一个后端进程存在
backgroud processes 为管理数据库而产生的一些进程
backgroud work processes 9.3以后版本开始有这个进程,这里不做详细介绍

1.1 postgres server process(主进程)

postgres server process(守护进程)

早期版本叫做postmaster进程,它是postgres数据库的核心,整个数据库的总控进程。当数据库启动后会从物理内存中分配内存给shared memory,然后产生很多其他的backgroup processes ,等待客户端来连接,每产生一个连接就会生成一个backend process。一个postgres server process只能监听一个端口,默认端口是5432。生产中数据库启停使用更多的是pg_ctl命令,而 pg_ctl 命令其实是对postgres命令的一个包装,而postmaster其实是postgres的一个链接。

postmaster主进程的功能:

  • 数据库的启停
  • 监听客户端连接,默认为每个客户端连接fork单独的postgres服务进程
  • 当服务进程出错时进行修复
  • 管理数据文件
  • 管理数据库运行相关的辅助进程

当客户端调用接口像数据库发起连接请求,守护进程postmaster会fork单独的服务进程postgres 为客户端提供服务,此后由postgres服务进程为客户端执行各种命令,客户端也不需要postmaster进行中转,直接与服务进程postgres进行通讯。

1.2 backgroud processes(辅助子进程)

# ps -ef | grep postgrespostgres  9011     1  0 9月27 ?       00:00:15 /usr/local/pgsql/bin/postgrespostgres  9012  9011  0 9月27 ?       00:00:00 postgres: loggerpostgres  9014  9011  0 9月27 ?       00:00:01 postgres: checkpointerpostgres  9015  9011  0 9月27 ?       00:00:11 postgres: background writerpostgres  9016  9011  0 9月27 ?       00:00:11 postgres: walwriterpostgres  9017  9011  0 9月27 ?       00:00:12 postgres: autovacuum launcherpostgres  9018  9011  0 9月27 ?       00:00:01 postgres: archiver   last was 0000000100000000000000ABpostgres  9019  9011  0 9月27 ?       00:00:22 postgres: stats collectorpostgres  9020  9011  0 9月27 ?       00:00:00 postgres: logical replication launcherroot     28788 27741  0 16:03 pts/2    00:00:00 grep --color=auto postgreslogging collector (logger)

日志进程,PostgreSQL的默认日志是关闭的,可在postgres.conf文件中logging_collect、log_directory、log_filename、log_rotation_age、log_rotation_size相关参数进行设置,打开日志收集,主进程就会启动logger日志进程。该进程会收集所有其他的进程的日志信息。
checkpointer
数据库的检查点进程
background writer 进程
后台写进程,主要负责把共享内存(shared buffer pool)中的脏页周期性的写到磁盘。
autovacuum launcher 进程
自动清理进程,主要负责对已经删除标记的数据进行清理。在PG数据库中delete操作只是对原记录进行delete的打标,update同样也是对原记录进行delete打标并插入一条新数据,被delete打标的记录并不马上做删除处理,而是通过 autovacuum 进程来对历史无效数据进行清理,为vacuum process周期性的调用autovacuum work processes,释放磁盘空间。
archiver 进程
归档进程,主要负责对wal日志进行备份归档。wal日志是循环覆盖的,所以就有了 archiver(9.3之前叫pgarch) 进程,可以保证wal日志在覆盖前进行备份归档,另外pg基于时间点恢复也是利用该进程进程,对全备之后的位点日志进行归档,保证全备文件+wal日志恢复至任意时间点。
stats collector 进程
统计数据收集进程,主要负责收集表数据的统计信息以用于数据库优化器的代价估算。pg_statistic表存储了pgstat进程采集的各类统计信息。
wal write 进程
预写日志进程,保证数据库在修改数据之前必须先将对应的变更操作写入到wal日志并进行持久化到磁盘。保证数据库即使异常宕机,可以可以通过wal日志进行崩溃恢复。

1.3 backend processes (服务进程)

服务进程

客户端连接进程,通过TCP/IP协议和客户端建立通讯,当客户端发起连接请求时,首先与postmaster进行连接并进行身份验证,身份验证通过后postmaster会启动一个子进程为这个连接服务,也就是服务进程。postgres允许多个客户端同时连接,连接数由max_connections参数控制,默认是100,数据库本身不提供连接池的功能,如果频繁的创建/断开连接将对数据库带来一定的资源消耗。

更多技术信息请查看云掣官网https://yunche.pro/?t=yrgw