在本章中,总结PostgreSQL的进程架构和内存架构
1. 进程架构
Postgresql是个C/S(client/server)的关系型数据库,具有多进程的架构,运行在一个主机上。
多个进程协同管理一个数据库集群通常被称为“PostgreSQL server”,它包含以下类型的进程:
- postgres server process 是所有与数据库集群管理相关进程的父进程。
- 每个backend process处理由连接的客户机发出的所有查询和语句。
- 不同的background processes执行不同特性的进程(例如,VACUUM和CKECKPOINT进程),用于数据库管理。
- 在与复制相关的流程中,它们执行流复制。
Fig. 1.1. An example of the process architecture in PostgreSQL
这张图显示了一个PostgreSQL服务器的进程:一个postgres服务器进程,两个后端进程,七个后台进程和两个客户端进程。还演示了数据库集群、共享内存和两个客户机进程。
1.1 postgres server process
postgres服务器进程是PostgreSQL服务器中所有进程的父进程。在早期的版本中,它被称为postmaster。
通过执行pg_ctl start指令,postgres服务器进程将启动。然后,它在内存中分配一个共享内存区域,启动各种后台进程,必要时启动与复制相关的进程和后台工作进程,并等待客户机的连接请求。每当收到来自客户机的连接请求时,它就启动后端进程。(启动的后端进程处理连接的客户端发出的所有查询)。
一个postgres服务器进程监听一个网口,默认端口为5432。虽然可以在同一台主机上运行多个PostgreSQL服务器,但是每个服务器都应该设置为监听不同的端口号,例如5432、5433等等。
1.2 backend processes
后端进程也称为postgres,由postgres server process启动,并处理由一个连接的客户机发出的所有查询。它通过一个TCP连接与客户机通信,并在客户机断开连接时终止。
如果许多客户端(如WEB应用程序)频繁地重复连接和断开与PostgreSQL服务器的连接,这会增加建立连接和创建后端进程的成本,因为PostgreSQL没有实现本机连接池特性。这种情况会对数据库服务器的性能产生负面影响。为了处理这种情况,通常使用池插件(pgbouncer或pgpool-II)。
1.3 background processes
Table 1.1: background processes
进程 | 描述 |
background writer | 在这个过程中,共享缓冲池中的脏页会被逐步地定期写入持久存储(例如,HDD、SSD) |
checkpointer | 在这个过程中,将共享缓冲池中的脏数据页全部写入持久存储,以实现数据库的一致性和完整性 |
autovacuum launcher | autovacuum-worker进程会定期为vacuum进程调用。(更准确地说,它请求为postgres服务器创建autovacuum workers。) |
WAL writer | 该进程定期将WAL缓冲区中的WAL数据写入并刷新到持久存储中 |
statistics collector | 在这个过程中,会收集诸如pg_stat_activity和pg_stat_database等统计信息 |
logging collector (logger) | 此进程将错误消息写入日志文件 |
archiver | 在此过程中,将执行归档日志记录 |
2. 内存架构
PostgreSQL的内存体系结构可以分为两大类:
- Local memory area:每个backend process分配使用
- Shared memory area:由PostgreSQL服务器的所有进程使用
Fig. 2.1. Memory architecture in PostgreSQL
2.1 Local memory area
每个backend process分配一个本地内存区域用于查询处理;每个区域又分为几个子区域,子区域的大小可以是固定的,也可以是可变的。表2.1列出了主要的子区域。详情将在以下各章中描述。
Table 2.1: Local memory area
sub-area | 描述 |
work_mem | 内部排序操作和hash表在使用临时磁盘文件之前使用的内存缓冲区,对于并发,每个并发子进程都会分配;order by,distinct,merge join都要用到排序操作,hash表在以hash join,hash 为基础的聚集,以hash为基础的in子查询处理都会用到 |
maintenance_work_mem | 在维护性操作(如VACUUM,CREATE INDEX,ALTER TABLE ADD FOREIGN KEY 等),会使用到 |
temp_buffers | 执行器使用此区域存储临时表 |
2.2 Shared memory area
共享内存区域由PostgreSQL服务在启动时分配。这个区域也被划分为几个固定大小的子区域
sub-area | 描述 |
shared buffer pool | PostgreSQL将表和索引中的页面从持久存储加载到这里,并直接操作它们。 |
WAL buffer | 为了保证数据不因服务器故障而丢失,PostgreSQL支持WAL机制。WAL data(也称XLOG records)是PostgreSQL中的事务日志;WAL buffer是WAL数据写入持久存储之前的缓冲区域。 |
commit log | commit log(CLOG)保存所有事务(如in_progress,committed,aborted)的状态,用于并发控制(CC)机制。 |
除此之外,PostgreSQL还分配了如下几个区域:
- 用于各种访问控制机制的Sub-area。(例如,信号量、轻量级锁、共享锁和排他锁等)
- 用于各种后台进程的Sub-area,如checkpointer和autovacuum。
- 事务处理的Sub-area,比如保存点和两阶段提交。
- others
参考文献:
《The Internals of PostgreSQL for database administrators and system developers》
《Postgresql官方文档》