PostgreSQL体系结构小结

前端

参考:http://book.51cto.com/art/201201/313175.htmsql

体系架构

  PostgreSQL数据库由链接管理系统(系统控制器)、编译执行系统、存储管理系统、事务系统、系统表五大部分组成,其组成结构和关系如图2-1所示。shell

  链接管理系统接受外部操做对系统的请求,对操做请求进行预处理和分发,起系统逻辑控制做用;数据库

  编译执行系统由查询编译器、查询执行器组成,完成操做请求在数据库中的分析处理和转化工做,最终实现物理存储介质中数据的操做;bootstrap

  存储管理系统由索引管理器、内存管理器、外存管理器组成,负责存储和管理物理数据,提供对编译查询系统的支持;服务器

  事务系统由事务管理器、日志管理器、并发控制、锁管理器组成,日志管理器和事务管理器完成对操做请求处理的事务一致性支持,锁管理器和并发控制提供对并发访问数据的一致性支持;网络

  系统表是PostgreSQL数据库的元信息管理中心,包括数据库对象信息和数据库管理控制信息。系统表管理元数据信息,将PostgreSQL数据库的各个模块有机地链接在一块儿,造成一个高效的数据管理系统。架构

数据库初始化(initdb)过程

    执行initdb程序时,将从initdb.c文件中的main函数开始执行,main函数的执行流程如图2-3所示。initdb执行时将按照顺序执行下列工做:并发

    1)根据用户输入的命令行参数获取输入的命令名。ide

    2)设置系统编码为LC_ALL,查找执行命令的绝对路径并设置该路径。

    3)设置环境变量(pg_data等),获取系统配置文件的源文件路径(postgres.bki、postgresql.conf.sample等文件),并检查该路径下各文件的可用性。

    4)设置中断信号处理函数,对终端命令行SIGHUP、程序中断SIGINT、程序退出SIGQUIT、软件中断SIGTERM和管道中断SIGPIPE等信号进行屏蔽,保证初始化工做顺利进行。

    5)建立数据目录,以及该目录下一些必要的子目录,如base、global、base/1等。

    6)测试当前服务器系统性能,由测试结果建立配置文件postgresql.conf、pg_hba.conf、pg_ident.conf,并对其中定义的参数作一些设置。

    7)在bootstrap模式下建立数据库template1,存储在数据目录的子目录base/1/中。

    8)建立系统视图、系统表TOAST表等,复制template1来建立template0和postgres,这些操做都用普通的SQL命令来完成。

    9)打印操做成功等相关信息,退出。

  initdb是PostgreSQL中一个独立的程序,它的主要工做就是对数据集簇进行初始化,建立模板数据库和系统表,并向系统表中插入初始元组。在这之后,用户建立各类数据库、表、视图、索引等数据库对象和进行其余操做时,都是在模板数据库和系统表的基础上进行的。

数据库集簇

  PostgreSQL安装完成后,在作任何其余事情以前,必须先使用initdb程序初始化磁盘上的数据存储区,即数据集簇,由PostgreSQL管理的用户数据库以及系统数据库总称为数据集簇。在PostgreSQL的实现中,数据库就是磁盘上一些文件的集合,只不过这些文件有特定的文件名、存储位置等,而且有些文件之间会相互关联。默认状况下,PostgreSQL的全部数据都存储在其数据目录里,这个数据目录一般会用环境变量PGDATA来引用,后文中将会用PGDATA来指代数据目录。

  在PostgreSQL中,对象标识符(OID)用来在整个数据集簇中惟一地标识一个数据库对象,这个对象能够是数据库、表、索引、视图、元组、类型等。PostgreSQL提供了Oid数据类型来表示OID,它其实是一个无符号整数。

  OID——对象标识符

  OID一般是从1开始分配,但在初始化数据集簇时,会先将一部分OID分配给系统表、系统表元组、系统表上的索引等数据库对象,这一部分OID能够在系统表所对应的头文件中找到。同时,为了给后续版本留下扩展的余地,初始化数据集簇时还会预留一部分OID资源。这样,在系统运行时可分配的OID资源实际是从16384开始的。在PostgreSQL源代码src/include/catalog子目录下有一个shell脚本unused_oids用来输出当前版本中预分配和预留的OID的使用状况。


