跳转到主要内容

1 - pg_mooncake 0.3.0 发布:PGSTY 首版发布,全面适配 DuckDB 2.0、pgrx 0.19.3 与 PostgreSQL 14–18

pg_mooncake 0.3.0(偕同 duckdb_mooncake v0.0.2 与 moonlink v0.0.1)是 PGSTY 维护的首个正式版本,带来 DuckDB 2.0 / pg_duckdb 1.2.0 适配、跨 PostgreSQL 14–18 的 pgrx 0.19.3 支持、列存表 LSN 一致性快照读取以及完整的 RustSec 依赖安全加固。

pg_mooncake 0.3.0(随同 duckdb_mooncake v0.0.2 与 moonlink v0.0.1 同步发布)是由 PGSTY 维护的 Mooncake 实时分析套件的首个正式版本:

面向 PostgreSQL 14、15、16、17、18,覆盖 RHEL / Rocky / AlmaLinux 8、9、10 与 Debian 12/13、Ubuntu 22.04/24.04(x86_64 与 aarch64)的 RPM 与 DEB 二进制软件包现已通过 PGEXT 软件源与 Pigsty 正式提供。


pg_mooncake 0.3.0 核心亮点

1. 升级至 pgrx 0.19.3,全面支持 PostgreSQL 14–18

pg_mooncake 已完成向 pgrx = 0.19.3(cargo-pgrx 0.19.3)的迁移,在支持 PostgreSQL 14、15、16、17 的基础上正式引入对 PostgreSQL 18 的原生支持:

  • 更新 pg_mooncake.control 中的扩展元数据(default_version = '0.3.0'),并新增升级脚本 sql/pg_mooncake--0.2.0--0.3.0.sql。
  • 将所有 GUC 参数定义(mooncake.timeline_id、mooncake.enable_local_bucket、mooncake.default_bucket、mooncake.enable_memory_metadata)全面迁移至 Rust 原生 CStr 字面量(c"...")。

2. 适配 DuckDB 2.0.0 与 pg_duckdb 1.2.0

pg_mooncake 0.3.0 内嵌 pg_duckdb v1.2.0 与 duckdb_mooncake v0.0.2,基于 DuckDB v2.0.0(d54cbbe3df17e8e5ce68312f483b4155836112aa)构建:

  • 将 duckdb_mooncake 完整迁移至 DuckDB 2.0 的 TableCatalogEntry、StorageExtensionInfo 与 TableFilterSet 迭代器接口。
  • 修复了 MooncakeScanFunction 中针对 IS NULL 与 IS NOT NULL 谓词下推的列索引重映射缺陷,消除了多列混合过滤条件下推至 Moonlink Parquet 扫描时的段错误(SIGSEGV)。
  • 在后台工作进程初始化阶段新增 pg_duckdb 运行时版本校验,强制要求 pg_duckdb = 1.2.0(支持 1.2.0 或 1.2.0-* 预发布后缀;当检测到 1.1.3 或 1.3.0 等不匹配版本时立即快速失败并给出明确提示)。

3. 列存表 LSN 一致性快照读取(pg_current_wal_flush_lsn)

在旧版本中,duckdb_mooncake 以 lsn = 0 构造 Moonlink 表扫描描述符,导致查询不会等待刚刚提交的 PostgreSQL 事务被后台逻辑复制工作进程消费完毕。

在 v0.3.0 中,pg_mooncake 导出了 C 符号 mooncake_get_postgres_lsn()(在常规后端会话中调用 pg_current_wal_flush_lsn(),在恢复模式下返回 0),由 duckdb_mooncake 通过 dlsym(RTLD_DEFAULT, "mooncake_get_postgres_lsn") 动态解析。现在,对 columnstore 表的每一次分析查询都会自动等待 Moonlink 同步至当前 PostgreSQL WAL 刷盘 LSN 后再执行扫描。

4. 分区表层级自动支持(REPLICA IDENTITY FULL)

在对 PostgreSQL 分区表调用 mooncake.create_table(dst, src) 时,pg_mooncake 0.3.0 会自动遍历继承树(find_all_inheritors),在将主表加入逻辑复制发布之前,自动为父表及所有叶子分区表设置 REPLICA IDENTITY FULL。

5. 对已弃用的 mooncake.load_files 显式返回 0A000 错误

