元素码农
基础
UML建模
数据结构
算法
设计模式
网络
TCP/IP协议
HTTPS安全机制
WebSocket实时通信
数据库
sqlite
postgresql
clickhouse
后端
rust
go
java
php
mysql
redis
mongodb
etcd
nats
zincsearch
前端
浏览器
javascript
typescript
vue3
react
游戏
unity
unreal
C++
C#
Lua
App
android
ios
flutter
react-native
安全
Web安全
测试
软件测试
自动化测试 - Playwright
人工智能
Python
langChain
langGraph
运维
linux
docker
工具
git
svn
🌞
🌙
目录
▶
基础概念
什么是PostgreSQL
适用场景解析
架构体系简介
▶
安装配置
Windows安装指南
MacOS环境搭建
Linux部署实战
初始配置详解
连接方式大全
▶
数据库操作
创建第一个数据库
数据库查看方法
数据库删除操作
psql命令行工具
▶
数据管理
表结构设计基础
数据类型详解
CRUD操作指南
约束条件设置
索引使用入门
▶
用户权限
创建用户角色
权限分配策略
密码修改方法
▶
备份与恢复
pg_dump使用指南
简单备份策略
数据恢复演练
发布时间:
2025-04-08 08:33
↑
☰
# 架构体系简介 PostgreSQL的架构设计是其强大功能和卓越性能的基础。本文将详细介绍PostgreSQL的整体架构、核心组件及其工作原理,帮助您深入理解这一先进数据库系统的内部结构。 ## PostgreSQL架构概览 PostgreSQL采用客户端/服务器模型,由多个协同工作的进程组成。这种模块化设计使PostgreSQL具有良好的可扩展性和稳定性。 ### 基本架构图 ``` +----------------+ +----------------+ +----------------+ | 客户端应用 | ... | 客户端应用 | | 管理工具(如 | | (应用服务器等) | | (应用服务器等) | | pgAdmin) | +-------+--------+ +-------+--------+ +-------+--------+ | | | v v v +----------------------------------------------------------------------+ | TCP/IP网络 | +----------------------------------------------------------------------+ | | | v v v +----------------------------------------------------------------------+ | PostgreSQL服务器 | | | | +----------------+ +----------------+ +----------------+ | | | Postmaster | | 后端进程 | | 后台工作进程 | | | | (主服务进程) | | (处理客户连接) | | (自动清理等) | | | +----------------+ +----------------+ +----------------+ | | | | +----------------+ +----------------+ +----------------+ | | | 共享内存 | | 预写式日志 | | 数据文件 | | | | (缓冲区等) | | (WAL) | | | | | +----------------+ +----------------+ +----------------+ | +----------------------------------------------------------------------+ ``` ## 核心进程组件 ### 1. Postmaster进程 Postmaster是PostgreSQL的主服务进程,负责: - 启动和初始化数据库服务器 - 监听客户端连接请求 - 为每个新连接创建后端进程 - 监控和管理所有子进程 - 处理服务器崩溃恢复 当您执行`pg_ctl start`或系统服务启动PostgreSQL时,首先启动的就是Postmaster进程。 ### 2. 后端进程(Backend Process) 每个客户端连接都由一个专用的后端进程处理,负责: - 与特定客户端通信 - 解析和执行SQL查询 - 管理事务 - 返回查询结果 这种一对一的连接模型确保了连接的独立性和稳定性,一个连接的问题不会影响其他连接。 ### 3. 后台工作进程(Background Worker Processes) PostgreSQL包含多个后台工作进程,执行各种维护任务: - **后台写入器(Background Writer)**:定期将共享缓冲区中的脏页写入磁盘,减少检查点时的I/O压力 - **自动清理工作进程(Autovacuum Worker)**:自动执行VACUUM和ANALYZE操作,回收空间并更新统计信息 - **检查点进程(Checkpointer)**:执行检查点操作,确保数据持久性 - **WAL写入器(WAL Writer)**:将WAL缓冲区数据写入磁盘 - **统计收集器(Statistics Collector)**:收集数据库活动统计信息 - **日志记录器(Logger)**:管理日志文件 ## 内存架构 ### 1. 共享内存区(Shared Memory) PostgreSQL使用共享内存区在各进程间共享数据和状态: #### 共享缓冲区(Shared Buffers) 最重要的共享内存组件,用于缓存数据页: - 减少物理I/O操作 - 加速数据读取和修改 - 大小由`shared_buffers`参数控制 ```sql -- 查看共享缓冲区大小设置 SHOW shared_buffers; ``` #### WAL缓冲区(WAL Buffers) 用于临时存储预写式日志记录: - 提高WAL写入性能 - 大小由`wal_buffers`参数控制 #### 工作内存区域 - **排序内存(Sort Memory)**:用于排序操作,由`work_mem`参数控制 - **维护工作内存(Maintenance Work Memory)**:用于维护操作,由`maintenance_work_mem`参数控制 ### 2. 本地内存区(Local Memory) 每个后端进程还有自己的本地内存区域: - **工作区(Work Area)**:执行排序、哈希等操作的临时空间 - **查询上下文(Query Context)**:存储查询执行状态 - **会话上下文(Session Context)**:存储会话变量和状态 ## 存储架构 ### 1. 数据库集簇(Database Cluster) PostgreSQL中的数据库集簇是由单个PostgreSQL服务器实例管理的所有数据库的集合: - 通常存储在一个目录中(数据目录) - 包含全局对象和多个数据库 - 由`initdb`命令初始化 ### 2. 数据文件组织 PostgreSQL的数据存储在多个文件中: #### 表空间(Tablespace) 表空间允许将数据库对象存储在不同的物理位置: - 默认表空间位于数据目录的`base`子目录中 - 自定义表空间可以位于任何位置 ```sql -- 创建自定义表空间 CREATE TABLESPACE fast_space LOCATION '/ssd/postgresql/data'; -- 在特定表空间创建表 CREATE TABLE large_table (...) TABLESPACE fast_space; ``` #### 数据文件 - 每个表和索引存储在一个或多个1GB大小的文件中 - 文件名基于对象ID - 文件内部划分为8KB的页(可在编译时配置) ### 3. 预写式日志(WAL) WAL是PostgreSQL的事务日志系统,确保数据完整性: - 记录所有数据修改 - 支持崩溃恢复 - 支持时间点恢复和复制 - 存储在数据目录的`pg_wal`子目录中 ## 查询处理流程 了解PostgreSQL的查询处理流程有助于理解其架构工作原理: ### 1. 查询解析(Parser) - 检查SQL语法 - 创建查询树 ### 2. 查询重写(Rewriter) - 应用规则系统(如视图展开) - 转换查询树 ### 3. 查询规划(Planner) - 生成可能的执行计划 - 估算成本 - 选择最优执行计划 ```sql -- 查看查询执行计划 EXPLAIN SELECT * FROM orders JOIN customers ON orders.customer_id = customers.id; ``` ### 4. 查询执行(Executor) - 执行选定的计划 - 访问表和索引 - 处理中间结果 - 返回最终结果 ## 并发控制 ### 多版本并发控制(MVCC) PostgreSQL使用MVCC实现高效的并发控制: - 读操作不阻塞写操作 - 写操作不阻塞读操作 - 每个事务看到数据的一致性快照 - 通过在行级别存储多个版本实现 ``` 时间线 ─────────────────────────────────────────────────────────────▶ 事务1 开始 提交 │ │ ▼ ▼ 读取行(值=10) 读取行(值=10) 事务2 开始 提交 │ │ ▼ ▼ 读取行(值=10) 读取行(值=10) 更新行(值=20) ``` ### 事务隔离级别 PostgreSQL支持SQL标准定义的所有事务隔离级别: - **读未提交(Read Uncommitted)**:实际上与读已提交相同 - **读已提交(Read Committed)**:默认级别,只能看到已提交的数据 - **可重复读(Repeatable Read)**:确保事务内多次读取结果一致 - **可序列化(Serializable)**:最严格的级别,防止所有并发异常 ```sql -- 设置事务隔离级别 BEGIN; SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; -- 执行查询... COMMIT; ``` ## 扩展系统 PostgreSQL的架构设计包含强大的扩展系统: ### 1. 扩展框架 允许打包和安装额外功能: ```sql -- 安装PostGIS扩展 CREATE EXTENSION postgis; ``` ### 2. 自定义数据类型 可以创建新的数据类型: ```sql -- 创建复合类型 CREATE TYPE address AS ( street TEXT, city TEXT, zip TEXT ); ``` ### 3. 自定义函数 支持多种语言编写函数: ```sql -- 创建PL/pgSQL函数 CREATE FUNCTION calculate_tax(price NUMERIC) RETURNS NUMERIC AS $$ BEGIN RETURN price * 0.08; END; $$ LANGUAGE plpgsql; ``` ### 4. 自定义索引类型 可以实现新的索引方法。 ## 高可用架构 PostgreSQL支持多种高可用架构: ### 1. 流复制(Streaming Replication) - 基于WAL的物理复制 - 支持同步和异步模式 - 可用于负载均衡和故障转移 ### 2. 逻辑复制(Logical Replication) - 基于发布/订阅模型 - 支持选择性复制 - 支持不同版本间复制 ## 总结 PostgreSQL的架构设计体现了其作为企业级数据库的成熟性和灵活性。通过模块化的进程结构、高效的内存管理、可靠的存储系统和先进的并发控制机制,PostgreSQL能够满足各种复杂应用场景的需求。 了解PostgreSQL的架构不仅有助于更好地使用数据库,还能帮助进行有效的性能调优和故障排除。随着对PostgreSQL架构的深入理解,您将能够更充分地发挥这一强大数据库系统的潜力。