一、应用程序的访问架构

1、用户通过客户端/浏览器访问应用软件层
2、应用软件层通过数据驱动层的接口、驱动器去连接PostgreSQL数据库
3、数据库安装在操作系统上(Windows/Linux)
二、体系结构

PostgreSQL数据库启动时,会先启动一个Postmaster主进程。然后由主进程分支出一些辅助子进程,辅助子进程各自负责一部分功能。主进程 Postmaster
主进程
Postmaster是整个数据库实例的总控进程,负责启动和关闭数据库实例。所以Postmaster是第一个postgres服务进程,此主进程还会fork出一些与数据库实例相关的辅助子进程,并管理它们。当用户连接到数据库时,首先与Postmaster主进程建立连接,并且客户端发送身份验证信息给Postmaster主进程,验证通过之后Postmaster主进程fork出一个子进程为这个连接服务,这个子进程称为服务进程。当服务进程出现错误时,数据库会自动完成系统的恢复。恢复过程中会断开所有的服务进程,进行数据库的一致性恢复,恢复完成后又可以接受新的连接。Syslogger(系统日志) 进程
Syslogger辅助进程通过Postmaster进程、所有的服务进程、其他的辅助进程收集所有的stderr输出,并将这些输出写入到日志文件中。Syslogger辅助进程由postgresql.conf中的logging_collect参数控制,当参数值=on的时候,主进程会启动Syslogger辅助进程。BgWriter(后台写)进程
BgWriter辅助进程的作用就是将共享内存中的脏页写入到磁盘中,将数据持久化。这么做的目的是为了提高数据库性能WalWriter(预写式日志)进程
WAL log简称为xlog,WalWriter辅助进程就是写WAL log的进程。预写式日志的概念就是在修改数据之前,把这些修改操作记录到磁盘中,这样后面更新实际数据时,就不需要实时的把数据持久化到文件中了。即使服务器突然宕机或数据库崩溃,导致共享内存中的一部分脏页没有及时的刷新到磁盘中,在数据库重启后,通过读取WAL日志,就可以恢复到宕机时的状态。Pgarch进程
因为WAL日志是循环写入的,所以较早时间的日志会被覆盖。
Pgarch辅助进程会在覆盖之前将日志备份出来,其目的也是备份恢复。利用全备+归档可以实现PITR(point-in-time-recovery)技术,将数据库向前恢复到全备以后的任意时间点。AutoVacuum进程
对表中的数据做Delete操作时,并不会删除旧的数据,而是标识为删除状态。做Update操作时,也不会修改旧的数据,而是复制新的行在上面修改。这些旧数据只有在没有并发的其他事务下查询到时,
AutoVacuum辅助进程才会去清理。Pgstat进程
Pgstat辅助进程主要做数据的统计收集工作。收集的信息主要用于查询优化时的代价估算,这些信息包括在一个表和索引上进行了多少次插入、更新、删除操作,磁盘块读写的次数,以及行的读次数。
共享内存
主要作用就是用做数据块的缓冲区,提高读写性能。WAL log和CLog(commit log)缓冲区也存在共享内存中。一些全局信息也保存在共享内存中,如进程信息,全局统计信息、锁信息。
本地内存
后台服务进程除了访问共享存储以外,还会申请分配一些本地内存。用来暂存一些不需要全局存储的数据,主要包括:
- 临时缓冲区:用于访问临时表的本地缓冲区。
- work_mem:内部排序操作和Hash表在使用临时磁盘文件之前使用的内存缓冲区。
- maintenance_work_mem:在维护性操作(比如VACUUM、CREATE INDEX和ALTER TABLE ADD FOREIGN KEY等)中使用的内存缓冲区。
三、逻辑结构
数据库:一个
PostgreSQL数据库服务可以管理多个数据库,用户连接到一个数据库时,一般只能访问这个数据库中的数据,而不能访问其他数据库中的数据。(除非使用了dblink)表、索引:一个数据库中可以有很多表、索引。
PG中表叫Relation行:一张表中有很多行,
PG中叫Tuple模式(Schema):模式在数据库中,一个模式中包含表、索引、函数等数据库对象。两个模式中可以存在相同的表,不会互相影响。用户连接到一个数据库后可以访问这个数据库中多个模式下的数据库对象。
模式的作用:1、允许多个用户在使用同一个数据库时互不干扰。 2、数据库对象放在不同的模式下,便于管理。 3、第三方的应用可以放在不同的模式下,不会存在冲突问题。