系统数据库

    在建立数据集簇以后,该集簇中默认包含三个系统数据库template一、template0和postgres。其中template0和postgres都是在初始化过程当中从template1拷贝而来的。

  template1和template0数据库用于建立数据库。PostgreSQL中采用从模板数据库复制的方式来建立新的数据库,在建立数据库的命令中能够用“-T”选项来指定以哪一个数据库为模板来建立新数据库。

  template1数据库是建立数据库命令默认的模板,也就是说经过不带“-T”选项的命令建立的用户数据库是和template1如出一辙的。template1是能够修改的,若是对template1进行了修改,那么在修改以后建立的用户数据库中也能体现出这些修改的结果。template1的存在容许用户能够制做一个自定义的模板数据库,在其中用户能够建立一些应用须要的表、数据、索引等,在往后须要屡次建立相同内容的数据库时,均可以用template1做为模板生成。

  因为template1的内容有可能被用户修改,所以为了知足用户建立一个“干净”数据库的需求,PostgreSQL提供了template0数据库做为最初始的备份数据,当须要时能够用template0做为模板生成“干净”的数据库。

  而第三个初始数据库postgres用于给初始用户提供一个可链接的数据库,就像Linux系统中一个用户的主目录同样。

  上述系统数据库都是能够删除的,可是两个模板数据库在删除以前必须将其在pg_database中元组的datistemplate属性改成FALSE,不然删除时会提示“不能删除一个模板数据库”。


系统表、视图

  在关系数据库中,为了实现数据库系统的控制,必须提供数据字典的功能。数据字典不只存储各类对象的描述信息,并且存储系统管理所需的各类对象的细节信息。从内容来看,数据字典包含数据库系统中全部对象及其属性的描述信息、对象之间关系的描述信息、对象属性的天然语言含义以及数据字典变化的历史(即数据库的状态信息)。数据字典是关系数据库系统管理控制信息的核心,在PostgreSQL数据库系统中,系统表扮演着数据字典的角色

  系统表是PostgreSQL数据库存放结构元数据的地方,它在PostgreSQL中表现为存放有系统信息的普通表或者视图。用户能够删除而后重建这些表、增长列、插入和更新数值,然而由用户去修改系统会致使系统信息的不一致性,进而致使系统控制紊乱。正常状况下不该该由用户手工修改系统表,而是由SQL命令关联的系统表操做自动维护系统表信息。好比,建立数据库语句(CREATE DATABASE)会向pg_database系统表插入一行,而且在磁盘上建立该数据库。

 PostgreSQL的每个数据库中都有本身的一套系统表,其中大多数系统表都是在数据库建立时从模板数据库中拷贝过来的,所以这些系统表里的数据都是与所属数据库相关的。只有少数系统表是全部数据库共享的(好比pg_database),这些系统表里的数据是关于全部数据库的。

  因为系统表保存了数据库的全部元数据,因此系统运行时对系统表的访问是很是频繁的。为了提升系统性能,在内存中创建了共享的系统表CACHE,使用Hash函数和Hash表提升查询效率,这些内容将在第3章详细介绍。


进程结构

  PostgreSQL系统的主要功能都集中于Postgres程序,其中的各个进程都是经过载入Postgres程序而造成的进程,只是在运行时所处的分支不一样而已。PostgreSQL使用一种专用服务器进程体系结构,主要进程有: 

   Postgres程序的入口就是main模块的main函数。

守护进程postmaster(单用户模式下的Postgres进程)

 完成数据集簇初始化后,用户能够启动一个数据库实例来运行数据库管理系统,多用户模式下一个数据库实例由数据库服务器守护进程Postmaster来管理。主要功能:

 1.它是一个运行在服务器上的总控进程,负责整个系统的启动和关闭,而且在服务进程出现错误时完成系统的恢复。

 2.它管理数据库文件、监听并接受来自客户端(psql,jdbc等)的链接请求,而且为客户端链接请求fork一个Postgres服务进程,来表明客户端在数据库上执行各类命令。

 3.同时Postmaster还管理与数据库运行相关的辅助进程。用户可使用postmaster、postgres或者pg_ctl命令启动Postmaster。

  PostgreSQL采用C/S模式,系统为每一个客户端分配一个服务进程。Postmaster就像一个处理客户端请求的调度中心。前端应用欲访问某一数据库时,就调用接口库(好比ODBC、libpq)把用户的请求经过网络发给守护进程Postmaster。Postmaster将启动一个新的服务进程Postgres为用户服务,此后前端进程和服务进程再也不经过Postmaster而是直接进行通讯。

服务进程Postgres:

 服务进程Postgres接受并执行客户端(好比psql,或用户应用程序经过JDBC等接口)发送的命令(交互式SQL查询)。它在底层模块(如存储、事务管理、索引等)之上调用各个主要的功能模块(如编译器、优化器、执行器等),完成客户端的各类数据库操做,并返回执行结果。

    客户端每建立一个数据库链接,postmaster生成一个postgres服务器进程,直接接受用户的命令进行编译执行,并将结果返回给用户。如此循环,直到用户断开链接。 服务器进程经过信号量和共享内存来相互通讯。  

辅助进程(分别为实现不一样功能):

    系统日志进程SysLogger :

    后台写进程bgWriter:

    预写式日志写进程WalWriter:

    预写式日志归档进程pg_archive:

    系统自动清理进程AutoVacuum:将自动定时整理(清理)外存中的数据空间。

    统计数据收集进程pg_state:将自动统计系统运行中的一些动态信息。 

相关文章
相关标签/搜索