Postgres 用 Rust 重写了……竟然通过了所有测试

BBetter Stack
컴퓨터/소프트웨어창업/스타트업AI/미래기술

스크립트

00:00:00有人用 Rust 重写了 Postgres,而且令人惊讶的是,发布的版本现在可以通过所有 46,000 个 Postgres 回归测试查询。
00:00:08它能与常规 PSQL 配合使用,甚至可以启动现有的 Postgres 18.3 数据目录。
00:00:14这听起来像是生产就绪的替代品,但事实并非如此。
00:00:17但该项目最令人兴奋的版本甚至尚未发布。
00:00:21那么我们看到的到底是什么?这是 Postgres 的未来,还是仅仅是一个人工智能实验?
00:00:30现在,要理解为什么这很重要,你需要了解原本的问题所在。
00:00:36必须承认,Postgres 是有史以来最优秀的数据库之一。
00:00:40但它也承载了近四十年的架构历史和大约一百万行 C 语言代码。
00:00:46每个客户端连接都会获得其自己的后端进程。
00:00:49这种隔离很有用,但也意味着更多的内存开销,更多的使用连接池的压力,
00:00:56以及在并行工作中共享状态的难度更大。
00:01:00PGRust 采取了不同的路径。
00:01:02保持 Postgres 的行为,保持客户端体验,保持磁盘格式,但用 Rust 替换底层的引擎。
00:01:09这不是一个 Postgres 扩展。
00:01:11它也不是在其上添加的某种功能。
00:01:13这是一个完全独立的实现,试图表现得就像 Postgres 一样。
00:01:18我们现在看到了很多用 Rust 重写的项目,就像我们前几天提到的 Bun 用 Rust 重写了整个代码库一样。
00:01:25我会把它放在这里。
00:01:27现在,这一切听起来不错,但它感觉真的是 Postgres 吗?
00:01:31至少测试并不充分。
00:01:32如果你喜欢能加速工作流程的编程工具,请务必订阅。
00:01:36我们会一直发布新视频。
00:01:38现在,我将从官方 Docker 镜像开始,然后用一个完全正常的 PSQL 客户端连接。
00:01:43没有任何定制内容。
00:01:44好了,我进来了。
00:01:46首先,检查一下版本。
00:01:48如你所见,它报告自己是带有最新版本的 PGRust。
00:01:53现在,我可以创建一个表,插入一些数据,并查看查询计划。
00:01:59我直接在我的终端里运行这个。
00:02:01从外部看,这与 Postgres 完全无法区分。
00:02:05相同的客户端,相同的 SQL,相同的输出。
00:02:08你甚至可以看到查询规划器选择了索引扫描,并给我们提供了真实的执行统计信息。
00:02:14现在,为了让它更有趣一点,让我们插入 100,000 行数据并运行另一个查询。
00:02:20这只是随机生成的 10 万行数据。
00:02:23我们要把它放进去。
00:02:25那么,做这一切的意义是什么呢?
00:02:27问得好。
00:02:28好吧,在这个早期的版本发布中,我们不会看到比常规 Postgres 显著的速度提升。
00:02:35更大的性能预期来自于一个尚未发布的开发版本,该版本切换到了每个连接一个线程的模型。
00:02:43这一切确实证明了,这不仅仅是一个部分实现。
00:02:47它通过了完整的官方 Postgres 回归测试套件,超过 46,000 个查询。
00:02:53它使用真实的线路协议,并拥有一个有效的查询规划和存储引擎。
00:02:59这是一个真实的数据库服务器。
00:03:01只是它是用 Rust 编写的。
00:03:03所以,随着进展,我们在速度方面可能会看到一些重大的性能提升。
00:03:08现在问题是,为什么不直接创建另一个 Postgres 扩展呢?
00:03:12因为扩展程序是建立在原始 Postgres 核心之上的。
00:03:16分叉版本可以改变核心,但随后它会继承相同的架构,以及与上游 Postgres 保持同步的持久性工作。
00:03:25你拥有像 CockroachDB 和 YugaByte 这样的数据库,但它们是独立的分布式数据库。
00:03:31完全的即插即用兼容性并不是它们的主要目标。
00:03:35PG Rust 正在尝试别的东西。
00:03:37它以实际的 Postgres 行为作为规范。
00:03:41当前版本以 Postgres 18.3 为目标。
00:03:44它通过了默认的回归套件和隔离测试,并且兼容性足以从现有的 Postgres 18.3 数据目录启动。
00:03:53这里更大的实验发生在另一个未发布的版本中,据报道,该版本将 Postgres 每个连接一个进程的模型替换为每个连接一个线程的模型。
00:04:05在正常的 Postgres 模型中,每个连接获得其自己的进程。
00:04:09使用新模型时,每个连接都在同一个进程内获得一个线程。
00:04:14这可以降低每个连接的开销,并使数据库的不同部分更容易地实际共享信息。
00:04:21但随之而来的,肯定会有权衡,对吧?
00:04:24单独的进程也在连接之间创建了有用的隔离墙。
00:04:28如果一个进程失败,这种分离有助于遏制损害。
00:04:32使用线程时,一个不安全的扩展或内存错误可能会影响更多的服务器。
00:04:38所以,每个连接一个线程并非自动更优。
00:04:41它只是打开了新的大门,但也可能移除了一些安全护栏。
00:04:45接下来是故事的第二个主要部分:人工智能。
00:04:49Michael Malice 和 Jason Siebel 大量使用编码代理来加速重写过程。
00:04:54发布版本在许多地方特意遵循了原始 Postgres 结构。
00:04:59未发布版本才是他们尝试进行更大架构更改的地方。
00:05:03所以,真正的实验不仅仅是:Rust 能让 Postgres 变快吗?
00:05:08更像是:人工智能能否使如此大规模的重写变得负担得起,以至于开发者真的可以重新思考底层的架构?
00:05:16因为人工智能在这里被大量使用。
00:05:19现在,这改变了事情吗?
00:05:20嗯,可能会。
00:05:21这也是我们需要稍微放慢脚步的地方。
00:05:25已发布的版本并没有经过深度优化。
00:05:28主要的性能声明来自未发布的线程连接版本,我们目前无法对其进行完全测试。
00:05:36开发者声称在事务性工作负载上性能提高了大约 50%。
00:05:40他们还声称在分析工作负载上性能约为 Postgres 的 300 倍。
00:05:45这些数字非常惊人,但产生这些结果的代码目前无法进行任何形式的检查或基准测试。
00:05:53因此,目前仍存在很多猜测。
00:05:57看起来这里有大约五五开的意见分歧,至少在网上阅读时,带着这类问题。
00:06:03这些只是 GitHub 上的问题。
00:06:05然后你甚至会看到像这样的一个问题,对吧?
00:06:08这是一个完全合理的问题。
00:06:10当你读到这个问题时,开发者们似乎坚决想要让它真正工作起来。
00:06:15所以,我们暂时还没有真实的统计数据。
00:06:17但这并不自动意味着这些数字是错误的。
00:06:20这只是意味着我们应该将它们视为有希望的声明,而不是确定的事实。
00:06:24老实说,确切的乘数可能并不是最重要的部分。
00:06:28我们不需要在了解一个想法是否真正有效之前,就更改整个 Postgres 项目。
00:06:34这种自由可能比我们能得到的任何单一基准测试更有价值。
00:06:38现在,开发者们对所有这些 Rust 重写(甚至这个 PG Rust)的反应非常强烈。
00:06:44主要的 Hacker News 讨论获得了数百个积分和评论,但同样的,反应非常分裂。
00:06:50双方都提出了很好的观点。
00:06:52首先,通过每个回归查询是一项了不起的成就。
00:06:56很多项目声称与 Postgres 兼容。
00:06:59这个短语可以意味着几乎任何事情。
00:07:01PG Rust 有一个可衡量的目标。
00:07:04真实的 Postgres 测试才是评判它的标准。
00:07:07而且重写的速度表明,编码代理可能会彻底改变大规模基础设施实验的成本。
00:07:13曾经看起来过于昂贵而无法尝试的想法,现在似乎变得越来越可能了。
00:07:19现在,对于另一面,通过回归测试并不等同于赢得生产信任。
00:07:24这些测试无法取代多年的崩溃恢复和复制测试,或者运行数月而不停止的数据库。
00:07:31一个项目可以通过所有已知测试,但仍在没人想到要测试的情况下失败。
00:07:37生成数十万行代码是一项挑战。
00:07:42扩展兼容性是另一个主要差距。
00:07:45现在,你应该用 PG Rust 替换你的生产 Postgres 集群吗?
00:07:49不,绝对不要。
00:07:51该项目本身尚未生产就绪。
00:07:53它是声明过的。
00:07:54它没有完全优化。
00:07:56在主要的兼容性领域,包括扩展生态系统,它们仍然未完成。
00:08:02但你应该尝试一下吗?
00:08:03当然。
00:08:03如果你从事数据库、Rust、查询执行、兼容性测试或人工智能开发工作,为什么不试一试呢?
00:08:10运行 Docker 镜像,测试你的客户端库,阅读源代码,看看会发生什么。
00:08:16所以,把你的看法留在评论区。
00:08:18这个项目将走向何方?
00:08:20我们是否会开始用 Rust 重写更多内容?
00:08:21我们拭目以待。
00:08:23如果你喜欢像这样的编程技巧,请务必订阅 BetterStack 频道。
00:08:26我们下个视频见。