旧版 v0.1 遗留的辅助函数 mooncake.load_files(dst TEXT, files TEXT[]) 现在会显式抛出标准 PostgreSQL 错误码 ERRCODE_FEATURE_NOT_SUPPORTED(0A000)并给出清晰的迁移提示,而不再触发未捕获的 Rust todo!() 崩溃。

6. Cargo 依赖安全审计与加固(RustSec)

全部三个 Cargo 工作区(pg_mooncake、moonlink、duckdb_mooncake/moonlink_ffi)均对照 RustSec 漏洞数据库(2026-11-05)完成了系统性安全升级:

  • pg_mooncake/Cargo.lock:已知漏洞从 33 个降至 6 个(-82%),unsound 警告清零(1 -> 0)。
  • moonlink/Cargo.lock:已知漏洞从 46 个降至 15 个(-67%),unsound 警告清零(1 -> 0)。
  • duckdb_mooncake/moonlink_ffi/Cargo.lock:0 个漏洞、0 个 unsound、0 条警告。
  • 升级了 tonic 0.14.5、prost 0.14.3、bincode 2.1.0、opentelemetry 0.31.0、wasmtime 43.0.1、rustls 0.23.37、aws-lc-rs 1.16.3、bytes 1.11.1、tar 0.4.45 与 lz4_flex 0.11.6。完整审计详情请参阅 SBOM 与安全审计。

验证总结

pg_mooncake 0.3.0 已在 Ubuntu 24.04.5 LTS ARM64(PostgreSQL 18.6) 与 Rocky Linux 10.2 ARM64(PostgreSQL 17.11) 双平台上完成端到端实机验证:

  • 58/58 项 Moonlink table_handler 单元测试全部通过。
  • 3/3 组 pg_Regression SQL 回归测试集(small、partition、unsupported)全部通过(0 失败)。
  • 运行时版本门禁实测验证:准确拦截 pg_duckdb 1.1.3 与 1.3.0,放行 1.2.0。
  • 11/11 项实时逻辑复制、UPDATE/DELETE、分区表同步、Iceberg 元数据访问及数据库快速重启持久化检查点全部通过。

2 - pg_mooncake v0.2 架构前瞻:开箱即用的实时列存与逻辑复制

让开箱即用的 Postgres 实时分析成为现实:基于逻辑复制的堆表到列存表同步、高频小批量写入缓冲与 Apache Iceberg 集成。

在 v0.1 中,我们证明了 PostgreSQL 完全能够提供顶级的分析性能。通过将 DuckDB 向量化执行引擎与列存表相结合,pg_mooncake 成为了 Postgres 生态中唯一同时集成这两大能力的扩展。

实测成绩说明了一切:pg_mooncake 闯入了 ClickBench 全球前十,并打造出了最快的基于 Parquet 的执行引擎。

现在,在 v0.2 中,我们正在攻克下一个核心挑战——我们称之为**“开箱即用的分析(Out-of-the-Box Analytics)”**。

为什么要在 Postgres 内部直接做分析?

绝大多数应用在真正拥有第一套数据仓库或专用分析系统之前,早就已经产生了迫切的分析查询需求。

我们见过无数次相同的故事:团队不得不推迟产品路线图、搭建通往外部系统的数据同步管道、招聘专职数据工程师维护 ETL——同时还要在应用层把 Postgres 里的实时业务数据与外部系统里的分析数据手工拼凑在一起。

pg_mooncake 彻底消除了这种复杂性。借助列存表,开发者可以在同一个 Postgres 数据库中同时处理事务型(OLTP)与分析型(OLAP)负载——没有外部系统,没有脆弱的 ETL 管道,只有纯粹的 Postgres。

在 v0.2 中,我们重点围绕以下几个核心方向展开架构演进:

