pgrac 是 PostgreSQL 16 的共享磁盘集群扩展,目标是把 Oracle RAC 的核心机制(Cache Fusion / GES / SCN / 三路心跳 / merged recovery)以最小侵入方式带到 PG 生态。本章不讲实现,只建立概念地图:哪些 PG 单机假设需要破除,哪些新概念被引入,跨节点协议如何相互配合。
共享磁盘集群(share-disk)与典型的 share-nothing 分布式数据库(Citus / Cockroach 等)不同:
结论:share-disk 模型在 OLTP / 混合负载下可以接近线性扩展(≥ 90% 效率),是 Oracle RAC 与 pgrac 的共同前提。
+--------+ +--------+ +--------+
| Node 1 | | Node 2 | | Node 3 |
+--------+ +--------+ +--------+
\ | /
\ Interconnect (RDMA) /
\____________|____________/
|
+----------------+
| Shared Storage |
+----------------+
| Oracle RAC 机制 | pgrac 等价 | 章节 |
|---|---|---|
| Cache Fusion | Cache Fusion 3-way | Ch 2 |
| GES (Global Enqueue Service) | GES Lock Protocol | Ch 3 |
| SCN (System Change Number) | SCN Protocol | 后续章节 |
| Reconfiguration | Freeze/Rebuild/Thaw | 后续章节 |
PG 16 是单 instance 设计。集群引入后,至少 5 个核心假设需要破除:
PG 每个 block 只存 1 个 in-memory 副本。pgrac 引入 3 类 buffer(current / CR / PI)以支持跨节点读 + 一致性读 + 传走脏页保留。
PG 的 LWLock + 8 种 enqueue lock 都在共享内存中,不跨节点。pgrac 用 GES 统一管理跨实例 enqueue 锁,用 PCM 管理跨实例 buffer block 锁。
PG 单机 visibility 走 heap tuple 的 xmin/xmax 加 CLOG 查询。集群环境下不同节点的 xid 空间无法直接比对。pgrac 引入 SCN(Lamport timestamp) 作为跨实例时序基准。
PG 单机有一个 pg_wal/ 目录,所有事务串行写入。pgrac 改为每实例独立 redo stream(pg_wal_node_N/),崩溃后用 SCN 顺序合并 redo apply。
PG 单机崩溃恢复在 startup 时由单进程完成 redo apply。pgrac 引入 reconfiguration(freeze / rebuild GRD / thaw)+ merged recovery(合并多 stream redo)以处理节点失效。
PG 单机 pgrac 集群
------------------ --------------------------
单版本 buffer → XCUR/SCUR + CR + PI 三类
Lock Manager 本地 → GES (enqueue) + PCM (buffer)
xmin/xmax + CLOG → + SCN (Lamport)
单 WAL stream → per-instance + merged recovery
startup 单进程 → reconfiguration + LMS workers
pgrac 的跨节点协议不是独立的——它们通过共同的元数据基础设施(GRD)和共享的时序基础(SCN)相互配合:
跨节点子系统按职责划分:
本章使用的核心术语:
后续章节将深入每个协议的概念、操作流程、配置与监控。每章末尾会指向对应的 curated 深度页(详细机制 + 性能预算)和原始设计文档。