핵심 요약

PGRust 通过使用 Rust 重写 PostgreSQL 核心并借助 AI 辅助开发,实现了完全通过官方测试套件的兼容性,为未来在线程模型下实现显著性能提升提供了可能。

하이라이트

  • PGRust 完全兼容 PostgreSQL 18.3 数据目录,并通过了全部 46,000 个官方回归测试查询。

  • PGRust 采用 Rust 语言重写,旨在保持与原生 PostgreSQL 相同的客户端体验、SQL 语法和磁盘格式。

  • 未发布的开发版本引入了每个连接一个线程的模型,开发者声称其在事务性工作负载上性能提升约 50%,分析工作负载性能约为原生 PostgreSQL 的 300 倍。

  • 该项目利用 AI 编码代理辅助重写过程,降低了大规模底层基础设施架构重构的成本。

  • 目前 PGRust 尚未达到生产就绪状态,且缺乏对扩展生态系统的完整支持。

타임라인

项目概述与兼容性表现

  • PGRust 是一个独立的 PostgreSQL 实现,非现有扩展或分叉。
  • 该项目成功通过了官方 PostgreSQL 的 46,000 个回归测试用例。
  • 客户端无需任何修改即可连接并使用现有数据目录。

项目完全重写了 PostgreSQL 的底层引擎,同时维持与常规 PSQL 客户端及数据目录的完全兼容。尽管架构上抛弃了近四十年的 C 语言代码,但从外部观察,查询计划生成和执行统计均与标准 PostgreSQL 表现一致。

