在本章中,总结了PostgreSQL中的流程体系结构和内存体系结构,以帮助阅读后续章节。如果您已经熟悉它们,可以跳过本章

 

1.进程结构

Postgresql 是一个C/S架构的关系型数据库,由多个后台进程管理数据库,下面分别介绍一些这些进程

postgres server process  是所有进程的父进程

backend process 每一个客户端的连接都有一个后端进程存在

backgroud processes 为管理数据库而产生的一些进程

backgroud work processes 9.3以后版本开始有这个进程,这里不做详细介绍

进程架构图2.1:

下面简短的介绍一些这几个进程的作用

1.1 postgres server process

正如上所说,是所有进程的父进程,早期的版本叫postmaster.

pg_ctl start执行后,这个进程就会启动,然后,从物理内存中分配内给给shared memory,然后产生很多其他的backgroup processes ,等待客户端来连接,每产生一个连接就会生成一个backend process,一个postgres server process只能监听一个端口,默认端口是5432。尽管一台机器可以运行多个server,但是端口必须不同。

1.2 backend processes

通过TCP协议和客户端建立通讯,当客户端断开时,连接消失。允许多个客户端同时连接,连接数由max_connections参数控制,默认是100,如果客户端频繁的和服务端建立连接然后断开,会增加数据库的开销,导致服务器负载不正常,因为数据库本身不提供连接池的功能,如果有需要,可以使用pgbouncer或者pgpool-II。

1.3 backgroud processes

下面列出了相关的服务端进程,这里只做简单的介绍

 

Table 2.1: background processes.
processdescriptionreference
background writer 进程将shared buffer pool中的脏数据写到磁盘,检查点总能触发这个进程 Section 8.6
checkpointer  在9.2版本以后,检查点会触发产生这个进程 Section 8.6Section 9.7
autovacuum launcher  为vacuum process周期性的调用autovacuum work processes Section 6.5
WAL writer  周期性的从wal buffer刷新数据到磁盘 Section 9.9
statistics collector  收集统计信息进程,比如pg_stat_activity 和pg_stat_database的数据  
logging collector (logger)  将错误信息写入到日志  
archiver  将日志归档的进程. Section 9.10

这里显示了PostgreSQL数据库的进程信息。在以下示例中,一个postgres服务器进程(pid为9687),两个后端进程(pids为9697和9717)以及表2.1中列出的几个后台进程正在运行。

  1.  
    postgres> pstree -p 9687
  2.  
    -+= 00001 root /sbin/launchd
  3.  
    \-+- 09687 postgres /usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
  4.  
    |--= 09688 postgres postgres: logger process
  5.  
    |--= 09690 postgres postgres: checkpointer process
  6.  
    |--= 09691 postgres postgres: writer process
  7.  
    |--= 09692 postgres postgres: wal writer process
  8.  
    |--= 09693 postgres postgres: autovacuum launcher process
  9.  
    |--= 09694 postgres postgres: archiver process
  10.  
    |--= 09695 postgres postgres: stats collector process
  11.  
    |--= 09697 postgres postgres: postgres sampledb 192.168.1.100(54924) idle
  12.  
    \--= 09717 postgres postgres: postgres sampledb 192.168.1.100(54964) idle in transaction

2.内存架构

 

在Postgresql中,内存大概被分为两块

Local memory area – 为每一个backend process 分配的内存

Shared memory area – PostgreSQL server 所有的backgroud process使用的内存

2.1 Local memory area 

 

每一个backend process 都会分配一块local memory area, 每一块区域又分为三个子区域 ,见下表

Table 2.2: Local memory area
sub-areadescriptionreference
work_mem  用户在sort,distinct,merge join,hash join的时候会用到这块区域 Chapter 3
maintenance_work_mem  vacuum,reindex会用到这块区域 Section 6.1
temp_buffers  存储临时表会用到这块区域  

 

2.2 Shared memory area 

 

这块区域在服务器启动的时候分配,这块区域也是分为好几个子区域,见下面介绍

 

Table 2.3: Shared memory area
sub-areadescriptionreference
shared buffer pool  将表或者索引的page从磁盘加载到shared buffer,然后在shared buffer操作 Chapter 8
WAL buffer  在服务端出现问题的时候,确保数据不会丢失,在写到磁盘之前,wal buffer是wal log的缓存区域 Chapter 9
commit log  为了并发控制所有事物的状态的保持而分配的区域

另外,Postgresql还分配一些其他的内存区域:

  • 为访问控制分配的子区域,比如轻量级锁,共享或者专有锁.
  • 为其他backgroud process提供的子区域,比如检查点,vacuum.
  • 为事物处理提供的子区域,比如事物中的保存点,和二阶段事物提交.

转载自:

https://blog.csdn.net/dazuiba008/article/details/80389220

 posted on 2019-08-12 18:03  xibuhaohao  阅读(1393)  评论(0编辑  收藏  举报