重磅进展 | Apache Cloudberry 内核升至 PostgreSQL 16:跨越两大版本,5730+ commit 落地
Apache Cloudberry™ (Incubating) 是 Apache 软件基金会孵化项目,由 Greenplum 和 PostgreSQL 衍生而来,作为领先的开源 MPP 数据库,可用于建设企业级数据仓库,并适用于大规模分析和 AI/ML 工作负载。
GitHub: https://github.com/apache/cloudberry
经过近一年的持续推进,Apache Cloudberry 主分支的 PostgreSQL 内核已从 14.4 升级至 16.9,跨越 PG 15 与 PG 16 两个大版本,合入上游约 5730 个 commit。这是 Cloudberry 项目自从基于 Greenplum Database 衍生、独立演进以来的第二次跨版本内核大升级,(第一次是由 Greenplum Database 7.0 搭载的 PostgreSQL 12.x 升级到 14.4),也是 Cloudberry 自加入 Apache 孵化器以来首次由众多社区开发者参与、联合推动的大规模内核版本升级事件,标志着 Cloudberry 在“紧跟 PostgreSQL 上游、引领 MPP 数据库演进”这条路线上又迈出了一大步。
为什么持续推动 PostgreSQL 内核升级
PostgreSQL 数据库内核是 Cloudberry 的根基,跟随上游版本节奏既是工程层面的必要选择,也是生态层面的责任。
- PG 14.x 即将停止维护。 按照 PostgreSQL 社区的版本生命周期,PG 14 计划于 2026 年 11 月进入终止支持(EOL)阶段。提前完成主版本升级,可以避免 Cloudberry 用户在不久的将来面临“跟不上安全补丁”的被动局面。
- 保持上游同步,是 Cloudberry 的长期承诺。 紧跟 PostgreSQL 主线,意味着新特性、新优化器能力、新生态工具能够更自然地引入 Cloudberry,也让 Cloudberry 在“以 PostgreSQL 为基础的开源 MPP 数据库”这一领域更有竞争力。
众多周知,已停止开源演进的遗留 Greenplum Database 的数据库内核更早已脱离上游维护。Greenplum 6 / 7 分别基于 PostgreSQL 9.x / 12.x,这两个版本上游早已停止维护,原先的优势越来越成为技术债务。Cloudberry 选择持续向新版本演进,让大家可以基于一个仍在被官方持续更新的现代 PostgreSQL 内核基础之上,持续构建 MPP 数据库。
升级能力提升看点
PG 15 与 PG 16 两个版本累积了大量改进,下面挑出对 Cloudberry 用户影响较大的几个方向,简要介绍。
1. SQL 标准能力增强:MERGE、SQL/JSON
- MERGE 命令:引入 PostgreSQL 上游的 SQL 标准
MERGE能力,可以在一条语句里完成INSERT / UPDATE / DELETE。 的组合操作。配套修复了分区表、跨分区触发器、行级安全(RLS)、EvalPlanQual、自修改元组以及pg_stat_statements等场景下的相关问题。 - SQL/JSON 扩展:新增
IS JSON谓词,标准 JSON 构造函数json_array、json_object、json_scalar、json_serialize等;同时通过gen_node_support.pl自动生成查询 jumble,相关稳定性问题也一并解决。
2. 逻辑复制能力增强
- 支持两阶段提交(2PC)的逻辑复制,并可通过复制协议直接启用。
- 并行 apply worker(PG 16)、行/列级过滤、Schema 级 publication(PG 15),让逻辑复制的吞吐和灵活度都明显提升。
- 新增预定义角色
pg_create_subscription,权限模型更精细。 - 修复了多个关键问题,包括逻辑复制中的潜在数据丢失、复制槽失效、快照、内存泄漏等。
3. WAL 与存储子系统
- WAL 全页写支持 LZ4 压缩,可降低高写入场景下的 WAL 体积。
- 自定义 WAL 资源管理器(custom WAL resource managers),扩展模块可登记自己的 WAL 类型。
- macOS 上支持 Direct I/O,归档恢复阶段跳过 WAL 回收/预分配。
- Buffer manager 基础设施重构,关系扩展(relation extension)更快;新增
smgrzeroextend()、FileZero()、FileFallocate()等接口。 - WAL 与 Recovery 代码拆分(
xlogrecovery.c、xlogprefetcher.c),备份链路引入新的 backup sink 架构(PG 15)。 - 移除了存在正确性隐患的 HeapBitmapScan
skip_fetch优化。
4. 优化器与执行器
性能侧:
NOT IN (values)走哈希表加速。- 单列排序使用 Datum sort,减少开销。
- Result Cache 更名为 Memoize,并持续打磨。
- 支持 Parallel Hash Full Join。
- 深层嵌套视图的规划成本下降,分区边界构建过程减少 palloc。
- PG 16 引入外连接优化增强、对称哈希连接优化等。
正确性侧(关键修复):
- 多个可哈希
ScalarArrayOpExpr识别问题。 - 解析与规划阶段 whole-row Var 构造一致性。
- WindowAgg 求值崩溃问题。
WITH RECURSIVE UNION断言失败问题。- 带
FILTER的ORDER BY/DISTINCT聚合问题。 setrefs.c在 prune 步骤中遗漏表达式处理。- Parallel Hash Join 极端倾斜检测问题。
5. 监控与统计:pgstat 重写、新增 pg_stat_io
- pgstat 共享内存重写(PG 15):移除独立的 stats collector 进程,统计信息改为基于共享内存;原本的单文件
pgstat.c拆分为utils/activity/下 14 个文件,结构更清晰。 - 新增
pg_stat_io视图(PG 16):提供详细 I/O 统计,包括共享缓冲区命中、I/O 耗时、writeback 等维度。 pg_stat_statements增强:新增 JIT 计数、临时文件块 I/O 计时、工具语句字符串归一化、MERGE支持,并修复了 32 位整数溢出问题。- 其他还包括 SP-GiST 索引扫描计入 pgstat、
pg_stat_reset_single_table_counters增强、新增测试辅助函数pg_stat_force_next_flush()、pg_stat_have_stats()等。
6. libpq 与客户端协议
- 新增
PQsendFlushRequest,修复 pipeline 模式状态机问题。 - SASL 代码重构为通用接口。
- 修复在非法编码数据下的 escape 函数行为(含安全相关修复)。
PQescapeLiteral()/PQescapeIdentifier()长度处理修复。- 编译期检查 libpq 不再调用
exit()/abort()。
7. 安全与权限模型
CREATEROLE权限收紧:避免传统行为下被滥用,是一次重要的安全模型改进。- 新增 GUC:
createrole_self_grant、reserved_connections。 - 新增预定义角色:
pg_maintain、pg_create_subscription。 - 非超级用户即可执行 vacuum / analyze 的预定义角色。
- 撤销 public schema 的
PUBLIC CREATE权限,并将其归属调整为pg_database_owner。 - 引入 Security Invoker 视图(
SECURITY INVOKER)。 session_authorization与角色交互、scram_SaltedPassword()整数溢出等修复。
8. 备份恢复与升级工具链
pg_dump:通用压缩 API,支持 zstd、LZ4 frame-only 格式。pg_basebackup:扩展压缩选项,支持服务端压缩(含-Fp)、客户端 LZ4 解压、并行 zstd 压缩。pg_upgrade:修复非预期的'NULL'字面量、跨版本升级中的XMLSERIALIZE(NO INDENT)等问题;pg_dumpall修复pg_auth_members中悬挂 OID 的处理。
9. 分区表改进
- 分区表支持自引用外键。
- 修复 detach 分区时顶层外键的处理问题。
- ATTACH 时
relhassubclass复位、触发器重命名一致性、克隆时保留触发器启用状态。 - 排除 collation 不匹配场景下的 partitionwise join / grouping,避免错误结果。
10. ICU 与本地化
- 默认构建 ICU 支持。
initdb默认使用uloc_getDefault()。CREATE DATABASE LOCALE对所有 collation provider 生效。
11. SQL 类型与函数
numeric允许 scale 为负数或大于 precision。- 新增
ANY_VALUE聚合函数。 unnest(multirange)、range_agg支持 multirange。pg_size_pretty/pg_size_bytes支持 PB 级。ALTER TABLE SET ACCESS METHOD,方便表存储引擎切换。- 新增
SYSTEM_USER函数;修复numeric_mul()溢出问题。
12. psql 与运维体验
\watch支持PSQL_WATCH_PAGER。- 新增
\drg查看角色授权。 \copy from改为更大块发送数据。pg_waldump --rmgr支持多次指定。
13. 关键稳定性与数据正确性修复
- 关系截断失败时的潜在数据损坏。
- 在非
LP_NORMALTID 上更新时直接报错,避免页头被破坏。 - 不安全的
BufferDescriptors访问。 - GB18030 越界读导致的 SIGSEGV。
- Snowball stemmer 在 OOM 后的空指针解引用。
- 主库重启时备库的偶发断言失败。
- 列表条目构造期间的 catcache 失效问题。
14. VACUUM / Autovacuum
- 并行 VACUUM(PG 16,新增
vacuumparallel.c)。 ON COMMIT DELETE ROWS在relhassubclass=f之后避免报错。- VACUUM 末尾截断阶段使用
WaitLatch()取代pg_usleep()。 - 修复并行数值聚合中的数值溢出。
ANALYZE对分区表保留relhasindex。
15. 大规模结构性调整
RelFileNode→RelFileLocator:上百个文件中的全局重命名。- GUC 系统拆分:
guc.c→guc.c+guc_tables.c+guc_funcs.c。 varatt.h从postgres.h中拆出。- 测试框架由
PostgresNode.pm演进为PostgreSQL::Test::Cluster。 - 通过
gen_node_support.pl自动生成copyfuncs/equalfuncs/outfuncs/readfuncs与查询 jumbling 代码,并加入 NodeTag ABI 稳定性检查。
整体回顾与后续计划
总体来看,本次内核升级,给 Apache Cloudberry 用户带来:
- 更现代的 PostgreSQL 基础。Cloudberry 用户可以直接享受 PG 15 / PG 16 两个版本累积的能力,包括 MERGE、SQL/JSON、逻辑复制 2PC、Memoize、Parallel Hash Full Join、
pg_stat_io等。 - 更好的可观测性与运维体验。pgstat 共享内存化、新增 I/O 视图、
pg_stat_statements增强,给运维和性能分析提供了更丰富的工具。 - 更稳的安全模型。
CREATEROLE收紧、新预定义角色、Security Invoker 视图等,使权限治理更贴近现代生产实践。 - 更顺畅的生态对接。紧跟上游版本,意味着 Cloudberry 与 PG 周边的扩展、工具、客户端能够更平滑地对齐,避免成为技术孤儿。
这次合入主分支是 Apache Cloudberry 升级 PostgreSQL 16 内核的重要里程碑,但还不是终点。接下来社区会重点推进几项工作:
- 稳定性验证与问题收敛:围绕回归测试、MPP 场景、扩展兼容性、运维工具链和用户反馈继续修复问题,推动新内核在更多真实场景下稳定运行。
- 跟进 PostgreSQL 16 后续小版本:在完成 REL_16_9 合入后,社区会继续评估并吸收 PostgreSQL 16 最新小版本中的安全修复和关键 bugfix,保持主干内核持续更新。
- 深化 MPP 能力融合:持续打磨优化器、执行器、存储、统计信息、备份恢复等模块与 PostgreSQL 16 新内核之间的结合,让上游能力更好地服务于分布式场景。
- 沉淀升级方法论:总结本次跨两个 PostgreSQL 大版本升级中的工程经验,形成可复用的流程、测试策略和辅助工具,为后续内核升级打基础。
在 PG16 升级收尾并稳定后,社区也会评估面向 PostgreSQL 18 的下一轮内核升级工作。我们希望在继续跟进 PostgreSQL 上游演进的同时,探索更系统地使用 AI 辅助工具,提高大规模内核升级的效率、质量和可验证性。也期待各位社区成员和爱好者一起参与针对这一里程碑的后续建设中来,你可以通过 https://github.com/orgs/apache/projects/497 查看后续任务和计划。
加入我们
Apache Cloudberry 欢迎各位兴趣爱好者、开发者、用户加入:
- 访问网站:https://cloudberry.apache.org
- 关注 GitHub:https://github.com/apache/cloudberry
- 加入 Slack 空间:https://apache-cloudberry.slack.com
- 订阅 Dev 邮件列表:查看订阅方式及过往邮件归档 - https://cloudberry.apache.org/community/mailing-lists
- 加入 Discord 服务器:https://discord.gg/GJrz3Fxf6y
更多推荐



所有评论(0)