PG体系结构(一)
一、进程结构
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 postgres postgres 9011 1 0 9月27 ? 00:00:15 /usr/local/pgsql/bin/postgres postgres 9012 9011 0 9月27 ? 00:00:00 postgres: logger postgres 9014 9011 0 9月27 ? 00:00:01 postgres: checkpointer postgres 9015 9011 0 9月27 ? 00:00:11 postgres: background writer postgres 9016 9011 0 9月27 ? 00:00:11 postgres: walwriter postgres 9017 9011 0 9月27 ? 00:00:12 postgres: autovacuum launcher postgres 9018 9011 0 9月27 ? 00:00:01 postgres: archiver last was 0000000100000000000000AB postgres 9019 9011 0 9月27 ? 00:00:22 postgres: stats collector postgres 9020 9011 0 9月27 ? 00:00:00 postgres: logical replication launcher root 28788 27741 0 16:03 pts/2 00:00:00 grep --color=auto postgres
logging 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,数据库本身不提供连接池的功能,如果频繁的创建/断开连接将对数据库带来一定的资源消耗。