今天在 GitHub Trending 上看到一个令人振奋的项目:pgrust,一个用 Rust 完全重写 Postgres 的开源实现,目标是与 Postgres 18.3 高度兼容,并已在超过 46000 条回归测试中通过。该项目由 malisper 主导,其核心理念是:保留 Postgres 的外部行为不变,用 Rust 语言和 AI 辅助编程来解锁更深层的内核改动。

一、项目概述

pgrust 的定位并非简单的 Postgres 包装器或扩展,而是一次从零开始的完整重写。它有着清晰的技术目标:

  • 100% 回归测试兼容:pgrust 以 Postgres 自身的 46000+ 回归测试用例为 oracle,逐一验证兼容性。当前已非常接近目标。
  • 磁盘兼容:pgrust 可以直接使用现有的 Postgres 18.3 数据目录启动,无需数据迁移。
  • 性能显著提升:最新版本(尚未公开发布)采用线程-per-连接模型(而非 Postgres 原生的进程-per-连接),在事务负载上比 Postgres 快 50%,在分析型负载上快约 300 倍,clickbench 测试仅比 ClickHouse 慢 2 倍,项目方认为还有进一步超越的空间。
  • WebAssembly 演示:官方提供了 pgrust.com 在线体验,直接在浏览器里跑 Postgres。

关键里程碑

里程碑状态
46000+ 回归测试通过✅ 已完成
磁盘兼容 Postgres 18.3✅ 已完成
100% 回归测试通过🚧 最新版本已达成,待发布
多线程内核🚧 进行中
内置连接池🚧 规划中

二、技术原理

架构设计

pgrust 选择了一条务实的路径:复刻 Postgres 的行为层,同时用 Rust 的现代系统编程能力重写底层实现。这种"外不变、内全新"的策略降低了迁移门槛——现有 Postgres 客户端、驱动和工具链可以无缝接入。

核心架构选择:

// 进程-per-连接 → 线程-per-连接
// 这是 pgrust 性能大幅提升的关键之一
// Postgres 每个连接 fork 一个进程,开销巨大
// pgrust 使用轻量级线程(goroutine 风格但用 Rust 实现)

技术栈

  • 语言:Rust(核心重写)
  • ICU 库:icu4c(Unicode 国际化支持)
  • 加密:OpenSSL 3
  • 数据库协议:Postgres 18.3 wire protocol(完全兼容)
  • 构建工具:Cargo + vendored Postgres 18.3 共享资源

为什么用 Rust 重写 Postgres?

作者在博客中指出了 Postgres 当前面临的核心问题:庞大而古老的 C 代码库使得内部改动风险极高。pgrust 的思路是:

保持 Postgres 的外部行为不变,保持真实的 Postgres 测试作为 oracle,用 Rust + AI 辅助编程来探索更深入的服务端改动。

这种策略既保留了 Postgres 多年积累的工程智慧,又为性能优化和功能实验打开了大门。

三、安装与快速开始

环境要求

macOS:

brew install icu4c openssl@3 libpq

export LIBRARY_PATH="$(brew --prefix openssl@3)/lib:${LIBRARY_PATH:-}"
export PKG_CONFIG_PATH="$(brew --prefix openssl@3)/lib/pkgconfig:$(brew --prefix icu4c)/lib/pkgconfig:${PKG_CONFIG_PATH:-}"
export PATH="$(brew --prefix libpq)/bin:$PATH"

Debian/Ubuntu:

sudo apt-get update
sudo apt-get install -y build-essential pkg-config libicu-dev libssl-dev \
  libldap2-dev libpam0g-dev postgresql-client-18

编译构建

PGRUST_PGSHAREDIR="$PWD/vendor/postgres-18.3/share" \
cargo build --release --locked --bin postgres

初始化并运行

# 初始化数据目录
target/release/postgres --initdb \
  -D /tmp/pgrust-data \
  -L "$PWD/vendor/postgres-18.3/share" \
  --no-locale --encoding UTF8 -U postgres

# 启动服务(需要较大的栈空间)
ulimit -s 65520
RUST_MIN_STACK=33554432 target/release/postgres \
  -D /tmp/pgrust-data -F \
  -c listen_addresses= -k /tmp -p 5432 \
  -c io_method=sync -c max_stack_depth=60000

# 连接测试
psql -h /tmp -p 5432 -U postgres -d postgres \
  -c "select version(), 1 + 1 as two"

Docker 快速体验

docker run -d --name pgrust -e POSTGRES_PASSWORD=secret malisper/pgrust:v0.1 \
  && until docker exec -e PGPASSWORD=secret pgrust \
       psql -h 127.0.0.1 -U postgres -c '\q' >/dev/null 2>&1; do sleep 1; done \
  && docker exec -it -e PGPASSWORD=secret pgrust \
       psql -h 127.0.0.1 -U postgres; docker rm -f pgrust

运行回归测试

PGRUST_BIN="$PWD/target/release/postgres" \
scripts/run-regression

该脚本使用 pgrust 自身的 --initdb 加上 vendored 的 Postgres 18.3 测试文件,自动运行全套回归测试套件。

四、Roadmap 与未来方向

pgrust 正在推进以下特性:

  • 多线程 Postgres 内核:当前已从进程-per-连接迁移到线程-per-连接
  • 内置连接池:减少应用层连接管理的复杂度
  • 更好的 JSON 负载支持:优化 JSON-heavy 工作负载性能
  • 快速 Fork/Branch 工作流:支持数据库的即时克隆和分支
  • 存储实验:包括 no-vacuum 设计,减少后台维护开销
  • 运行时安全护栏:对坏查询和 AI 生成的 SQL 进行运行时保护
  • 更稳定的执行计划:减少突然的执行计划切换导致的性能抖动

五、总结

pgrust 是数据库领域一次令人兴奋的实验。它不是在 Postgres 外面套壳,而是真正用现代语言重写核心,同时保持与现有 Postgres 生态的完全兼容。对于需要 Postgres 兼容性又追求更高性能的场景,pgrust 值得关注。

项目目前尚非生产就绪,但已展现出极高的技术完成度。关注项目进展或加入 Discord 获取最新动态,也可以订阅 pgrust.com 获取邮件更新。