postgresql架构基础(转)-(1)

PostgreSQL使用一种客户端/服务器的模型。一次PostgreSQL会话由下列相关的进程(程序)组成:html

    一个服务器进程,它管理数据库文件、接受来自客户端应用与数据库的联接而且表明客户端在数据库上执行操做。 该数据库服务器程序叫作postgres前端

    那些须要执行数据库操做的用户的客户端(前端)应用。 客户端应用可能自己就是多种多样的:能够是一个面向文本的工具, 也能够是一个图形界面的应用,或者是一个经过访问数据库来显示网页的网页服务器,或者是一个特制的数据库管理工具。 一些客户端应用是和 PostgreSQL发布一块儿提供的,但绝大部分是用户开发的。sql

   和典型的客户端/服务器应用(C/S应用)同样,这些客户端和服务器能够在不一样的主机上。 这时它们经过 TCP/IP 网络联接通信。 你应该记住的是,在客户机上能够访问的文件未必可以在数据库服务器机器上访问(或者只能用不一样的文件名进行访问)。数据库

    PostgreSQL服务器能够处理来自客户端的多个并发请求。 所以,它为每一个链接启动("forks")一个新的进程。 从这个时候开始,客户端和新服务器进程就再也不通过最初的 postgres进程的干涉进行通信。 所以,主服务器进程老是在运行并等待着客户端联接, 而客户端和相关联的服务器进程则是起起停停。windows

  PostgreSQL 结构以下:后端

  

Potgres(常驻进程)

管理后端的常驻进程,也称为’postmaster’。其默认监听UNIX Domain Socket和TCP/IP(Windows等,一部分的平台只监听tcp/ip)的5432端口,等待来自前端的的链接处理。监听的端口号能够在PostgreSQL的设置文件postgresql.conf里面能够改。缓存

一旦有前端链接过来,postgres会经过fork(2)生成子进程。没有Fork(2)的windows平台的话,则利用createProcess()生成新的进程。这种情形的话,和fork(2)不一样的是,父进程的数据不会被继承过来,因此须要利用共享内存把父进程的数据继承过来。安全

Postgres(子进程)

子进程根据pg_hba.conf定义的安全策略来判断是否容许进行链接,根据策略,会拒绝某些特定的IP及网络,或者也能够只容许某些特定的用户或者对某些数据库进行链接。服务器

Postgres会接受前端过来的查询,而后对数据库进行检索,最好把结果返回,有时也会对数据库进行更新。更新的数据同时还会记录在事务日志里面(PostgreSQL称为WAL日志),这个主要是当停电的时候,服务器当机,从新启动的时候进行恢复处理的时候使用的。另外,把日志归档保存起来,可在须要进行恢复的时候使用。在PostgreSQL 9.0之后,经过把WAL日志传送其余的postgreSQL,能够实时得进行数据库复制,这就是所谓的‘数据库复制’功能。网络

其余的进程

Postgres以外还有一些辅助的进程。这些进程都是由常驻postgres启动的进程。

Writer process

Writer process在适当的时间点把共享内存上的缓存写往磁盘。经过这个进程,能够防止在检查点的时候(checkpoint),大量的往磁盘写而致使性能恶化,使得服务器能够保持比较稳定的性能。Background writer起来之后就一直常驻内存,可是并不是一直在工做,它会在工做一段时间后进行休眠,休眠的时间间隔经过postgresql.conf里面的参数bgwriter_delay设置,默认是200微秒。

这个进程的另一个重要的功能是按期执行检查点(checkpoint)。

检查点的时候,会把共享内存上的缓存内容往数据库文件写,使得内存和文件的状态一致。经过这样,能够在系统崩溃的时候能够缩短从WAL恢复的时间,另外也能够防止WAL无限的增加。 能够经过postgresql.conf的checkpoint_segments、checkpoint_timeout指定执行检查点的时间间隔。

WAL writer process

WAL writer process把共享内存上的WAL缓存在适当的时间点往磁盘写,经过这样,能够减轻后端进程在写本身的WAL缓存时的压力,提升性能。另外,非同步提交设为true的时候,能够保证在必定的时间间隔内,把WAL缓存上的内容写入WAL日志文件。

Archive process

Archive process把WAL日志转移到归档日志里。若是保存了基础备份以及归档日志,即便实在磁盘彻底损坏的时候,也能够回复数据库到最新的状态。

stats collector process

统计信息的收集进程。收集好统计表的访问次数,磁盘的访问次数等信息。收集到的信息除了能被autovaccum利用,还能够给其余数据库管理员做为数据库管理的参考信息。

Logger process

把postgresql的活动状态写到日志信息文件(并不是事务日志),在指定的时间间隔里面,对日志文件进行rotate.

Autovacuum启动进程

autovacuum launcher process是依赖于postmaster间接启动vacuum进程。而其自身是不直接启动自动vacuum进程的。经过这样能够提升系统的可靠性。

自动vacuum进程

autovacuum worker process进程实际执行vacuum的任务。有时候会同时启动多个vacuum进程。

wal sender / wal receiver

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)。

  1. 接收前端发送过来的查询(SQL文)
  2. SQL文是单纯的文字,电脑是认识不了的,因此要转换成比较容易处理的内部形式构文树parser tree,这个处理的称为构文解析。构文解析的模块称为parser.这个阶段只可以使用文字字面上得来的信息,因此只要没语法错误之类的错误,即便是select不存在的表也不会报错。这个阶段的构文树被称为raw parse tree. 构文处理的入口在raw_parser (parser/parser.c)。
  3. 构文树解析完之后,会转换为查询树(Query tree)。这个时候,会访问数据库,检查表是否存在,若是存在的话,则把表名转换为OID。这个处理称为分析处理(Analyze), 进行分析处理的模块是analyzer。 另外,PostgreSQL的代码里面提到构文树parser tree的时候,更多的时候是指查询树Query tree。分析处理的模块的入口在parse_analyze (parser/analyze.c)
  4. PostgreSQL还经过查询语句的重写实现视图(view)和规则(rule), 因此须要的时候,在这个阶段会对查询语句进行重写。这个处理称为重写(rewrite),重写的入口在QueryRewrite (rewrite/rewriteHandler.c)。
  5. 经过解析查询树,能够实际生成计划树。生成查询树的处理称为‘执行计划处理’,最关键是要生成估计能在最短的时间内完成的计划树(plan tree)。这个步骤称为’查询优化’(不叫query optimize, 而是optimize), 而完成这个处理的模块称为查询优化器(不叫query optimizer,而是optimizer, 或者称为planner)。执行计划处理的入口在standard_planner (optimizer/plan/planner.c)。
  6. 按照执行计划里面的步骤能够完成查询要达到的目的。运行执行计划树里面步骤的处理称为执行处理‘execute’, 完成这个处理的模块称为执行器‘Executor’, 执行器的入口地址为,ExecutorRun (executor/execMain.c)
  7. 执行结果返回给前端。
  8. 返回到步骤一重复执行。

参考文章:

https://wiki.postgresql.org/wiki/Pgsrcstructure

http://www.postgres.cn/docs/9.6/tutorial-arch.html

相关文章
相关标签/搜索