跳转到主要内容

v0.1 与 v0.2 / v0.3 架构演进对比

全面对比 pg_mooncake v0.1(USING columnstore + Delta Lake)、v0.2(USING mooncake + Moonlink + Iceberg)与 PGSTY v0.3.0 正式版。

pg_mooncake 的技术架构经历了三个关键演进阶段:

  1. v0.1(早期 Delta Lake 架构):引入直接通过 CREATE TABLE ... USING columnstore 创建的列存表,底层基于 Delta Lake 与早期 pg_duckdb 实现读写。
  2. v0.2(Moonlink 与 Apache Iceberg 架构重设计):废弃对列存表的直接写入,改用由 moonlink 逻辑复制驱动的**实时列存镜像(Columnstore Mirror)**架构(CALL mooncake.create_table(dst, src) + USING mooncake),引入内存 Arrow 写缓冲、Roaring 删除向量与 Apache Iceberg v2 元数据。
  3. v0.3.0(PGSTY 社区维护正式版):将 pg_mooncake 升级至 pgrx 0.19.3(全面支持 PostgreSQL 14–18),将 duckdb_mooncake v0.0.2 移植适配至 pg_duckdb 1.2.0 与 DuckDB v2.0.0,修复了 Moonlink(v0.0.1)在无关表推进 WAL 时的快照挂起问题与分区表复制标识设置,并修复了 20 余项 RustSec 依赖安全漏洞。
寻找 v0.1 历史版本文档?

早期 v0.1 版本(USING columnstore、mooncake.create_secret、mooncake.columnstore_tables、mooncake.read_parquet)的完整文档已归档保留在 v0.1 历史文档 (Delta Lake) 中。

核心架构对比表

特性维度 v0.1(早期版本) v0.2(Moonlink 重构版) v0.3.0(当前 PGSTY 正式版)
列存表创建方式 CREATE TABLE t (...) USING columnstore; CALL mooncake.create_table(dst, src); CALL mooncake.create_table(dst, src, src_uri, table_config);
表访问方法 (TAM) USING columnstore USING mooncake(只读镜像表) USING mooncake(只读镜像表)
写入路径设计 直接向列存表执行 DML(每笔事务生成 1 个 Parquet 文件) 写入标准 Postgres 行存表,通过 moonlink 逻辑复制实时同步 写入普通堆表或分区表,通过 moonlink v0.0.1 逻辑复制实时同步
高频小写入与更新处理 高频小事务下产生大量小文件,更新需重写文件 亚秒级内存 Arrow 写缓冲 + Roaring Bitmap 删除向量 亚秒级 Arrow 写缓冲 + 删除向量 + 非阻塞 LSN 快照屏障
开放湖仓格式 Delta Lake(mooncake.columnstore_tables) Apache Iceberg v2(mooncake.list_tables()) Apache Iceberg v2(mooncake.list_tables())
DuckDB 执行引擎 DuckDB 1.1 / pg_duckdb 0.2 DuckDB 1.3 / pg_duckdb DuckDB v2.0.0 / pg_duckdb 1.2.0(duckdb_mooncake v0.0.2)
PostgreSQL 版本支持 PostgreSQL 14–17(pgrx 0.12) PostgreSQL 14–17(pgrx 0.16.1) PostgreSQL 14–18(pgrx 0.19.3)
分区源表支持 不支持 支持(需手动为子分区设置复制标识) 创建镜像时自动为所有现有叶子分区设置 REPLICA IDENTITY FULL

为什么 v0.2 / v0.3 放弃了 v0.1 的直接写入模型?

v0.1 直接写入模型的局限性

在 v0.1 中,直接向 USING columnstore 表写入数据虽然在大批量导入(单事务 100,000–1,000,000 行)时表现良好,但在真实的在线 PostgreSQL 业务负载中存在明显瓶颈:

  • 不支持索引与约束:无法在 USING columnstore 表上创建主键、唯一约束、外键或 B-Tree 索引。
  • 小文件写放大:每一笔 INSERT 或 UPDATE 事务都会生成一个新的 Parquet 文件,在高频 OLTP 流量下会导致文件碎片激增、查询性能快速下降。
  • DuckDB 写入路径耦合:在 PostgreSQL 事务执行器内部通过 DuckDB 执行写入,带来了较高的内存开销与事务状态管理复杂度。

v0.2 与 v0.3.0 如何解决这些问题

通过将 OLTP 写入路径(标准 PostgreSQL 行存表)与分析存储计算路径(moonlink + pg_duckdb 1.2.0 + duckdb_mooncake v0.0.2)彻底解耦:

  1. 对在线 OLTP 业务零侵入:源业务表完整保留 PostgreSQL 的全部能力——主键、外键、B-Tree/GIN/vchord 索引、触发器与行级并发锁。
  2. 高吞吐增量变更摄取:moonlink 利用内存 Arrow 写缓冲与 Roaring 删除向量高效吸收高频 INSERT、UPDATE、DELETE 变更流,并在后台异步刷写与合并优化后的 Parquet 文件。
  3. 自动同步表结构变更:在源行存表上执行 ALTER TABLE ... ADD COLUMN 与 DROP COLUMN 会自动同步至列存镜像表。
  4. 支持远程实例复制(src_uri):你甚至可以在专门的分析型 PostgreSQL 实例上部署 pg_mooncake,通过 src_uri => 'postgresql://...' 实时镜像远程生产数据库(包括 AWS RDS、Aurora、Supabase 或 Neon)中的业务表。

表格阅读