简介
postgres 数据库是目前最流行的开源关系型数据库之一,其具有丰富的数据类型、多版本并发控制、同步/异步流复制、嵌套事务和预写式日志等功能,广泛地应用于金融、物流、制造/电信等领域
基本概念
1 数据库cluster[逻辑]
database cluster:包含各种数据库对象,如表,索引,视图,索引,函数和序列等
2 数据库cluster [物理]
files | description |
---|---|
PG_VERSION | 包含postgres的版本号信息 |
pg_hba.conf | 客户端认正配置文件 |
pg_ident.conf | postgres 用户名映射文件 |
postgresql.conf | postgres 配置文件,包含各种参数设置:共享内存大小,最大连接数等 |
postgresql.auto.conf | 更改系统时存放各种配置参数信息 |
subdirectories | description |
---|---|
base | 创建数据库所在目录 |
global | 全局系统表,pg_class和pg_control等 |
pg_xact | 事务提交状态日志 |
pg_dynshmem | 记录动态共享内存信息 |
pg_logical | 存放逻辑解析过程中生成的数据 |
pg_wal | 存放预写式日志 |
pg_stat | 统计信息的持久性文件 |
pg_subtrans | 存放子事务状态日志 |
pg_twophase | 存放两阶段提交事务状态信息 |
架构介绍
1 进程架构
postgres数据库是一个多进程架构,采用典型服务端–客户端结构,进程间通过共享内存进行通信。其中最重要的两个进程server process (postmaster)和backend process. postmaster 负责整个系统的启动与关闭,管理整个数据库集群,同时接收来自客户端的连接请求,后fork出一个服务进程backend process. postmaster 为客户端提供服务,执行客户端的各种命令。
此外postmaster进程还启动一些辅助进程共同实现数据库的各种功能。
- background writer:后台写进程,负责将缓冲池的脏页数据写回磁盘,
- checkpointer:检查点,每隔一定周期将脏页刷盘,包括共享缓冲池和SLRU脏数据
- autovacuum:自动清理进程,用于回收被删除元组空间,避免数据文件无限膨胀
- WAL writer: WAL写进程,负责将wal buffer 刷写至磁盘,缓解业务高峰时日志的并发写入,对数据库性能造成影响
- statistics collector:信息收集进程,负责收集数据库系统运行的统计信息,主要用于查询优化时的代价估算
- pgArch:日志归档进程,负责将WAL日志进行归档备份,加强数据库的高可靠性和高可用性,防止数据意外丢失。
如果许多客户端(如WEB应用程序)频繁地重复与PostgreSQL服务器的建立连接与断开,就会增加建立连接和创建后端进程的成本,因为PostgreSQL没有实现本地连接池特性。这种情况会对数据库服务器的性能产生负面影响。要处理这种情况,通常使用池中间件(pgbouncer或pgpool-II)。
2 共享内存架构
在postgres数据库中,内存分为共享内存和私有内存[backend process]。
私有内存主要由temp_buffers、work_mem和maintenance_work_mem组成
type | description |
---|---|
temp_buffers | 存放执行过程中的临时数据或者临时表 |
work_mem | 此区域用于ORDER by和DISTINCT操作,以及各种joins操作 |
maintenance_work_mem | 此区域用于执行各种维护性操作如 VACUUM、REINDEX操作 |
共享内存包括共享缓冲池、WAL buffer、SLRU<clog和subtrans日志>
type | description |
---|---|
shared buffer pool | 存放table和index数据页 |
WAL buffer | 用于存放WAL日志,加载或者持久化 |
SLRU | (子)事务状态日志缓冲区,包括CLOG和SUBSTRANS |