PostgreSQL使用一种客户端/服务器的模型。一次PostgreSQL会话由下列相关的进程(程序)组成:html
一个服务器进程,它管理数据库文件、接受来自客户端应用与数据库的联接而且表明客户端在数据库上执行操做。 该数据库服务器程序叫作postgres。前端
那些须要执行数据库操做的用户的客户端(前端)应用。 客户端应用可能自己就是多种多样的:能够是一个面向文本的工具, 也能够是一个图形界面的应用,或者是一个经过访问数据库来显示网页的网页服务器,或者是一个特制的数据库管理工具。 一些客户端应用是和 PostgreSQL发布一块儿提供的,但绝大部分是用户开发的。sql
和典型的客户端/服务器应用(C/S应用)同样,这些客户端和服务器能够在不一样的主机上。 这时它们经过 TCP/IP 网络联接通信。 你应该记住的是,在客户机上能够访问的文件未必可以在数据库服务器机器上访问(或者只能用不一样的文件名进行访问)。数据库
PostgreSQL服务器能够处理来自客户端的多个并发请求。 所以,它为每一个链接启动("forks")一个新的进程。 从这个时候开始,客户端和新服务器进程就再也不通过最初的 postgres进程的干涉进行通信。 所以,主服务器进程老是在运行并等待着客户端联接, 而客户端和相关联的服务器进程则是起起停停。windows
PostgreSQL 结构以下:后端
管理后端的常驻进程,也称为’postmaster’。其默认监听UNIX Domain Socket和TCP/IP(Windows等,一部分的平台只监听tcp/ip)的5432端口,等待来自前端的的链接处理。监听的端口号能够在PostgreSQL的设置文件postgresql.conf里面能够改。缓存
一旦有前端链接过来,postgres会经过fork(2)生成子进程。没有Fork(2)的windows平台的话,则利用createProcess()生成新的进程。这种情形的话,和fork(2)不一样的是,父进程的数据不会被继承过来,因此须要利用共享内存把父进程的数据继承过来。安全
子进程根据pg_hba.conf定义的安全策略来判断是否容许进行链接,根据策略,会拒绝某些特定的IP及网络,或者也能够只容许某些特定的用户或者对某些数据库进行链接。服务器
Postgres会接受前端过来的查询,而后对数据库进行检索,最好把结果返回,有时也会对数据库进行更新。更新的数据同时还会记录在事务日志里面(PostgreSQL称为WAL日志),这个主要是当停电的时候,服务器当机,从新启动的时候进行恢复处理的时候使用的。另外,把日志归档保存起来,可在须要进行恢复的时候使用。在PostgreSQL 9.0之后,经过把WAL日志传送其余的postgreSQL,能够实时得进行数据库复制,这就是所谓的‘数据库复制’功能。网络
Postgres以外还有一些辅助的进程。这些进程都是由常驻postgres启动的进程。
Writer process在适当的时间点把共享内存上的缓存写往磁盘。经过这个进程,能够防止在检查点的时候(checkpoint),大量的往磁盘写而致使性能恶化,使得服务器能够保持比较稳定的性能。Background writer起来之后就一直常驻内存,可是并不是一直在工做,它会在工做一段时间后进行休眠,休眠的时间间隔经过postgresql.conf里面的参数bgwriter_delay设置,默认是200微秒。
这个进程的另一个重要的功能是按期执行检查点(checkpoint)。
检查点的时候,会把共享内存上的缓存内容往数据库文件写,使得内存和文件的状态一致。经过这样,能够在系统崩溃的时候能够缩短从WAL恢复的时间,另外也能够防止WAL无限的增加。 能够经过postgresql.conf的checkpoint_segments、checkpoint_timeout指定执行检查点的时间间隔。
WAL writer process把共享内存上的WAL缓存在适当的时间点往磁盘写,经过这样,能够减轻后端进程在写本身的WAL缓存时的压力,提升性能。另外,非同步提交设为true的时候,能够保证在必定的时间间隔内,把WAL缓存上的内容写入WAL日志文件。
Archive process把WAL日志转移到归档日志里。若是保存了基础备份以及归档日志,即便实在磁盘彻底损坏的时候,也能够回复数据库到最新的状态。
统计信息的收集进程。收集好统计表的访问次数,磁盘的访问次数等信息。收集到的信息除了能被autovaccum利用,还能够给其余数据库管理员做为数据库管理的参考信息。
把postgresql的活动状态写到日志信息文件(并不是事务日志),在指定的时间间隔里面,对日志文件进行rotate.
autovacuum launcher process是依赖于postmaster间接启动vacuum进程。而其自身是不直接启动自动vacuum进程的。经过这样能够提升系统的可靠性。
autovacuum worker process进程实际执行vacuum的任务。有时候会同时启动多个vacuum进程。
wal sender 进程和wal receiver进程是实现postgresql复制(streaming replication)的进程。Wal sender进程经过网络传送WAL日志,而其余PostgreSQL实例的wal receiver进程则接收相应的日志。Wal receiver进程的宿主PostgreSQL(也称为Standby)接受到WAL日志后,在自身的数据库上还原,生成一个和发送端的PostgreSQL(也称为Master)彻底同样的数据库。
下面看看数据库引擎postgres子进程的处理概要。为了简单起见下面的说明中,把backend process简称为backend。Backend的main函数是PostgresMain (tcop/postgres.c)。
参考文章:
https://wiki.postgresql.org/wiki/Pgsrcstructure
http://www.postgres.cn/docs/9.6/tutorial-arch.html