reorderbuffer.c 源码深度解析:PostgreSQL 逻辑复制的"事务重组引擎
PostgreSQL 的逻辑复制链路:
applyparallelworker.c 表面上是一个 1646 行的文件,但里面同时承载了 两套截然不同的角色:
本文是「PostgreSQL 源码系列」压测篇。配套源码版本:PostgreSQL 18 dev(~/cwork/postgresql)。同系列前文:
本文是「PostgreSQL 源码系列」的逻辑复制 worker 模型篇。配套源码版本:PostgreSQL 18 dev(~/cwork/postgresql)。同系列前文:
PostgreSQL 启动时申请的 shared_buffers 那一大段内存,其实只是冰山一角。整座数据库的"内存世界"由三层拼起来:
目标:搞清楚 OLTP 的行存与 OLAP 的列存的本质差异,了解 PG 原生为啥是行存、cstorefdw / parquetfdw / Hydra 怎么实现列存、PG 17/18 列存方向。这是面试常被问、也是存储引擎内核最常被重构的方向之一。
目标:吃透 PG 的 logical replication 全套机制——logical decoding、ReorderBuffer、output plugin、publication/subscription、initial sync、conflict handling、walsummarizer。这是 PG 实现跨大版本、跨表、跨粒度复制的核心能力。
目标:吃透 PG 的 streaming replication 全套机制——wal sender、wal receiver、replication slot、sync vs async、cascade、failover、monitoring。这是读写分离、高可用、灾备的基石。
目标:把 PG 的 crash recovery 单独成章,吃透 redo 全流程、timeline 切换、PITR 的内部细节、partial restore、recovery target 与 promote。这是"内核工程师"与"会用 PG"的关键分水岭,因为很多线上故障都靠它定位。
目标:把前面 9 章没覆盖的访问方法与执行层高级特性收口:其他 access method(hash/gist/gin/spgist/brin)、并行执行、分区、FDW、JIT、logical replication。这一章不要求每项精通,但需要知道“这些都怎么入手”。
目标:吃透 PG 的 Write-Ahead Logging 子系统——XLogRecord 结构、rmgr 注册表、redo/undo、checkpoint、recovery、流复制。这是与 InnoDB redo log 最常被拿来对照的部分。
目标:把 PG 的“事务子系统”吃透:xact 状态机、Snapshot、clog/subtrans、lmgr 的表/页/元组三级锁、lwlock、SSI 实现。这是“资深内核开发”与“会用 PG”的分水岭。
目标:从页面布局到搜索 / 插入 / 分裂 / 删除 / WAL 全流程吃透 PG 的 B-Tree 实现。PG 13+ 引入的 deduplication 是重点。
目标:理解 PostgreSQL 堆表的页面布局、HeapTuple 结构、xmin/xmax/cmin/cmax 语义、HOT 链、pruning、vacuumlazy。这是 PG 与 MySQL InnoDB 在工程上最大的差异点。
目标:掌握 PostgreSQL shared buffer pool 的实现——BufferDesc 元数据、hash 索引、clock-sweep 替换策略、AIO 集成、lock 与 pin 的差别。这一章是“存储引擎内核”最关键的章节。
目标:理解 PG 在“OS 文件系统”和“表/索引页面”之间插的一层抽象(Storage Manager),以及默认实现磁碟版(md.c)。这一层是 PG 与其它 DBMS 在工程上差异最大的一处——比 InnoDB 的 fil_system 还更“裸露”。
目标:从 backend 收到一条 query 字节那一刻起,逐函数跟踪到执行器出口。理解 解析 → 重写 → 优化 → 执行 四阶段的产物(RawStmt / Query / PlannedStmt / PlanState)。
目标:理解“一个客户端连接 = 一个 backend 进程”的进程模型,掌握 postmaster 如何 fork / signal 整个家族,以及每个子进程的工作。
目标:能在 ~/cwork/postgresql 上 30 分钟内编译成功、能 GDB 跟一条 SQL、能用 ctags / cscope 在代码里跳转。
libqb 是一个提供高性能客户端服务器可重用功能的库。 它提供高性能日志记录、跟踪、IPC 和轮询的功能。libqb 的初始功能来自 corosync 的功能,专门针对客户端/服务器应用程序实现的高性能 API。