PG体系结构(一)

太阳1年前技术文章298

一、进程结构

image.png

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,数据库本身不提供连接池的功能,如果频繁的创建/断开连接将对数据库带来一定的资源消耗。



标签: PostgreSQL

相关文章

PG的多版本并发控制(三)

三、多版本并发控制3.1 常见多版本并发的实现方式第一种方式是,数据库仅保存最新版本数据,将发生变更的旧行版本数据写到其他地方如undo,当需要读取旧版本数据时,通过undo重构。oracle和MyS...

pgbench 压测工具

pgbench 压测工具

一、基本参数pgbench工具是Postgres自带的一款轻量型基准压测工具。它自定义相关场景下脚本进行1.1 初始化参数参数含义-i / --initialize调用初始化模式-I init_ste...

PG的统计信息(二)

1.2.4 pg_statio_user_tables 指标含义通过对pg_statio_user_tables的查询,如果heap_blks_read,idx_blks_read很高说明shared...

PG的表膨胀

1 什么是表膨胀众所周知,PostgreSQL的多版本并发是通过保留变更前的记录来实现的。当数据记录被DML修改,旧版本记录仍保留不变,仅仅需要修改相关记录的xmin、xmax属性,并新增写入变更后的...

PG的pg_stat_statements插件

pg_stat_statements可追踪一个服务器所执行的所有 SQL 语句的执行统计信息,可以用于统计数据库的资源开销,分析TOP SQL。一、插件安装1、编译安装进入postgresql源码目录...

PG的统计信息(三)

1.3 数据分布类统计信息1.3.1 pg_stats通过对pg_stats的查询,可以查看每个字段的数据分析统计信息,类似SQL Server的直方图,为优化器选择最佳执行计划提供依据,pg_sta...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。