为什么要用 Rust 重写 Postgres
想象一下,你决定重新打造一款经典汽车的发动机,但这次用的不是原厂零件,而是用钛金属 3D 打印的零件。这大概就是 pgrust 项目正在做的事。开发者们拿来了 Postgres 18.3,开始有条不紊地用 Rust 重写其内部结构。
这听起来像是疯狂之举或学生实验,但数据给出了不同的答案。该项目已经通过了原始 Postgres 的 46,000 多项回归测试。这不仅仅是"受数据库启发"的项目,而是一个尝试创建二进制兼容替代品的项目——它能理解相同的数据文件和相同的查询。
这个项目是什么
pgrust 是对 PostgreSQL 内核的全面重构。其作者 malisper 的核心理念是,原始 Postgres 的 C 代码经过数十年的发展已经变得过于复杂,难以进行根本性的改变。在那里实现多线程或新的存储机制,需要在邮件列表上讨论数年才能完成。
Rust 在这里不仅仅作为"安全语言",更是一个快速迭代的工具。开发者使用 AI 助手来加速移植过程,但通过 Postgres 的参考测试严格控制结果。如果原始数据库对格式错误的 SQL 查询抛出错误,pgrust 必须抛出完全相同的错误。
pgrust 与原版的区别
最有趣的部分在于其规划和已实现的原型。README 提到了一个尚未公开发布的新版本,但结果已经引人注目。
不再使用经典的"每个连接一个进程"模型(这迫使我们使用 pgbouncer 或其他代理),pgrust 正在转向线程架构。这立即为事务工作负载带来了巨大的提升。根据作者的测量,这种架构比原版快 50%。
对于分析场景,数据更加惊人:声称实现了 300 倍的加速。开发者正在瞄准 Clickhouse 级别的性能,同时保持在熟悉的 Postgres 接口内。
技术细节和兼容性
该项目保持磁盘兼容性。你可以从 Postgres 18.3 中取出现有的数据目录,然后让 pgrust"指向"它。它会读取文件并开始工作。
要从源码构建,你需要使用处理 Postgres 的标准工具集:icu4c、openssl 和 libpq。这个过程对 Rust 开发者来说很熟悉:
一个有趣的细节:启动时必须手动增加栈限制(ulimit -s 65520),因为某些 Postgres 操作在栈上非常消耗内存,而 Rust 运行时的默认行为更为保守。
路线图的下一步
项目路线图就像是每位数据库管理员的愿望清单:
- 内置连接池(告别 pgbouncer)。
- 无 Vacuum 的存储实验。如果这能实现,pgrust 将解决 Postgres 最"痛苦"的问题之一。
- 针对糟糕查询的防护栏。这在当下尤为重要,因为神经网络生成的 SQL 通常不太关心索引和执行计划。
- 快速数据分支。
值得尝试吗
目前,pgrust 尚未准备好用于生产。作者们自己也坦诚承认了这一点。PL/Python 或 PL/Tcl 等扩展尚未支持,公开分支的性能也尚未完全优化。
然而,这是一个理想的实验场。如果你一直想深入了解 DBMS 的内部机制,但被庞大的 C 代码库吓退,pgrust 就是你的机会。Rust 代码的可读性和可修改性高出一个数量级。
你可以通过 Docker 用一条命令试用该项目:
这将启动一个包含 pgrust 的容器,并在内部打开标准的 psql。对于不想下载任何东西的人,官方网站上有一个在 WebAssembly 中运行的演示,可以直接在浏览器中运行。
这个项目看起来是近年来最雄心勃勃的开源挑战之一。即使 pgrust 在未来几年不会取代 Postgres,它也肯定会成为可能日后迁移到"大象"主分支的技术试验场。
相关项目