一、src/backend 源码目录梳理
目录文件 | 说明 |
---|---|
access/ | 各种存储访问方法(在各个子目录下) common(共同函数)、gin (Generalized Inverted Index通用逆向索引)、gist (Generalized Search Tree通用索引)、 hash (哈希索引)、heap (heap的访问方法)、index (通用索引函数)、 nbtree (Btree函数)、transam (事务处理) |
bootstrap/ | 数据库的初始化处理(initdb的时候) |
catalog/ | 系统目录 |
commands/ | 执行非计划查询的SQL命令,如创建表命令等。 |
executor/ | 执行器,执行来自Optimizer的查询计划。 |
foreign/ | FDW(Foreign Data Wrapper)处理 |
lib/ | 共同函数 |
libpq/ | 前端/后端通信处理 |
main/ | 主程序模块,它负责将控制权转到Postmaster进程或Postgres进程。 |
nodes/ | 表达式树节点相关的处理函数 |
optimizer/ | 优化器,根据查询树创建最优的查询路径和查询计划。 |
parser/ | 编译器,将SQL查询转化为内部查询树。 |
port/ | 平台兼容性处理相关的函数。 |
postmaster/ | 监听用户请求的守护进程,并控制Postgres进程的启动和终止。 |
replication/ | 流复制 |
regex/ | 正规表达式库及相关函数,用于支持正规表达式处理。 |
rewrite/ | 规则及视图相关的重写处理 |
snowball/ | 全文检索相关(语干处理) |
storage/ | 共享内存、磁盘上的存储、缓存等全部一次/二次记录管理(以下的目录)buffer/(缓存管理)、 file/(文件)、freespace/(Fee Space Map管理) ipc/(进程间通信)、large_object /(大对象的访问函数)、lmgr/(锁管理)、page/(页面访问相关函数)、 smgr/(存储管理器) |
tcop/ | Postgres服务进程的主要处理部分,它调用Parser、Optimizer、Executor和Commands中的函数来执行客户端提交的查询 |
tsearch/ | 全文检索 |
utils/ | 各种模块(以下目录) adt/(嵌入的数据类型)、cache/(缓存管理)、 error/(错误处理)、fmgr/(函数管理)、hash/(hash函数)、 init/(数据库初始化、postgres的初期处理)、 mb/(多字节文字处理)、misc/(其他)、mmgr/(内存的管理函数)、 resowner/(查询处理中的数据(buffer pin及表锁)的管理)、sort/(排序处理)、time/(事务的 MVCC 管理) |
二、进程结构
1. 守护进程Postmaster
进程作用
负责PG的启动和关闭;监听和接收客户端连接请求,为其派生服务进程Postgres,管理数据库运行相关的辅助进程。
-
数据库的启停
-
监听客户端连接
-
为每个客户端连接fork单独的postgres服务进程
-
当服务进程出错时进行修复
-
管理数据文件
-
管理数据库运行相关的辅助进程
2. 服务进程Postgres
进程作用
-
直接与客户端进程通讯
-
负责接收客户端所有的请求
-
包含数据库引擎,负责解析SQL和生成执行计划等
-
根据命令的需要调用各中辅助进程和访问各内存结构
-
负责返回命令执行结果给客户端
-
在客户端断开连接时释放进程
3. 辅助进程(后台进程)
进程名 | 作用 | 进程相互关系 | 启动函数 / 工作函数 | 配置项 |
---|---|---|---|---|
logger | 维护日志信息输出 | 循环监听前由Postmaster调用SysLogger_Start启动 | SysLogger_Start / SysLoggerMain | 设置开启logging_collector |
checkpointer | 处理检查点,将检查点前的脏页刷到磁盘 | 循环监听时根据触发时机(如shutdown)由Postmaster中StartChildProcess启动,会触发bg writer和walwriter | StartCheckpointer / CheckpointerMain | 设置周期checkpoint_timeout |
background writer | 将共享缓冲池(shared buffer)的脏页刷到硬盘 | 循环监听时由Postmaster中StartChildProcess启动,会受checkpoint触发 | StartBackgroundWriter / BackgroundWriterMain | 设置周期bgwriter_delay |
walwriter | 周期性将wal缓冲区的wal数据刷到硬盘 | 循环监听时由Postmaster中StartChildProcess启动,会受checkpoint触发 | StartWalWriter / WalWriterMain | 设置开启fsync |
autovacuum | 周期性自动清理数据库,回收空间,包括Launcher监控,Worker执行清理 | 循环监听时由Postmaster调用StartAutoVacLauncher启动,元组的数目从stats collector获取 | StartAutoVacLauncher / AutoVacLauncherMain | 设置开启autovacuum |
archiver | 将日志归档 | 循环监听时由Postmaster调用pgarch_start启动 | pgarch_start / PgArchiverMain | 设置开启archive_mode |
stats collector | 收集统计信息,用于pg_stat_activity等视图 | 循环监听时由Postmaster调用pgstat _start启动,收集到的信息能被autovaccum利用 | pgstat_start / PgstatCollectorMain | 设置开启track_activities |
logical replication launcher | 启动逻辑复制 | 循环监听前由Postmaster调用ApplyLauncherRegister启动(比其他后端进程早) | ApplyLauncherRegister / ApplyLauncherMain | 设置模式 wal_level=‘logical’ |
4. 复制相关进程
a. 预写式日志发送进程 wal sender
进程作用:主机通过网络传送WAL日志,和wal receiver进程合作实现流复制。
当流传输时,walsender保持从磁盘读取XLOG记录,并通过COPY 协议将他们发送到备用服务器,直到两端通过退出COPY模式结束复制或直接关闭连接。
b. 预写式日志接受进程 wal receiver
进程作用:备机通过网络接收WAL日志,和wal sender进程合作实现流复制。备机在接收到WAL日志后,在自身的数据库上还原,生成和主机一样的数据库。
c. 启动进程 startup
进程作用:主库在做完xlog归档模式恢复之后就把startup退了,正常启动。而备机不会退startup,持续等待、读取日志。