这是本节的多页打印视图。 .
版本发布说明
- 1: pg_mooncake 0.3.0 发布:PGSTY 首版发布,全面适配 DuckDB 2.0、pgrx 0.19.3 与 PostgreSQL 14–18
- 2: pg_mooncake v0.2 架构前瞻:开箱即用的实时列存与逻辑复制
- 3: PostgreSQL 中最简单的极速分析方式:pg_mooncake v0.1 正式发布
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 维护的 Mooncake 实时分析套件的首个正式版本:
pgsty/pg_mooncake v0.3.0(MIT许可证)pgsty/duckdb_mooncake v0.0.2(MIT许可证)pgsty/moonlink v0.0.1(附带PG_MOONCAKE LINKING & DISTRIBUTION EXCEPTION的BSL-1.1许可证,客户端 crate 为MIT)
面向 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_RegressionSQL 回归测试集(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 架构前瞻:开箱即用的实时列存与逻辑复制
在 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 版本)的落地,三大核心场景得到了全面增强:
- 面向用户的实时分析(User-Facing Analytics) —— 完整的 ORM 支持、与普通 Postgres 表直接 JOIN、只需运维一套数据库;
- 日志、对话历史与时序数据 —— 针对高频追加写入深度优化,兼具 Parquet 高压缩率与低存储成本;
- 开箱即用的开放数据湖仓 —— 将 Postgres 变身为实时生成 Apache Iceberg 快照的引擎,并配合具备文件跳过与行组裁剪能力的极速 Parquet 执行引擎。
3 - PostgreSQL 中最简单的极速分析方式:pg_mooncake v0.1 正式发布
我们在创业第 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 中,我们让向列存表导入数据变得更加简单:
- 直接读取 Parquet、CSV 与 JSON 文件:
- 直接从 Hugging Face 数据集导入:
- 直接查询外部现有的 Iceberg 与 Delta Lake 表:
时序与分析负载性能大幅跃升
pg_mooncake 是唯一同时为 Postgres 提供列式存储与向量化执行的扩展。
在 v0.1 中,我们引入了文件级统计信息与数据块跳过(File Skipping / Segment Elimination),让用户无需传统分片即可轻松承载大规模时序与分析负载。
我们的 ClickBench 官方基准测试成绩将于下周揭晓(剧透:闯入全球前十 🙂)。事实证明,PostgreSQL 完全可以成为一流水准的实时分析数据库。
展望 v0.2
接下来我们将重点聚焦在开发者体验(DevEx)与实时同步能力上,规划中的改进包括:
- 增强对高频小批量写入、更新与删除的支持
- 将行存堆表(Rowstore)实时同步至列存表(Columnstore)
- 索引支持(二级索引与排序键)
- 时序分析函数
致谢社区
独行快,众行远。衷心感谢我们的社区用户、代码贡献者以及 Neon、Supabase 等 Postgres 生态伙伴的鼎力支持。
我们最珍视的指标,就是 pg_mooncake 开源贡献者人数的持续增长。pg_mooncake 的势头已经势不可挡,Postgres 原生分析时代已然到来 🥮