展望 PostgreSQL 的2024
本文是 PostgreSQL 核心组成员 Jonathan Katz 对 2024 年 PostgreSQL 项目的未来展望,并回顾过去几年 PostgreSQL 所取得的进展。
作者:Jonathan Kats,Amazon RDS 首席产品经理兼技术主管, PostgreSQL 全球开发组核心成员与主要贡献者。博客:https://jkatz05.com/。
译者:冯若航 / Vonng。磐吉云数创始人 / CEO,PostgreSQL 专家与布道师,开源 RDS PG —— Pigsty 作者。博客:https://vonng.com
点击“查看原文”查看英文原文:https://jkatz05.com/post/postgres/postgresql-2024/
在我经常听到的问题中,有一个尤为深刻:“PostgreSQL 将走向何方?” —— 这也是我经常问自己的一个问题。这个问题不仅仅局限在数据库内核引擎的技术层面,而关乎整个社区的方方面面 —— 包括相关的开源项目、活动和社区发展。PostgreSQL 已经广受欢迎,并且已经是第四次被 DB Engine评为“年度数据库”。尽管已取得显著成功,我们依然需要不时地后退一步,从更宏观的角度思考 PostgreSQL 的未来。虽然这种思考不会立即带来显著的变化,但它对于社区正在进行的工作提供了重要的背景板。
新年是思考 “PostgreSQL的未来” 这一问题的绝佳时机,我对2024年的PostgreSQL发展方向也有一些思考,这里是我的一些想法:这并不是一个路线图,而是我个人对 PostgreSQL 发展方向的一些想法。
PostgreSQL功能开发
在PGCon 2023 开发者会议上,我提出了一个题为“PostgreSQL 用户面临的重大挑战是什么?”的话题。这个话题旨在探讨用户的常见需求和数据库工作负载的发展趋势,以此来判断我们是否正在朝着正确的方向发展 PostgreSQL。通过多次交谈和观察,我提出了三个主要的特性类目:
- 可用性
- 性能
- 面向开发者的特性
这些特性组将成为 2024 年,甚至更长时间段里的工作重点。接下来,我将对每个特性类目进行更深入的探讨。
可用性
对于PostgreSQL现有用户和潜在用户来说,提高可用性是最迫切的需求。这个需求不仅仅是排在第一位,而且毫不夸张地讲,也同时能排在第二位和第三位。虽然重启 PostgreSQL 通常可以迅速完成,但在某些极端情况下,这个过程可能耗时过长。此外,长时间的写入阻塞,例如某些锁操作,也可被视作一种“停机时间”。
大部分 PostgreSQL 用户对现有的可用性水平已感满意,但有些工作负载对可用性的要求极为严格。为了更好地满足这些要求,我们需要进行额外的开发工作。这篇文章或这一小节就聚焦于这一点:通过改进使 PostgreSQL 适用于更多有严苛可用性需求的环境。
逻辑复制是如何助益于双主,蓝绿部署,零停机升级,以及其他工作流的
对于现有的 PostgreSQL 用户,以及那些计划迁移至 PostgreSQL 的用户来说,提升可用性是最重要的需求。这通常指的是高可用——即在计划内的更新或计划外的中断期间,数据库能够持续进行读写操作的能力。PostgreSQL 已经提供了许多支持高可用的特性,如流复制。然而为了实现最高水平的可用性,通常还需要借助额外的服务或诸如 Patroni 这样的工具。
我聊过许多用户,在绝大多数情况下,他们对 PostgreSQL 提供的可用性是满意的。但我也发现了一个新趋势:现在有一些负载对可用性的要求越来越高,15-30 秒的离线窗口已不够了。这包括计划内的中断(如小版本升级、大版本升级),以及计划外的中断。一些用户表示,他们的系统最多只能承受1秒的不可用时间。起初我对这种要求持怀疑态度,但了解到这些工作负载的具体用途后,我认为1秒确实是一个合理的需求。
在持续提高 PostgreSQL 可用性方面,逻辑复制 是一个关键特性。逻辑复制能够实时将 PostgreSQL 数据库中的变更流式传输到任何支持 PostgreSQL 逻辑复制协议的系统中。PostgreSQL 中的逻辑复制已经存在了一段时间,而最近的版本在可用性方面带来了显著的改进,包括功能和性能上的新特性。
逻辑复制在 PostgreSQL 的大版本升级过程中扮演着关键角色,与传统的物理(或二进制)复制相比,它的一大优势在于能够实现跨版本的数据流转。举例来说,通过逻辑复制,我们可以轻松地将 PostgreSQL 15 的数据变更实时传输至 PostgreSQL 16,从而大幅缩减升级过程中的停机时间。这种方法已在 Instacart 的零停机大版本升级中得到成功应用。然而,PostgreSQL 在支持此类用例和其他高可用性场景方面仍有待提升。未来的发展预计将进一步优化支持蓝绿部署的功能,以实现更加无缝的数据迁移和应用升级。
除了在大版本升级中的用例,逻辑复制本身也是构建高可用系统的重要手段。"多主复制“就是其中的一个典型应用,它允许多个数据库实例同时接受写入操作,并在它们之间同步数据变更。这种模式尤其适用于对停机时间敏感的系统(例如:不接受1秒以上的不可用时间),其设计目标是在任何写入数据库出现问题时,应用能迅速切换到另一可用的写入数据库,而不必等待它被提升为新主库。构建与管理这样的双活系统是极度复杂的:它会影响到应用设计,并需要用户提供对写入冲突进行管理的策略,而且为了确保数据完整性(比如:冲突风暴),需要有仔细设计的容错监控系统 —— (比如,一个实例如果几个小时都无法复制它的变更会发生什么?)
大版本升级和双活复制案例为我们指明了改善 PostgreSQL 逻辑复制的方向。Amit Kapila 是众多逻辑复制功能开发的领导者。今年,他和我共同在一场会议上发表了题为“PostgreSQL 中的多主复制之旅”的演讲(并提供了视频版本),深入探讨了为何针对这些用例的解决方案至关重要、PostgreSQL 在逻辑复制方面取得的成就,以及为更好支持这些场景所需做的工作。好消息是从 PostgreSQL 16 版本起,我们已经有了大部分基础模块来支持双活复制、蓝绿部署和零停机大版本升级。虽然这些功能可能没有全部集成在内核中,但某些扩展(比如我参与开发的pgactive
)已提供了这些能力。
在 2024 年,有多项努力旨在帮助缩小这些功能差距。对于 PostgreSQL 17 来说(惯例免责声明:这些特性可能不会发布),有一个重点是确保逻辑复制能够与关键工作流(如pg_upgrade
和高可用系统)协同工作,支持更多类型的数据变更(如序列/Sequence)的复制,扩展对更多命令(如 DDL)的支持,提高性能,以及增加简化逻辑复制管理的特性(如节点同步/再同步)。
这些努力能让 PostgreSQL 适用于更多种类的负载,特别是那些有着极致严苛可用性要求的场景,并简化用户在生产环境中滚动发布新变更的方式。尽管改进逻辑复制功能的道路仍然漫长,但 2024 年无疑将为 PostgreSQL 带来更多强大的功能特性,帮助用户在关键环境中更加高效地运行 PostgreSQL。
减少锁定
另一个有关可用性的领域是模式维护操作(即DDL语句)。例如,ALTER TABLE
的大部分形式会对表施加 ACCESS EXCLUSIVE
锁,从而阻止对该表的所有并发访问。对于许多用户来说这等同于不可用,即使这只是数据的一个子集。PostgreSQL 缺乏对非阻塞/在线模式维护操作的完整支持,随着其他关系数据库也开始支持这些功能,这方面的不足开始逐渐凸显。
目前虽有多种工具和扩展支持非阻塞模式更新,但如果 PostgreSQL 能原生支持更广泛的非阻塞模式变更,那肯定更方便,而且性能也会更好。从设计上来看,我们已有了开发此功能的基础,但还需要一些时间来实现。尽管我不确定是否有正在进行中的具体实现,但我相信在2024年我们应该在这方面取得更多进展:让用户能够在不阻塞写入的情况下执行大部分(或全部)DDL 命令
性能
性能是一个不断持续演进的特性 —— 我们总是会追求更快的速度。好消息是,PostgreSQL 在垂直扩展能力上享有盛誉 —— 当你为单个实例提供更多硬件资源时,PostgreSQL 也能扩展自如。虽然在某些场景下,水平扩展读写操作是有意义的。但我们还是要确保 PostgreSQL 能够随着计算和内存资源的增加而持续扩展。
举个更具体的例子:考虑到 AWS EC2 实例中有着高达 448 vCPU / 24TB 内存 的选配项 —— PostgreSQL 能否在单个实例上充分利用这些资源呢?我们可以根据 PostgreSQL 用户现在与未来可能使用的硬件配置,设定一个性能提升的目标,并持续提升 PostgreSQL 的整体表现。
在 2024 年,已经有多项工作致力于继续垂直扩展 PostgreSQL。其中最大的努力之一,也是一个持续多年的项目,就是在 PostgreSQL 中支持 DirectIO(DIO)与 Asynchronous IO(AIO)。至于细节我就留给 Andres Freund 在PGConf.EU上关于在 PostgreSQL 中添加 AIO 的现状的PPT来讲了。看起来在 2024 年,我们将离完全支持 AIO 更进一步。
另一项让我感兴趣的工作是并行恢复。有着大量写入负载的 PostgreSQL 用户往往会推迟 Checkpoint 以减少 I/O 负载。对于忙碌的系统而言,如果 PostgreSQL 在执行 Checkpoint 的相当一段时间后才崩溃,那么当 PostgreSQL 重新启动时,它会进入 “崩溃恢复 “状态:它会重新执行自上次 Checkpoint 以来的所有变更,以便达到一致的状态 —— 在崩溃恢复期间,PostgreSQL 不能读也不能写,这意味着它不可用。这对繁忙的核心系统来说是个问题:虽然 PostgreSQL 可以接受并发写入,但它重放变更时只能使用单个进程。如果一个繁忙系统崩溃于上个检查点后的一小时,那么系统会需要离线追赶几个小时,才能达到一致的状态点重新上线!
克服这一局限性的方法之一是支持”并行恢复",或者说能够并行重放WAL变更。在PGCon 2023上,Koichi Suzuki做了一个 关于PostgreSQL如何支持并行恢复 的详细介绍。这不仅适用于崩溃恢复,也适用于任何 PostgreSQL WAL 重放操作(例如:PITR 时间点恢复)。虽然这是一个极具挑战性的问题,但支持并行恢复有助于 PostgreSQL 继续垂直扩展,因为用户可以进一步针对重度写入负载进行优化,也能缓解 “从故障中恢复上线所需的延时超出承受范围” 的风险。
这并不是一份关于性能特性的详细清单。在 PostgreSQL 服务器性能上还有很多工作要做,包括索引优化、改进锁机制、充分利用硬件加速等。此外,客户端(如驱动程序和连接池)上的工作也能为应用与 PostgreSQL 的交互带来额外的性能提升。展望 2024 年,看看社区正在进行的工作,我相信 PostgreSQL 在各个领域上的性能都会有整体性提升。
开发者特性
我认为 “开发者特性 “(developer features)是一个相当宽泛的类目,核心在于如何让用户围绕 PostgreSQL 来架构 & 构建应用。这里包括:SQL语法、函数、存储过程语言支持,以及帮助用户从其他数据库系统迁移到 PostgreSQL 的功能。一个具体的创新例子是在 PostgreSQL 14 中引入的 multirange
数据类型,它允许用户将一些不连续的 范围(Range) 聚合在一起,这个特性非常实用,我个人在实现一个调度功能时,用它将数百行PL/pgSQL代码减少到三行。开发者特性也关乎 PostgreSQL 如何支持新出现的工作负载:例如JSON 或向量。
值得一提的是,许多开发者特性创新主要出现在**扩展(Extension)**上,而这正是 PostgreSQL 可扩展模型的优势所在。然而就数据库服务器本身而言,PostgreSQL 在某些开发者特性上的发布速度相比过去有所落后。例如,尽管PostgreSQL是第一个将JSON作为可查询数据类型的关系数据库,但它在实现 SQL/JSON 标准锁定义的语法与特性上已经开始变得迟缓。PostreSQL 16 发布了 SQL/JSON 中的一些语法特性,2024 年也会有更多的努力用在实现 SQL/JSON 标准上。
话既然说到这儿了,我们应当着力于 PostgreSQL 中那些无法通过扩展插件实现的开发者特性,比如 SQL标准特性。我的建议是集中精力关注那些其他数据库已经具备的功能,比如进一步实现 SQL/JSON 标准(例如: JSON_TABLE
)、系统层面的版本化表(对于审计、闪回,与在特定时间点进行的时态查询非常有用),以及对模块的支持(对于“打包”存储过程来说尤其重要)。
此外,考虑到之前讨论的可用性和性能问题,我们应继续努力简化用户从其他数据库迁移到 PostgreSQL 的过程。在我的日常工作中,我有机会了解了大量与数据库迁移相关的内容:从商业数据库到 PostgreSQL 的迁移策略。当我们增强 PostgreSQL 功能的同时,也有许多机会可以简化迁移流程。包括引入其他数据库中现有的功能(例如全局临时表、全局分区索引、自治事务),并在 PL/pgSQL 中增加更多功能与性能优化(如批量数据处理函数、模式变量、缓存函数元数据)。所有这些都将改善 PostgreSQL 开发者的体验,并让其他关系数据库的用户更容易采纳 PostgreSQL。
最后我们需要了解,如何才能持续不断地支持来自 AI/ML 数据的新兴负载,特别是向量存储与检索。在2023年的PGCon会议上,尽管人们希望在 PostgreSQL 本身中看到原生的向量支持,但大家一致认为,在 pgvector这样的扩展中实现这类功能可以抢占先机,更快地支持这些工作负载(这一策略似乎已经奏效,在向量数据上性能表现优异)。有鉴于向量负载的诸多特征,我们可以在PostgreSQL中添加一些额外的支持,以便进一步支持它们:其中包括对处理 活动查询路径中的TOAST数据的规划器进行优化,并探索如何更好地支持带有大量过滤条件和 ORDER BY
子句的查询。
我确信在 2024 年,PostgreSQL 可以在这些领域取得显著进步。我们看到在 PostgreSQL 的扩展生态中,有大量的新能力正在涌现;但即便如此,我们还是可以继续直接为 PostgreSQL 添加新特性,让它更易于构建应用。
安全性如何?
我想快速过一下 PostgreSQL 的安全特性。众所周知在安全敏感型场景中,PostgreSQL 有着极佳的声誉。但总会有许多能改进的地方。在过去几年中,PostgreSQL社区对引入透明数据加密(TDE)的原生支持表现出许多兴趣与关注。然而还有许多其他地方可以搞搞创新,比如支持其他的身份验证方式/机制(主要需求是OIDC),或是探索联邦授权模式的可能性,使PostgreSQL能够继承其他系统的权限设置。尽管这些特性在当下都颇有挑战,我建议先在 “Per-Database” 层面上支持 TDE。这里我不想过多展开,因为已经有在 PostgreSQL 中满足这些特性需求的方法了,但我们还是应该不懈努力,争取实现完整的原生支持。
让我们再来看看PostgreSQL能在2024年里发力的其他方向。
扩展
PostgreSQL 的设计是高度可扩展的。您可以为PostgreSQL添加新功能,而无需分叉项目。包括新的数据类型、索引方法、与其他数据库系统协同工作的方法、更易于管理PostgreSQL特性的实用工具、额外的编程语言支持,甚至编写自己的扩展插件。人们已经围绕一些特定的 PostgreSQL 扩展(如PostGIS)建立了开源社区和公司;PostgreSQL 单一数据库便能支持不同类型的工作负载(地理空间、时间序列、数据分析、人工智能),正是扩展让这件事变得可能。数千个可用的PostgreSQL扩展成为了PostgreSQL的 “力量倍增器” —— 它一方面让用户能够快速的为数据库新增功能,另一方面也极大推动了 PostgreSQL 的普及与采用。
然而这也产生了一个副作用,即“扩展蔓延”现象。用户如何去选择合适的扩展?扩展的支持程度如何?如何判断某个扩展是否有持续积极的维护?如何为扩展做出自己的贡献?甚至“在哪里可以下载扩展”也成为了一个大问题。postgresql.org 提供了一个不完整的扩展列表,社区也维护了一些扩展包,也有其他几个可供选择的 PostgreSQL 扩展仓库(例如 PGXN、dbdev、Trunk)和 pgxman 可供选择。
PostgreSQL社区的一个优势是去中心化,广泛散布于世界各处。但我们可以做得更好,帮助用户在复杂的数据管理中做出明智的选择。我认为2024年是一个机遇,我们可以投入更多资源来整合与展示 PostgreSQL 扩展,帮助用户理解什么时候可以使用哪些扩展,并了解扩展们的开发成熟度,并同样为扩展开发者提供更好的管理支持与维护资源。
社区建设
在谈论2024年社区建设的构想时,我深感自加入 PostgreSQL 贡献者社区以来,我们已取得显著进步。社区在认可各类贡献者方面表现突出(尽管仍有提升空间)—— 不仅限于代码贡献,还包括项目的各个方面。展望未来,我想着重强调三个关键领域:导师制、多元化、公平与包容(DEI)以及透明度,这些都对项目的全方位发展至关重要。
在PGCon 2023开发者会议上,Melanie Plageman 就新贡献者的体验和挑战进行了深入分析。她提到了诸多挑战,如初学者需要花费大量时间来掌握基本知识,包括使用代码库和邮件列表进行交流,以及将补丁提交到可审查状态所需的努力。她还指出,提供建设性指导意见(从审查补丁开始)可能比编写代码本身更具挑战性,同时也讨论了如何有效地提供反馈。
关于提供反馈,我想引用罗伯特-哈斯(Robert Haas)的一篇优秀博文,其中他特别强调了在批评时同时给予表扬的重要性——这种方法可以产生显著的效果,并提醒我们即使在批评时也应保持支持态度。
回到 Melanie 的观点,我们应该在整个社区更好地实施导师计划。就我个人而言,我认为我在宣传项目方面做得不够好,包括帮助更多人为网络基础设施和发布流程 做出贡献。这并不是说 PostgreSQL 缺乏优秀的导师,而是我们可以在帮助人们开始贡献和找到导师方面做得更好。
2024年将是建立更完善导师制度的起点。我们希望在5月于温哥华举行的 PGConf.dev 2024 上试验一些新想法。
在 PGConf.dev 出现前,从2007年到2023年,PGCon一直是PostgreSQL贡献者们集结并讨论即将开始的开发周期和关键项目的重要活动。PGCon 一直由 Dan Langille 负责组织。经过多年的辛勤工作,他决定将组织职责扩展至一个团队,并协助成立了 PGConf.dev。
PGConf.dev 是专为那些希望为 PostgreSQL 做贡献的人士举办的会议。会议内容覆盖了 PostgreSQL 的开发工作(包括内核及所有相关的开源项目,如扩展和驱动程序)、社区建设以及开源意见领袖等主题。PGConf.dev 的一大特色是导师制,并计划举办关于如何为 PostgreSQL 贡献的研讨会。如果你正寻找为 PostgreSQL 贡献的机会,我强烈建议你考虑参加本活动或提交演讲提案!
接下来是 PostgreSQL 社区如何在多元化、公平与包容性(DEI)上进步的话题。我强烈建议观看凯伦·杰克斯和莱蒂西亚·阿夫罗特在 2023 年 PGConf.eu 上的演讲: 在肯的 Mojo Dojo Casa House 里尝试成为芭比:因为这是一场关于如何继续让 PostgreSQL 社区变得更加包容的深刻演讲。社区在这方面取得了进步(凯伦和莱蒂西亚指出了有助于此的一些举措),但我们还能做得更好,我们应该积极主动地处理反馈,以确保为 PostgreSQL 做出贡献是一种受欢迎的体验。我们所有人都可以采取行动,例如,在发生(诸如性别歧视的)不当行为时及时指出,并指出行为不当的原因。
最后是透明度问题。在开源领域这可能听起来有些奇怪,毕竟它本身就是开放的。但有不少治理问题并不会在公开场合讨论,了解决策制定的流程会很有帮助。PostgreSQL 行为守则委员会 提供了一个优秀的例子:一个社区如何就需要敏感处理的问题保持透明度。该委员会每年都会发布一份报告(这是 2022 年的报告),包括案例的总体描述和整体统计数据。我们可以在许多 PostgreSQL 团队中复制这种做法 —— 这些团队参与的任务可能由于其敏感性需要保密。
结论:本来这篇文章应该更短
最初,我以为这篇文章会是一篇简短的帖子,几小时内就能完成。但几天后,我意识到情况并非如此……
老实说,PostgreSQL目前处于一个非常好的状态。它依然备受欢迎,其可靠性、鲁棒性和性能的声誉稳如磐石。然而我们仍可以做得更好,令人感到振奋的是,社区正在积极地在各个方向上努力改善。
虽然上面这些是 PostgreSQL 在 2024 年及以后可以做的事情,但 PostgreSQL 走到今天已经做成了很多很多的事。提出 “PostgreSQL何去何从” 这样的问题,实际上为我们提供了一个机会:回顾过去几年 PostgreSQL 所取得的进展,并展望未来!