PostgreSQL的物理架构由 共享内存、一系列后台进程和数据文件组成
一、共享内存
共享内存是服务器为数据库缓存和事务日志缓存预留的内存缓存空间
Shared Memory=Shared Buffer + WAL Buffer
Shared Buffer的目的是减少磁盘IO ,为了达到这个目的,必须满足以下规则:
当需要快速访问非常大的缓存时(10G、100G等)
如果有很多用户同时使用缓存,需要将内容尽量缩小
频繁访问的磁盘块必须长期放在缓存中
WAL Buffer是用来 临时存储数据库变化的 缓存区域。存储在WAL Buffer中的内容会根据提前定义好的时间点参数要求
写入到磁盘的WAL文件中。
在备份和恢复的场景下,WAL Buffer和WAL文件是极其重要的。
二、进程
##PostgreSQL有四种进程类型
Postmaster (Daemon) Process(主后台驻留进程)
Background Process(后台进程)
Backend Process(后端进程)
Client Process(客户端进程)
1.Postmaster (Daemon) Process(主后台驻留进程)
主后台驻留进程是PostgreSQL启动时第一个启动的进程。启动时,他会执行恢复、初始化共享内存爱你的运行后台进程操作。
正常运行期间,当有客户端发起链接请求时,它还负责创建后端进程。
pstree -p pid 命令查看进程之间的关系,你会发现Postmaster进程是其他所有进程的父进程
2.Background Process(后台进程)
logger 将错误信息写到log日志中
checkpointer 当检查点出现时,将脏内存块写到数据文件
writer 数据文件写进程,周期性的将脏内存块写入文件
wal writer wal写进程,将WAL缓存写入WAL文件
Autovacuum launcher 当自动vacuum被启用时,用来派生autovacuum工作进程。autovacuum进程的作用是在需要时自动对膨胀表执行vacuum操作。
archiver 在归档模式下时,复制WAL文件到特定的路径下。
stats collector 用来收集数据库统计信息,例如会话执行信息统计(使用pg_stat_activity视图)和表使用信息统计(pg_stat_all_tables视图)
3.Backend Process(后端进程)
后端进程用于处理前端用户请求并返回结果。查询运行时需要一些内存结构,就是所谓的本地内存(local memory)。
本地内存涉及的主要参数有:
work_mem:用于排序、位图索引、哈希链接和合并链接操作。默认值为4MB。
maintenance_work_mem:用于vacuum和创建索引操作。默认值为64MB。
temp_buffers:用于临时表。默认值为8MB。
4.Client Process(客户端进程)
客户端进程需要和后端进程配合使用,处理每一个客户链接
三、数据分布及文件
数据库
当initdb()命令执行后,template0 , template1 , 和postgres数据库被创建。
template0和template1数据库是创建用户数据库时使用的模版数据库,他们包含系统元数据表。
initdb()刚完成后,template0和template1数据库中的表是一样的。但是template1数据库可以根据用户需要创建对象。
用户数据库是通过克隆template1数据库来创建的;
表空间
initdb()后马上创建pg_default和pg_global表空间。
建表时如果没有指定特定的表空间,表默认被存在pg_default表空间中。
用于管理整个数据库集群的表默认被存储在pg_global表空间中。
pg_default表空间的物理位置为$PGDATA\base目录。
pg_global表空间的物理位置为$PGDATA\global目录。
一个表空间可以被多个数据库同时使用。此时,每一个数据库都会在表空间路径下创建为一个新的子路径。
创建一个用户表空间会在$PGDATA\pg_tblspc目录下面创建一个软连接,连接到表空间制定的目录位置
表
每个表有三个数据文件。
一个文件用于存储数据,文件名是表的OID。
一个文件用于管理表的空闲空间,文件名是OID_fsm。
一个文件用于管理表的块是否可见,文件名是OID_vm。
索引没有_vm文件,只有OID和OID_fsm两个文件