Today is new!
00.01 Postgres简介
PostgreSQL是以加州大学伯克利分校计算机系开发的POSTGRES Version 4.2为基础的对象关系型数据库管理系统(ORDBMS), 为了更好的了解Postgres的原理以及发展历史,我准备花费一段时间来学习Postgres的源码,历史源码可在伯克利的POSTGRES 站点中获取,也可以在本系列文章的Git仓库中获取,本文为 Postgres-v3r1 源码阅读系列第一篇文章。
00.02 目录结构
顶层目录
COPYRIGHT:版权与许可信息。bench/:性能基准与压力测试脚本与查询集(如query1~query32、r1k/r10k)。demo/:示例程序与脚本,展示数据库功能或扩展用法(如circle.c、boxarea.c)。doc/:文档与手册来源(开发者说明、打印支持、参考文档生成相关文件)。newconf/:构建与配置系统(Makefile 片段、平台/端口配置、依赖与文件清单)。ref/:参考资料与工具(如libpq客户端库文档、postquel历史语言资料、Unix 脚本initdb/vacuum)。sample/:示例说明或模板。test/:独立测试脚本与示例代码(如script-1、von.c)。video/:教学/演示用数据与脚本(如rect_data和大量script-*)。
核心源码 src/
每一个目录都对应着一个模块;
access/heap/:堆表的存储访问方法实现。bootstrap/:系统引导工具(创建系统目录/基础对象)。commands/:SQL 命令层的实现(如CREATE/ALTER等)。contrib/3M/:附加模块或第三方示例。executor/:查询执行器(执行计划的实际运行)。lib/:通用库和工具C/、Gen/、H/:生成脚本、头文件与通用 C 代码。catalog/:系统目录(元数据)相关工具与定义。libpq/:客户端通信库(早期libpq)。
main/:服务入口(如main.c)。parser/:解析器及 I/O 例程(io.c/io.h)。planner/:查询优化器与计划生成。port/:不同平台的移植层(dec/、sparc/、sunos4/等)。rewrite/:规则系统重写器(基于规则的查询重写)。rules/:规则定义与桩代码(prs2/、stubs/)。scripts/:构建/运维/测试辅助脚本。storage/ipc/:存储与进程间通信(共享内存、锁等)。support/:构建与开发支撑工具。tcop/:前后端命令处理与输出目标控制(如dest.c)。test/:源码内的测试配置(如buf.mk)。utils/:通用实用组件adt/:内置类型与其函数。cache/:系统缓存。error/:错误与日志处理。fmgr/:函数管理器(动态函数调用)。hash/:哈希结构。init/:初始化流程。mmgr/:内存管理。sort/:排序实现。time/:时间/日期相关。
00.03 构建系统
当前工程的构建系统符合时代背景,它使用多个脚本协同进行构建项目,首先最主要的是一个使用csh编写的名为Make的脚本来驱动整个构建过程的。
通过构建系统,主要可以得到如下目标:
- 可执行文件
postgres:数据库后端主程序。postmaster:PostgreSQL 主进程,负责初始化数据库系统、监听连接、管理后端进程。monitor:监控工具,用于监控数据库系统的运行状态(依赖libpq.a)。xexemon: X11执行器监视器pg_version:打印数据库版本信息。pg_id: 用户/标识工具
- 静态库
cinterface.a:C 接口库,用于与 C 代码交互。libpq.a:PostgreSQL 客户端库,用于与postgres后端交互。
总体思路
“驱动脚本 + 片段拼接”:
- 解析命令行参数,设置环境与开关。
- 根据目标名将
config.mk、模块FILES/*.mkf、规则postgres.mk、support.mk、postmaster.mk、defaults.mk等拼成一个临时Makefile。 - 把该
Makefile内容通过标准输入传给make -f -在上级目录(项目根)执行,生成中间.o聚合和最终二进制。
支持平台
底层支持的实现代码在src/port/目录下,每个子目录对应着一个平台的实现。分别为
- dec: MIPS/DECstation 平台的通用移植
- decsprite: DEC MIPS + Sprite 操作系统的移植
- sparc: SPARC 平台的通用移植
- sun: SunOS 平台的通用移植
- sunos4: SunOS 4.x 平台的通用移植
- ultrix: DEC Ultrix 4.x 的专用移植(DEC 机器,MIPS/VAX 体系)
00.04 系统架构
本节的内容根据当前版本自带的文档进行整理,在本系列的最后一章会对系统架构进行详细的分析。
Postgres采用三主程序的通讯结构,分别是
- 用户应用(User Application): 通过
libpq与后端交互,可运行在任意可访问服务端的主机上。 - Postmaster: 处理网络初始化与链接;首次启动分配共享内存与信号量以供后端使用;为每个连接
fork一个后端进程,之后返回监听。 - Postgres(backend): 真正的数据库引擎;与对应的用户应用一对一的查询与结果。
下一节将具体分析分析后端的代码逻辑。
Postgres-v3r1源码阅读00- 源码概述
http://example.com/2021/08/31/2021-09-01-Postgres-v3r1源码阅读00/