reorderbuffer.c 源码深度解析:PostgreSQL 逻辑复制的"事务重组引擎
PostgreSQL 的逻辑复制链路:
配套源码:~/cwork/postgresql(基于 PG 18 主干)
配套源码:~/cwork/postgresql(基于 PG 18 主干)配套前文:Apply Parallel Worker 运行机制解析
源码基线:PostgreSQL 18(src/backend/replication/logical/{applyparallelworker,worker,launcher}.c)
文档版本:v1.0适配版本:PostgreSQL 18源码基线:src/backend/replication/logical/{worker,applyparallelworker,launcher}.c、src/include/replication/{logicalworker,worker_internal}.h
文档版本:v1.0适配版本:PostgreSQL 18(含社区已合入的并行 Apply 增强补丁)源码基线:src/backend/replication/logical/{worker,applyparallelworker,launcher,tablesync}.c
文档版本:v1.0适配版本:PostgreSQL 18源码基线:src/backend/replication/logical/{worker,applyparallelworker}.c、src/include/replication/worker_internal.h
本文是一份性能分析入门 + 实战指南。前半段讲清楚火焰图和 perf 是什么、怎么用;后半段用 PostgreSQL 逻辑复制的 4 个真实问题,演示怎么用火焰图定位瓶颈。读完你会获得一个完整的"实战方法论"。
本文是「PostgreSQL 源码系列」并发篇。配套源码版本:PostgreSQL 18 dev(~/cwork/postgresql)。同系列前文:
本文是「PostgreSQL 源码系列」的逻辑复制 worker 模型篇。配套源码版本:PostgreSQL 18 dev(~/cwork/postgresql)。同系列前文:
本文是「PostgreSQL 源码系列」的逻辑复制性能篇。配套源码版本:PostgreSQL 18 dev(~/cwork/postgresql)。同系列前文:
本文是「PostgreSQL 逻辑复制系列」的第 N 篇,重点不在原理拆解,而在「用一条 docker compose up -d 把 publisher/subscriber 拉起来」。同系列前文:
本文是「PostgreSQL 逻辑复制系列」的第 N 篇。配套源码版本:PostgreSQL 18 dev(~/cwork/postgresql)。同系列前文:
本文是「PostgreSQL 逻辑复制系列」的第 N 篇。配套源码版本:PostgreSQL 18 dev(~/cwork/postgresql)。同系列前文:
本文是「PostgreSQL 逻辑复制系列」的 spill 专题。配套源码版本:PostgreSQL 18 dev(~/cwork/postgresql)。同系列前文:
本文是「PostgreSQL 逻辑复制系列」的延伸篇。配套源码版本:PostgreSQL 18 dev(~/cwork/postgresql)。同系列前文:
本文是「PostgreSQL 逻辑复制系列」的第 N 篇。配套源码版本:PostgreSQL 18 dev(~/cwork/postgresql)。同系列前文:
本文是 PostgreSQL 逻辑复制与分区表:从 publisher 到 partition leaf 的全链路 的深度细化篇。
本文是 PostgreSQL 逻辑复制的 Worker 模型 与 PostgreSQL 逻辑复制与分区表:从 publisher 到 partition leaf 的全链路 的姊妹篇。
本文是 PostgreSQL 逻辑复制与分区表:从 publisher 到 partition leaf 的全链路 的姊妹篇。
本文是 PostgreSQL 分区表:从一行 PARTITION BY 到路由热路径的全链路拆解 的姊妹篇。
CREATE SUBSCRIPTION 那一长串 WITH (...) 参数,每个都对应 pg_subscription 系统表里的一列,背后是 apply worker 一段真实的代码分支。
目标:吃透 PG 的 logical replication 全套机制——logical decoding、ReorderBuffer、output plugin、publication/subscription、initial sync、conflict handling、walsummarizer。这是 PG 实现跨大版本、跨表、跨粒度复制的核心能力。
问题原因:逻辑复制同步DDL在sqlserver模式下不支持分区表同步,根本原因为分区表创建依赖于Partition Function 、Partition Scheme,但这两个语句不走PG标准的执行流程(ProcessUtility),无法被捕获。
1.当前产品面向比亚迪现场,现场需要sqlserver模式,当前sqlserver模式下的逻辑复制能力范围边界尚不清楚;(从产品和架构层面出发评估)
当前数据库使用babelfish插件(bbf)来支持sqlserver模式,bbf采用双端口的设计:即数据库在启动时会监听多个端口,一般是pg原生的端口和tsql端口,比如5432和1433.
本文档汇总 Babelfish 插件在 SQL Server 模式下使用逻辑复制 DDL 自动同步时的已知限制,并按客户使用影响给出分级和建议做法。
PostgreSQL 当前内建逻辑复制主要覆盖表级 DML 复制。logical decoding 的本质是从 WAL 中提取持久化变更,转成更高层可理解的变更流;复制槽保证“按源端发生顺序”向客户端提供变化序列。([PostgreSQL][1])
可以,下面我直接给你一版接近 PostgreSQL patch 风格的 LogLogicalDDLMessage() 实现草稿。它的设计核心是:复用 PostgreSQL 现有 generic logical decoding message 的 WAL 记录格式与写入路径。
在初次写入数据的时候,ddl写到了系统表,dml先写入日志,然后apply成数据。当前逻辑复制的原理是根据lsn读取wal日志,将wal日志decode成sql,然后发送目标端。
一个DDL需要多个事务,比如在线建分区;2. 性能问题;(发布性能较低,流式发布)3. 用户接口跟产品确认;(用户接口清单,ddl同步范围),table和others的清单列出;
本文通过实际操作演示 PostgreSQL 15 逻辑复制的完整流程,重点展示:- WAL(Write-Ahead Logging)日志的生成与解析
本文面向需要理解 PostgreSQL 逻辑复制/逻辑解码链路的开发人员,解释 LogLogicalMessage 的定位、内部实现、设计初衷和工程使用方式。
pglogical.so是pglogical中的数据库扩展(extension),负责管理复制拓扑、节点、replication set、apply worker 等控制逻辑。
逻辑解码(Logical Decoding)是 PostgreSQL(及其扩展版本)提供的一套机制,用来将 WAL(物理日志)中的数据修改恢复成“逻辑级别”的变更事件: