合 《PostgreSQL技术内幕——原理探索》第二章 进程和内存架构
Tags: PGPostgreSQL体系结构翻译《PostgreSQL技术内幕——原理探索》内存结构进程结构
本章总结了PostgreSQL中进程与内存的架构,有助于读者理解后续章节。 如果读者已经熟悉这些内容,可以直接跳过本章。
2.1 进程架构
PostgreSQL是一个客户端/服务器风格的关系型数据库管理系统,采用多进程架构,运行在单台主机上。
我们通常所谓的“PostgreSQL服务器(PostgreSQL Server)” 实际上是一系列协同工作的进程集合,包含着下列进程:
- postgres服务器进程(Postgres Server Process)是所有数据库集簇管理进程的父进程。
- 每个后端进程(Backend Process) 负责处理客户端发出的查询和语句。
- 各种后台进程(Background Process) 负责执行各种数据库管理任务(例如清理过程与检查点过程)。
- 各种复制相关(Replication Associated Process)的进程负责流复制,流复制的细节会在第11章中介绍。
- 后台工作进程(Background Worker Process) 在9.3版被引入,它能执行任意由用户实现的处理逻辑。这里不详述,请参阅官方文档。
以下几小节将详细描述前三种进程。
图2.1 PostgreSQL的进程架构示例
本图展示了PostgreSQL服务器包含的进程:postgres服务器进程,两个后端进程,七个后台进程,以及两个客户端进程。 也画出了数据库集簇,共享内存,以及两个客户端。
2.1.1 Postgres服务器进程
如上所述,postgres服务器进程(postgres server process)是PostgreSQL服务器中所有进程的父进程,在早期版本中它被称为“postmaster“。
带start
参数执行pg_ctl
实用程序会启动一个postgres服务器进程。它会在内存中分配共享内存区域,启动各种后台进程,如有必要还会启动复制相关进程与后台工作进程,并等待来自客户端的连接请求。 每当接收到来自客户端的连接请求时,它都会启动一个后端进程 (然后由启动的后端进程处理该客户端发出的所有查询)。
一个postgres服务器进程只会监听一个网络端口,默认端口为5432。如果要在同一台主机上运行多个PostgreSQL服务器,则应为每个服务器配置不同的监听端口,如5432,5433等。
2.1.2 后端进程
每个后端进程(也称为”postgres“)由postgres服务器进程启动,并处理连接另一侧的客户端发出的所有查询。它通过单条TCP连接与客户端通信,并在客户端断开连接时终止。
因为一条连接只允许操作一个数据库,因此必须在连接到PostgreSQL服务器时显式指定要连接的数据库。
PostgreSQL允许多个客户端同时连接;配置参数max_connections
用于控制最大客户端连接数(默认为100)。
因为PostgreSQL没有原生的连接池功能,因此如果许多客户端频繁地重复与PostgreSQL服务器建立断开连接(譬如WEB应用),则会导致建立连接与创建后端进程的开销变大。这种情况对数据库服务器的性能有负面影响,通常可以使用池化中间件(pgbouncer或pgpool-II)来避免该问题。