PG隆中对,一个PG三个核,一个好汉三百个帮
几个月前,我写了一篇《PostgreSQL正在吞噬数据库世界》,阐述了扩展对于 PG 生态的重要性,引发了 PostgreSQL 社区对 Extension 讨论的巨大热情。在六月温哥华举办的 PGCon.Dev 上,更是有一整个关于扩展的峰会专场,PG Hacker 们聚集在一起探讨 PG 生态的未来。
在七月中旬杭州举办的PG中文技术大会上,我进行了一个题为《数据库世界的未来:PostgreSQL,扩展,与服务》的主题分享,进一步讨论了这个主题 —— 我认为, PostgreSQL + 扩展,已经几乎没给其他数据库内核留下多少活路了,真正的竞争将发生在PG生态内部,扩展,服务与发行版。
“PostgreSQL 将成为数据库世界的 Linux 内核”,已经成为了许多开发者的共识。但真正重要的不是仅仅 “认识数据库世界”,而是如何 “改变数据库世界”。在这一点上,我确实有一些思考与想法。经过三个月的打磨,Pigsty 终于决定发布其历史上第三个大版本 —— 势必要在 PostgreSQL 征服数据库世界这件事上推波助澜,添砖加瓦。
一个PG三个核
关系型数据库有四大天王:PostgreSQL,MySQL,SQL Server,Oracle。这四个数据库在 DB-Engine 上的热度与其他数据库拉开了数量级差距。最多再加上 MongoDB,就凑成了数据库市场上的主力玩家。
BTW,热度只适合作为纵向对比参考,根据 StackOverflow 2024 调研,PostgreSQL 已经连续三年成为专业开发者使用率最高的数据库了。
然而这五个数据库中,另外四个都完全暴露在 PostgreSQL 的威胁与挑战之中。例如:AWS 开源的 Babelfish 提供了对 MSSQL 线缆协议/SQL 级别的兼容性支持,允许 PG 扮演一个 SQL Server,而应用客户端什么都不改。
PG 上的 Oracle 兼容性,有 EnterpriseDB,瀚高的开源 IvorySQL,以及阿里过国测的 PolarDB O(一个 PolarPG 的分支)在做。PG 上的 MySQL 兼容性,国外有 NextGres,国内有Halo等数据库在做。MongoDB 的兼容性,则有 FerretDB 与 PongoDB,分别在中间件线缆协议与客户端驱动库侧,实现了基于 PG 的 MongoDB。
其他主要数据库上的存量应用也正在加速搬迁至 PostgreSQL 生态,从而孵化出了这种独一无二的奇观 —— 让一个 PostgreSQL ,仿真其他各种各样的数据库。但如何进一步推动这一趋势,让这种力量形成合力,是一个棘手的问题。这些数据库内核公司交付的东西,往往只是一个/几个PG内核 RPM 包,距离一个生产实用的完整数据库服务(RDS)仍然有相当远的距离。好在 PG 生态已经有足够优雅完美的解决方案了 —— Pigsty。
在 Pigsty v3 中,我们完美集成了 Babelfish,IvorySQL 与 PolarPG 三个开源的 PostgreSQL Fork ,允许您在使用本地优先 RDS 服务时,切换不同的 PG 内核。获得开箱即用的 SQL Server 兼容性, Oracle 兼容性,MongoDB 兼容性。与此同时,我们还会在商业版中进一步提供其他“PG系国产数据库”内核的植入能力。
一个好汉三百个帮
虽然提供其他数据库的兼容性有助于搬迁存量用户,但我必须说:这只是过渡时期的临时任务。数据库世界与 PostgreSQL 的未来重心依然会聚焦在开发者功能特性上。而实现这一点的正道绝不是分叉内核,而是通过功能扩展(Extension)的形式。
PostgreSQL 与其他数据库不同之处在于,它有着所有 DMBS 中首屈一指的可扩展性,无论是机制上的支持程度还是生态中的实际插件数量,都让其他所有竞争者难望其项背。因此,除非像上面那种要在 Protocol / SQL 语法机制上适配其他数据库的场景需要对内核进行轻微修改,其他绝大多数功能需求都可以在 PG 生态中通过插件的形式解决 —— 这一点对生态构建提供了极大的便利性。
根据 PGXN 的记录,PG 生态有 375 款登记在案的扩展插件。实际上根据这个列表,PG 生态的扩展已经有 1000+ 了。然而,如何将这么多的功能扩展整合到一起,交付给用户,成为了一个巨大的挑战,即使是 AWS 这样的云厂商,在这一点上依然力有不逮。PGXN 提供了一个从中心仓库下载源码现场编译的解决方案 —— 但这并不是总是能成功,也并没有覆盖所有的扩展。
在数据库世界,直接使用源码编译安装是 Hacker 们的习惯。但绝大多数的用户都不会在生产数据库服务器上安装编译工具链去 Build from Scratch,而是使用“官方仓库”预先针对不同操作系统打好的二进制软件包。
然而当我们审视 PGDG 官方提供的 Yum 与 Apt 仓库时,它们却只分别提供了 135 个与 109 个插件,而且,EL系统生态与Debian生态没有对齐 —— EL系有51 个扩展RPM没有对应的 Deb,Deb系有 25 个扩展Deb 没有对应的 RPM,两者只有 84 个共有扩展。
这确实带来了一个巨大的烦恼,我并不是批评 Devrim 的 YUM 仓库和 Christoph Berg 的 APT ,实际上他们做了非常杰出的工作,但我认为在这里可以有不少改善用户体验的空间。
于是,在 Pigsty v3 中,我们建设了一个 PG 扩展补充仓库:将EL系统与Debian生态的独有PG扩展插件相互移植,维护了 64 个扩展 RPM包[1] 与 77 个 DEB包[2]。并最终提供了史无前例的 280 个开箱即用的 总可用扩展[3]
并且,Pigsty 还实现了两大 Linux 发行版阵营的 PG扩展生态大对齐。现在 280 个扩展,在 EL / Deb 同时可用的扩展数量达到了 253 个,绝大多数扩展都在两大阵营中同时可用了!(所以现在 Ubuntu/Debian 也能自建 Supabase 了!)
与此同时,我还着手建设了一个扩展元数据库,将 PG 生态的扩展信息收录其中,进行分类,打标,归档,建立信息页,让用户在选用扩展时能更为方便省心。
那么,让我们上手试一试吧?
总之,Pigsty v3 是我寄予厚望的一个版本。在3个辅助内核与近 300 款扩展插件的加持下,PostgreSQL 生态的力量得到了一次史无前例的整合,我相信它势必将在吞噬世界的过程中扮演重要的角色。
Pigsty v3 已经发布了第一个试用版本。欢迎大家上手体验并提出宝贵意见。
curl -fsSL https://repo.pigsty.cc/get | bash -s v3.0.0-a1
不要忘记数据库祖师爷石破天老爷子的论断:“永远不要低估开箱即用的影响!” 所以,没错,Pigsty 安装依然还是新服务器上一行命令的事,就是这么简单。
以下是 v3.0.0-a1 发布注记
亮点特性
大对齐:
Pigsty将EL系统与Debian生态的独有PG扩展插件相互移植,维护了 64 个扩展 RPM包[4] 与 77 个 DEB包[5]。并最终提供了史无前例的 280 个开箱即用的 总可用扩展[6] ,实现了两大 Linux 发行版阵营的 PG扩展生态大对齐。
换内核:
Pigsty v3 允许您更换 PostgreSQL 内核,目前支持了 SQL Server 兼容的 Babelfish (线缆协议级仿真),Oracle 兼容的 IvorySQL,以及 PG 版的 RAC PolarDB;此外,现在自托管 Supabase 也在 Debian 系统中可用。您可以让 Pigsty 中带有 HA,IaC,PITR,监控的生产级 PostgreSQL 集群仿真 MSSQL (via WiltonDB),Oracle via (IvorySQL),Oracle RAC (via PolarDB), MongoDB(via FerretDB),以及 Firebase (via Supabase)。
企业版:
我们现在提供 Pigsty Pro 专业版[7],在开源版的功能基础上提供增值服务。专业版提供额外的功能模块:MSSQL,Oracle,Mongo,K8S,Victoria,Kafka,……,并提供更广泛的 PG 大版本、操作系统、芯片架构的支持。提供针对全系操作系统精准小版本定制的离线安装包,以及 EL7,Debian 11,Ubuntu 20.04 等过保老系统的支持;此外,专业版还提供内核可插拔定制服务,并对PolarDB PG 的原生部署、监控管控支持以满足“国产化”需要。
重大变更
本次 Pigsty 发布调整大版本号,从 2.x 升级到 3.0,带有一些重大变更:
首要支持操作系统调整为:EL 8 / EL 9 / Debian 12 / Ubuntu 22.04。EL7 / Debian 11 / Ubuntu 20.04 等系统进入弃用阶段,不再提供支持。有在这些系统上运行需求的用户请考虑我们的 订阅服务[8]
默认使用在线安装,不再提供离线软件包,从而解决操作系统小版本兼容性问题。bootstrap
过程现在不再询问是否下载离线安装包,但如果 /tmp/pkg.tgz
存在,仍然会自动使用离线安装包。有离线安装需求请自行制作离线软件包或考虑我们的 订阅服务[9]
Pigsty 使用的上游软件仓库进行统一调整,地址变更,并对所有软件包进行 GPG 签名与校验,标准仓库: https://repo.pigsty.io/{apt/yum}
,国内镜像: https://repo.pigsty.cc/{apt/yum}
。
API 参数变更与配置模板变更,EL 系与 Debian 系配置模板现在收拢统一,有差异的参数统一放置于 roles/node_id/vars/
[10] 目录进行管理。配置目录变更,所有配置文件模板统一放置在 conf
目录下,并分为 default
, dbms
, demo
, build
四大类。
其他新特性
•PG OLAP 分析能力史诗级加强:DuckDB 1.0.0,DuckDB FDW,以及 PG Lakehouse,Hydra 移植至 Deb 系统中。•PG 向量检索与全文检索能力加强:Vectorscale 提供 DiskANN 向量索引,Hunspell 分词字典支持,pg_search 0.8.6。•帮助 ParadeDB 解决了软件包构建问题,现在我们在 Debian/Ubuntu 上也能提供这一扩展。•Supabase 所需的扩展在 Debian/Ubuntu 上全部可用,Supabase 现在可在全OS上自托管。•提供了场景化预置扩展堆栈的能力,如果您不知道安装哪些扩展,我们准备了针对特定应用场景的扩展推荐包(Stack)。•针对所有 PostgreSQL 生态的扩展,制作了元数据表格、文档、索引、名称映射,针对 EL与Deb 进行对齐,确保扩展可用性。•为了解决 DockerHub 被 Ban 的问题,我们加强了 proxy_env
参数的功能并简化其配置方式。•建设了一个专用的新软件仓库,提供了 12-17 版本的全部扩展插件,其中,PG16的扩展仓库会在 Pigsty 默认的版本中实装。•现有软件仓库升级改造,使用标准的签名与校验机制,确保软件包的完整性与安全性。APT 仓库采用新的标准布局通过 reprepro
构建。•提供了 1,2,3,4,43 节点的沙箱环境:meta
, dual
, trio
, full
, prod
,以及针对 7 大 OS Distro 的快捷配置模板。
API变更
•新参数选项: pg_mode
现在支持的模式有 pgsql
, citus
, gpsql
, mssql
, ivory
, polar
,用于指定 PostgreSQL 集群的模式
•pgsql
:标准 PostgreSQL 高可用集群•citus
:Citus 水平分布式 PostgreSQL 原生高可用集群•gpsql
:用于 Greenplum 与 GP 兼容数据库的监控(专业版)•mssql
:安装 WiltonDB / Babelfish,提供 Microsoft SQL Server 兼容性模式的标准 PostgreSQL 高可用集群,线缆协议级支持,扩展不可用•ivory
:安装 IvorySQL 提供的 Oracle 兼容性 PostgreSQL 高可用集群,Oracle语法/数据类型/函数/存储过程兼容,扩展不可用 (专业版)•polar
:安装 PolarDB for PostgreSQL (PG RAC)开源版本,提供国产化数据库能力支持,扩展不可用。(专业版)
•新参数: pg_parameters
,用于在实例级别指定 postgresql.auto.conf
中的参数,覆盖集群配置,实现不同实例成员的个性化配置。•新参数: repo_extra_packages
,用于额外指定需要下载的软件包,与 repo_packages
共同使用,便于指定OS版本独有的扩展列表。•参数重命名: patroni_citus_db
重命名为 pg_primary_db
,用于指定集群中的主要数据库(在 Citus 模式中使用)•参数强化:proxy_env
中的代理服务器配置会写入 Docker Daemon,解决科学上网问题,configure -x
选项会自动在配置中写入当前环境中的代理服务器配置。•参数强化:repo_url_packages
中的 repo.pigsty.io
会在区域为中国时自动替换为 repo.pigsty.cc
,解决科学上网问题,此外,现在可以指定下载后的文件名称。•参数强化:pg_databases.extensions
中的 extension
字段现在可以支持字典与扩展名字符串两种模式,字典模式提供 version
支持,允许安装特定版本的扩展。•参数强化:repo_upstream
参数如果没有显式覆盖定义,将从 rpm.yml
[11] 或 deb.yml
[12] 中定义的 repo_upstream_default
提取对应系统的默认值。•参数强化:repo_packages
参数如果没有显式覆盖定义,将从 rpm.yml
[13] 或 deb.yml
[14] 中定义的 repo_packages_default
提取对应系统的默认值。•参数强化:infra_packages
参数如果没有显式覆盖定义,将从 rpm.yml
[15] 或 deb.yml
[16] 中定义的 infra_packages_default
提取对应系统的默认值。•参数强化:node_default_packages
参数如果没有显式覆盖定义,将从 rpm.yml
[17] 或 deb.yml
[18] 中定义的 node_packages_default
提取对应系统的默认值。•参数强化:pg_packages
与 pg_extensions
中的扩展现在都会从 rpm.yml
[19] 或 deb.yml
[20] 中定义的 pg_package_map
执行一次查找与翻译。•参数强化:node_packages
与 pg_extensions
参数中指定的软件包在安装时会升级至最新版本, node_packages
中现在默认值变为 [openssh-server
],帮助修复 OpenSSH CVE[21]•参数强化:pg_dbsu_uid
会自动根据操作系统类型调整为 26
(EL)或 543
(Debian),避免了手工调整。•Boostrap 逻辑变化,不再下载离线软件包,添加 -k|--keep
参数,用于指定在本地安装 ansible 时是否保留现有的软件源。•Configure 移除了 -m|--mode
参数,使用 -m|--conf
参数指定配置文件,使用 -x|--proxy
参数指定代理服务器配置,不再尝试修复 ssh 本机问题。
版本升级
截止至发布时刻,Pigsty 主要组件的版本升级如下:
•PostgreSQL 16.3, 15.7, 14.12, 13.15, and 12.19•pg_exporter: 0.7.0•Patroni: 3.3.2•pgBouncer: 1.23•pgBackRest: 2.53•vip-manager: 2.6.0•Haproxy: 3.0.2•FerretDB: 1.23•sealos: 5.0.0•duckdb: v1.0.0•etcd: 3.5.15•Grafana: 11.1.3•Loki: 3.1.0 (因为不兼容更新,Promtail 保持 3.0.0 版本)•Prometheus: 2.53.1•pushgateway: 1.9.0•node_exporter: 1.8.2•nginx: exporter 1.2.0•victoriametrics: 1.102.0•victorialogs: 0.28.0•redis_exporter: 1.62.0•vector: 0.39.0
Pigsty 重新编译了所有 PostgreSQL 扩展插件,PostgreSQL 扩展插件的最新版本,请参考 扩展列表[22]
新应用
Pigsty 现在提供开箱即用的 Dify 与 Odoo Docker Compose 模板:
•Dify[23]:AI智能体工作流编排与 LLMOps•Odoo[24]:企业级开源 ERP 系统
问题修复
•通过 node_packages
中的默认值 [openssh-server
],CVE-2024-6387[25] 可以在 Pigsty 安装过程中被自动修复。•修复了 Loki 解析 Nginx 日志标签基数过大导致的内存消耗问题。•修复了 EL8 系统中上游 Ansible 依赖变化导致的 bootstrap 失效问题(python3.11-jmespath 升级至 python3.12-jmespath)
References
[1]
RPM包: /zh/docs/pgext/list/rpm/[2]
DEB包: /zh/docs/pgext/list/deb/[3]
总可用扩展: /zh/docs/pgext/list/[4]
RPM包: /zh/docs/pgext/list/rpm/[5]
DEB包: /zh/docs/pgext/list/deb/[6]
总可用扩展: /zh/docs/pgext/list/[7]
专业版: /zh/docs/about/service[8]
订阅服务: https://pigsty.io/zh/docs/about/service[9]
订阅服务: https://pigsty.io/zh/docs/about/service[10]
roles/node_id/vars/
: https://github.com/Vonng/pigsty/tree/master/roles/node_id/vars[11]
rpm.yml
: https://github.com/Vonng/pigsty/blob/master/roles/node_id/vars/rpm.yml[12]
deb.yml
: https://github.com/Vonng/pigsty/blob/master/roles/node_id/vars/rpm.yml[21]
OpenSSH CVE: https://pigsty.io/zh/blog/db/cve-2024-6387/[22]
扩展列表: /zh/docs/pgext/list/[23]
Dify: /zh/docs/software/dify[24]
Odoo: /zh/docs/software/odoo[25]
CVE-2024-6387: https://pigsty.io/zh/blog/db/cve-2024-6387/
发布注记
Pigsty v2.6:PostgreSQL 踢馆 OLAP
Pigsty v2.5 发布:Ubuntu/Debian支持与监控改版/新扩展
临水照花看Ubuntu与Debian:Pigsty v2.5
Pigsty v2.3.1:HNSW版PGVECTOR来了!
Pigsty v2.1 发布:向量扩展 / PG12-16 支持
Pigsty v2.0.2 更好的开源RDS替代:Pigsty
Pigsty v1正式发布:开箱即用的PostgreSQL开源发行版
数据库老司机
对 PostgreSQL 与 Pigsty 感兴趣的朋友
欢迎微信搜索 pigsty-cc加入 PGSQL 交流群
StackOverflow 2024调研:PostgreSQL已经超神了
PostgreSQL 17 Beta1 发布!牙膏管挤爆了!
PostgreSQL is eating the database world