1. 完善的 Postgres 表访问方法(TAM)与兼容性 (#80)

在 v0.1 中,所有针对列存表的读写都直接穿透到 DuckDB 执行,虽然带来了极高的扫描性能,但也导致部分 Postgres 原生特性(如数据修改 CTE、触发器等)受限。在 v0.2 中,我们将源表的写入完全交回给 Postgres 原生堆表,由 DuckDB 专注于高速列存扫描与计算下推。

2. 基于逻辑复制(Logical Replication)的列存镜像同步 (#90)

许多用户都是在现有 Postgres 业务表遇到慢查询瓶颈后开始引入 pg_mooncake 的。通过引入逻辑复制架构(参见 mooncake.create_table),用户无需修改任何业务端写入代码,只需一条命令即可将现有 Postgres 堆表(或远程 RDS / Cloud SQL / Neon / Supabase 表)的数据实时同步至列存镜像表中。

3. 面向高频小写入的内存/行存写缓冲 (#89)

逻辑复制带来了一个核心工程挑战:如何在高频小事务写入下,避免每个事务都生成一个零碎的 Parquet 小文件和元数据日志?

在 v0.2(基于 Moonlink 引擎)中,高频小批量写入会首先进入内存中的 Arrow 写缓冲区(Write Buffer),达到阈值后再由后台异步刷盘生成紧凑的 Parquet 文件。当查询列存表时,duckdb_mooncake 会自动合并读取内存缓冲区与底层 Parquet 文件(Union Read)。这一机制将 Parquet 文件写入与 OLTP 事务彻底解耦,大幅消除了写放大。

这一突破使得列存表无需业务层手工攒批(Batching)即可直接对接高并发 OLTP 负载,非常适合实时 HTAP、日志分析与时序数据场景。

这为我们带来了什么?

pg_mooncake 是获取 Postgres 原生极速分析最简单的方式。随着 v0.2(以及 PGSTY 维护的 v0.3.0 版本)的落地,三大核心场景得到了全面增强:

  1. 面向用户的实时分析(User-Facing Analytics) —— 完整的 ORM 支持、与普通 Postgres 表直接 JOIN、只需运维一套数据库;
  2. 日志、对话历史与时序数据 —— 针对高频追加写入深度优化,兼具 Parquet 高压缩率与低存储成本;
  3. 开箱即用的开放数据湖仓 —— 将 Postgres 变身为实时生成 Apache Iceberg 快照的引擎,并配合具备文件跳过与行组裁剪能力的极速 Parquet 执行引擎。

3 - PostgreSQL 中最简单的极速分析方式:pg_mooncake v0.1 正式发布

pg_mooncake 结束 Beta 测试正式发布 v0.1,为 PostgreSQL 带来原生列存表与 DuckDB 向量化执行。

我们在创业第 60 天向世界首次宣布了 pg_mooncake。

今天(第 131 天),pg_mooncake 正式结束 Beta 阶段,发布 v0.1.0。

pg_mooncake 的核心竞争力在于极致易用性与强悍性能。在 v0.1 中,我们在这两个方向上全力加码。

在 Postgres 中运行极速分析最简单的方式

凭借 Postgres 原生列存表,pg_mooncake 将开发者最熟悉的表语义带入分析场景。列存表不仅支持事务性的 INSERT、SELECT、UPDATE、DELETE 和 COPY,还能直接与普通 Postgres 堆表执行关联查询(JOIN)。

在 v0.1 中,我们让向列存表导入数据变得更加简单:

  1. 直接读取 Parquet、CSV 与 JSON 文件:
SELECT * FROM mooncake.read_parquet('<file_path>');
  1. 直接从 Hugging Face 数据集导入:
COPY reddit_comments FROM 'hf://datasets/fddemarco/pushshift-reddit-comments/data/RC_2012-01.parquet';
  1. 直接查询外部现有的 Iceberg 与 Delta Lake 表:
SELECT * FROM mooncake.iceberg_scan('s3://bucket/table');

时序与分析负载性能大幅跃升

pg_mooncake 是唯一同时为 Postgres 提供列式存储与向量化执行的扩展。

在 v0.1 中,我们引入了文件级统计信息与数据块跳过(File Skipping / Segment Elimination),让用户无需传统分片即可轻松承载大规模时序与分析负载。

我们的 ClickBench 官方基准测试成绩将于下周揭晓(剧透:闯入全球前十 🙂)。事实证明,PostgreSQL 完全可以成为一流水准的实时分析数据库。

展望 v0.2

接下来我们将重点聚焦在开发者体验(DevEx)与实时同步能力上,规划中的改进包括:

  1. 增强对高频小批量写入、更新与删除的支持
  2. 将行存堆表(Rowstore)实时同步至列存表(Columnstore)
  3. 索引支持(二级索引与排序键)
  4. 时序分析函数

致谢社区

独行快,众行远。衷心感谢我们的社区用户、代码贡献者以及 Neon、Supabase 等 Postgres 生态伙伴的鼎力支持。

我们最珍视的指标,就是 pg_mooncake 开源贡献者人数的持续增长。pg_mooncake 的势头已经势不可挡,Postgres 原生分析时代已然到来 🥮