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)