【读书笔记】《PostgreSQL指南-内幕探索》-2.进程和内存架构

2.1进程架构

  • Postgres服务器进程是所有数据库集簇管理进程的父进程
  • 每个后端进程负责处理客户端发出的查询和语句。
  • 各种后台进程负责执行各种数据库管理任务(例如清理过程与存档过程)
  • 各种复制相关进程负责流复制
  • 后台工作进程,它能执行任意由用户实现的处理逻辑。

Postgres服务器进程

一个postgres服务器进程指挥监听一个网络端口,默认端口5432

后端进程

每个后端进程(也称为”Postgres”)由postgres服务器进程启动,并处理连接另一侧的客户端发出的所有查询。它通过单条TCP连接与客户端通信,并在客户端断开连接时终止。
一条连接只允许操作一个数据库。 max_connections.

  • 因为Postgresql没有原生的连接池功能,客户端频繁重复与pg服务器建立断开连接,建议池化中间件(pgbouncer/pgpool-II)来避免该问题

后台进程

进程 概述
baskground writer 负责将共享缓冲池中的脏页逐渐刷入持久化存储中
checkpointer 处理检查点
autovacuum launcher 周期性启动自动清理工作进程
Wal writer 周期性将WAL缓冲区中的wal数据刷入持久存储中
statistics collector 负责收集统计信息,用于pg_stat_activity/pg_stat_database
logging collector(logger) 负责将错误消息写入日志文件
archiver 负责将日志归档
#eg
[postgres@pgtest ~]$ ps -ef | grep postgres
postgres   3256      1  0 Mar13 ?        00:00:09 /pgdata/pgsql/bin/postgres -D /pgdata/data
postgres   3258   3256  0 Mar13 ?        00:00:00 postgres: checkpointer process            
postgres   3259   3256  0 Mar13 ?        00:00:06 postgres: writer process                  
postgres   3260   3256  0 Mar13 ?        00:00:11 postgres: wal writer process              
postgres   3261   3256  0 Mar13 ?        00:00:09 postgres: autovacuum launcher process     
postgres   3262   3256  0 Mar13 ?        00:00:00 postgres: archiver process   last was 00000003000000000000001A
postgres   3263   3256  0 Mar13 ?        00:00:21 postgres: stats collector process         
postgres   3265   3256  0 Mar13 ?        00:00:00 postgres: bgworker: logical replication launcher   
root      23430  23409  0 22:30 pts/0    00:00:00 su - postgres
postgres  23431  23430  0 22:30 pts/0    00:00:00 -bash
postgres  23454  23431  2 22:30 pts/0    00:00:00 ps -ef
postgres  23455  23431  0 22:30 pts/0    00:00:00 grep postgres
[postgres@pgtest ~]$ pstree -p 3256
postgres(3256)-+-postgres(3258)
               |-postgres(3259)
               |-postgres(3260)
               |-postgres(3261)
               |-postgres(3262)
               |-postgres(3263)
               `-postgres(3265)

内存架构

  • 本地内存区域,由每个后端进程分配,供自己使用
  • 共享内存区域,供Postgresql服务器的所有进程使用。

本地内存区域

每个后端进程都会分配一块本地内存区域用于查询处理。该区域会分为几个子区域-子区域的大小有固定,有的可变。

子区域 描述
work_mem 执行器在执行order by和distinct时使用该区域对元组做排序,以及存储归并连接和散列连接中的连接表
maintenance_work_mem 某些类型的维护操作使用该区域(例如:VACUUM REINDEX)
temp_buffers 执行器使用此区域存储临时表

共享内存区域

PostgresSQL服务器启动时会分配共享内存区域,该区域分为几个固定大小的子区域。

子区域 描述
shared buffer pool Postgresql 将表和索引中的页面从持久化存储加载到此,并直接操作它们
WAL buffer 为确保服务故障不会丢数据,PG实现了WAL机制。缓冲区是wal数据写入持久化存储之前的缓冲区
commit log 提交日志,为并发控制机制保存了所需的所有事物状态。(例如进程中,已提交、已中止等)

除了上述,还分配如下:

  • 用于访问控制机制的子区域(例如信号量,轻量级锁、共享和排他锁等)
  • 各种后台进程使用的子区域,例如checkpoint和autovacuum
  • 用于事务处理的子区域,例如保存点与两阶段提交(2PC)
请使用浏览器的分享功能分享到微信等