架构变革与性能潜力

  • 原生 PostgreSQL 采用每个连接一个进程的模型,导致较高的内存开销。
  • 未发布的 PGRust 开发版切换至每个连接一个线程的模型。
  • 新模型旨在降低连接开销并实现更高效的内部状态共享。

虽然当前版本速度与原生版本持平,但通过将每个连接一个进程的架构改为线程模型,未来有望实现显著的性能优化。这种改变伴随着隔离性下降的风险,即内存错误或不安全扩展可能更容易影响整个服务器。

人工智能在重写中的作用

  • 开发过程中大量使用了编码代理来加速代码转换。
  • AI 使得大规模重写代码在人力和时间成本上变得可行。
  • 部分声称的性能提升(如分析工作负载 300 倍提升)尚无法进行独立基准测试。

项目展示了 AI 如何助力开发者挑战高难度的基础架构重构。开发者虽然报告了极高的性能指标,但由于核心代码尚处于开发阶段且未向公众公开基准测试环境,这些数据目前仍属于有待验证的声明。

社区反响与生产就绪评估

  • 社区对项目的评价呈现两极分化态势。
  • 回归测试通过并不等同于长期的崩溃恢复和生产环境稳定性。
  • 项目目前严禁用于生产环境,但鼓励数据库开发者进行测试与探索。

GitHub 和 Hacker News 上的反馈显示,尽管通过回归测试是一项技术成就,但该项目距离生产就绪仍有巨大差距,尤其是在扩展生态系统兼容性方面。目前阶段的核心价值在于验证这种重写模式的可行性,而非立即替换生产环境数据库。

커뮤니티 글

모든 글 보기