在本章中,总结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

ios基础架构 pg架构_数据库集群

 这张图显示了一个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

ios基础架构 pg架构_ios基础架构_02

 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官方文档》