📢gitzw.com上线了,功能陆续更新中,如有问题或反馈请在下方反馈/建议中给我们留言。
pgrust:30分钟内搭建Postgres兼容的Rust版数据库

pgrust:30分钟内搭建Postgres兼容的Rust版数据库

📌 本文速览

pgrust是一个使用Rust重写的Postgres数据库,目标是保持Postgres的行为和兼容性,同时利用Rust和AI-assisted编程探索更深层次的服务器变化。通过本教程,您将学会如何快速搭建和使用pgrust,包括如何运行回归测试、连接数据库以及执行查询。

🎯 进阶📖 10 章⏱ ≈31 分钟读完🔄 更新于 2026-07-12📅 资料截至 2026-07
源项目:github.com/malisper/pgrust★ 2,104

1. 什么是pgrust及其目标

我们先来了解一下什么是pgrust及其目标。pgrust是一个使用Rust语言重写的Postgres数据库兼容版。其目标是保持与Postgres 18.3的兼容性,并且能够从现有的Postgres 18.3数据目录启动。

你可能会好奇为什么需要重写Postgres。事实上,Postgres是一个成熟的数据库管理系统,但它的代码基数较大,使用C语言编写,维护和更新可能会比较困难。通过使用Rust语言重写Postgres,pgrust项目希望能够使Postgres更容易维护和更新,并且能够利用Rust的安全性和性能优势。

pgrust项目的目标不仅仅是重写Postgres,还包括使Postgres更容易改变和扩展。通过使用Rust语言和AI辅助编程,pgrust项目希望能够探索更深层次的服务器变化,并且能够使Postgres更好地适应现代的需求。

目前,pgrust项目已经能够通过超过46,000个回归测试,并且能够从现有的Postgres 18.3数据目录启动。但是,pgrust项目仍然处于开发阶段,并且还没有达到生产就绪的状态。

我们可以通过多种方式尝试pgrust,包括使用Docker镜像、从源代码构建等。下面我们将介绍如何从源代码构建pgrust。

首先,我们需要安装必要的依赖包,包括icu4c、openssl和libpq。然后,我们可以使用cargo构建pgrust。

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"
PGRUST_PGSHAREDIR="$PWD/vendor/postgres-18.3/share" \
cargo build --release --locked --bin postgres

构建完成后,我们可以创建一个数据目录,并且启动pgrust。

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客户端连接到pgrust。

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

本章小结

  • 了解了pgrust项目的目标和意义
  • 了解了如何从源代码构建pgrust
  • 了解了如何启动pgrust并连接到pgrust
  • 了解了pgrust项目的当前状态和未来计划

2. 如何安装和配置pgrust

现在,我们要学习如何安装和配置pgrust。安装和配置是使用pgrust的第一步,我们需要确保环境准备就绪,然后才能运行pgrust。

首先,我们需要安装必要的依赖项。这些依赖项包括icu4c、openssl、libpq等。安装方式根据操作系统的不同而有所不同。

如果你使用的是macOS,你可以使用brew来安装依赖项:

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,你可以使用apt-get来安装依赖项:

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。构建pgrust使用cargo工具:

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

现在,我们可以运行pgrust了:

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

运行pgrust后,我们可以使用psql客户端连接到pgrust:

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

别担心,如果你遇到任何问题,我们可以一步一步地排查和解决。

本章小结

  • 了解了如何安装pgrust的依赖项
  • 了解了如何构建pgrust
  • 了解了如何创建pgrust的数据目录
  • 了解了如何运行pgrust并连接到pgrust

3. 运行pgrust的回归测试

现在我们已经成功运行了pgrust,并且可以使用psql客户端连接到它。接下来,我们需要确保pgrust能够通过Postgres的回归测试,以验证其兼容性和正确性。运行回归测试是验证pgrust是否能够匹配Postgres预期输出的重要步骤。

首先,我们需要了解什么是回归测试。回归测试是一种软件测试方法,用于验证软件的修改或更新是否引入了新的错误或问题。对于pgrust来说,回归测试是验证其是否能够匹配Postgres预期输出的关键步骤。

我们可以使用以下命令运行pgrust的回归测试:

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

这个命令使用pgrust自己的--initdb选项初始化一个新的数据目录,然后运行Postgres 18.3的回归测试。测试结果将显示pgrust是否能够匹配Postgres预期输出。

运行回归测试时,我们可能会遇到一些问题,例如测试失败或错误。别担心,我们可以一步一步地排查和解决这些问题。如果测试失败,我们可以查看测试日志以了解失败的原因,然后根据日志信息进行调试和修复。

另外,我们需要注意的是,回归测试需要一个Postgres 18的psql客户端在系统的PATH中。如果psql客户端不在PATH中,我们需要设置PGRUST_PSQL环境变量以指向psql客户端的路径。

本章小结

  • 了解了什么是回归测试及其重要性
  • 了解了如何运行pgrust的回归测试
  • 了解了如何排查和解决回归测试中的问题
  • 了解了需要一个Postgres 18的psql客户端在系统的PATH中以运行回归测试

4. 连接和使用pgrust数据库

现在我们已经了解了如何运行pgrust的回归测试,下一步就是连接和使用pgrust数据库了。你可能会好奇为什么我们需要连接到数据库,别担心,我们慢慢来。连接到数据库是我们能够使用数据库的必经之路,我们需要通过一个客户端工具来连接到pgrust数据库。

首先,我们需要确保pgrust已经成功编译和安装,如果你还没有安装pgrust,可以参考之前的章节。接着,我们需要创建一个数据目录,用于存储pgrust的数据。你可以使用以下命令创建一个数据目录:

target/release/postgres --initdb \
  -D /tmp/pgrust-data \
  -L "$PWD/vendor/postgres-18.3/share" \
  --no-locale \
  --encoding UTF8 \
  -U postgres

这个命令会创建一个新的数据目录 /tmp/pgrust-data,并初始化pgrust的数据库。

接下来,我们需要运行pgrust的服务器,你可以使用以下命令运行pgrust:

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

这个命令会启动pgrust的服务器,监听端口5432。

现在,我们可以使用psql客户端工具连接到pgrust数据库了。你可以使用以下命令连接到数据库:

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

这个命令会连接到pgrust数据库,执行一个简单的查询,返回pgrust的版本号和一个简单的计算结果。

如果你遇到连接错误,可能是因为pgrust服务器没有启动,或者psql客户端工具没有安装。你可以检查pgrust服务器的日志文件,或者重新安装psql客户端工具。

我们先来总结一下本章的关键操作:

  • 创建一个数据目录,用于存储pgrust的数据
  • 运行pgrust的服务器,监听端口5432
  • 使用psql客户端工具连接到pgrust数据库,执行查询

本章小结

  • 了解了如何连接和使用pgrust数据库
  • 了解了如何创建一个数据目录,用于存储pgrust的数据
  • 了解了如何运行pgrust的服务器,监听端口5432
  • 了解了如何使用psql客户端工具连接到pgrust数据库,执行查询

5. 执行查询和测试性能

现在我们已经成功连接到pgrust数据库了,我们可以开始执行查询和测试性能了。你可能会好奇为什么我们需要测试性能,别担心,我们慢慢来。性能测试是为了确保pgrust的速度和效率能够满足我们的需求。

首先,我们需要创建一个测试表和一些测试数据。我们可以使用以下命令创建一个测试表:

psql -h /tmp -p 5432 -U postgres -d postgres \
  -c "CREATE TABLE test (id SERIAL PRIMARY KEY, name VARCHAR(50));"

这个命令会创建一个名为test的表,包含两个字段:idname

接着,我们可以插入一些测试数据:

psql -h /tmp -p 5432 -U postgres -d postgres \
  -c "INSERT INTO test (name) VALUES ('John'), ('Jane'), ('Bob');"

这个命令会插入三行数据到test表中。

现在,我们可以执行一些查询来测试性能。例如,我们可以使用以下命令查询所有数据:

psql -h /tmp -p 5432 -U postgres -d postgres \
  -c "SELECT * FROM test;"

这个命令会返回所有数据。

我们也可以使用以下命令查询特定数据:

psql -h /tmp -p 5432 -U postgres -d postgres \
  -c "SELECT * FROM test WHERE name = 'John';"

这个命令会返回名为John的数据。

如果你遇到性能问题,可能是因为pgrust的配置不合适,或者数据量太大。你可以尝试调整pgrust的配置,或者优化你的查询。

我们先来总结一下本章的关键操作:

  • 创建一个测试表和测试数据
  • 执行查询来测试性能
  • 调整pgrust的配置和优化查询来解决性能问题

本章小结

  • 了解了如何创建测试表和测试数据
  • 了解了如何执行查询来测试性能
  • 了解了如何调整pgrust的配置和优化查询来解决性能问题
  • 了解了如何使用psql客户端工具连接到pgrust数据库,执行查询和测试性能

6. 如何定制和优化pgrust

现在,我们已经成功地运行了pgrust数据库,并执行了一些查询来测试性能。下一步,我们需要学习如何定制和优化pgrust,以便更好地满足我们的需求。

首先,我们需要了解pgrust的配置文件。pgrust的配置文件位于/tmp/pgrust-data目录下,名为postgresql.conf。我们可以使用以下命令来查看配置文件的内容:

cat /tmp/pgrust-data/postgresql.conf

这个命令会显示配置文件的内容,我们可以看到各种配置参数的值。

如果我们想要修改配置参数的值,我们可以使用以下命令:

echo "listen_addresses = 'localhost'" >> /tmp/pgrust-data/postgresql.conf

这个命令会在配置文件的末尾添加一行新的配置参数。

我们也可以使用psql客户端工具来修改配置参数的值。例如,我们可以使用以下命令来设置listen_addresses参数的值:

psql -h /tmp -p 5432 -U postgres -d postgres \
  -c "ALTER SYSTEM SET listen_addresses TO 'localhost';"

这个命令会设置listen_addresses参数的值为localhost

除了修改配置参数的值,我们还可以优化pgrust的性能。例如,我们可以使用以下命令来设置shared_buffers参数的值:

psql -h /tmp -p 5432 -U postgres -d postgres \
  -c "ALTER SYSTEM SET shared_buffers TO '512MB';"

这个命令会设置shared_buffers参数的值为512MB,这可以提高pgrust的性能。

如果我们遇到性能问题,我们可以使用EXPLAIN命令来分析查询的执行计划。例如,我们可以使用以下命令来分析一个查询的执行计划:

psql -h /tmp -p 5432 -U postgres -d postgres \
  -c "EXPLAIN SELECT * FROM test;"

这个命令会显示查询的执行计划,我们可以看到查询的执行步骤和所需的时间。

我们也可以使用ANALYZE命令来收集查询的执行统计信息。例如,我们可以使用以下命令来收集一个查询的执行统计信息:

psql -h /tmp -p 5432 -U postgres -d postgres \
  -c "ANALYZE SELECT * FROM test;"

这个命令会收集查询的执行统计信息,我们可以看到查询的执行时间和所需的资源。

本章小结

  • 了解了如何修改pgrust的配置文件
  • 了解了如何使用psql客户端工具来修改配置参数的值
  • 了解了如何优化pgrust的性能
  • 了解了如何使用EXPLAIN命令来分析查询的执行计划
  • 了解了如何使用ANALYZE命令来收集查询的执行统计信息

7. pgrust的当前状态和未来计划

pgrust的当前状态和未来计划是一个非常重要的话题,因为它直接关系到我们如何使用和发展这个项目。我们可能会好奇,pgrust的开发团队目前的目标是什么,他们计划如何改进这个项目,以及我们如何能够参与到这个过程中。

首先,我们需要了解pgrust的当前状态。根据项目的README文件,pgrust已经能够通过超过46,000个回归测试,这意味着它已经具备了相当的Postgres兼容性。然而,pgrust仍然不是生产就绪的,它的性能也还没有被优化。

接下来,我们来看看pgrust的未来计划。开发团队已经规划了几个重要的目标,包括实现多线程的Postgres内部机制、内置的连接池、更好的JSON工作负载支持、快速的分支和合并工作流、存储实验(包括无需清理的设计)、运行时保护以防止坏查询和AI生成的SQL,以及减少突然的坏计划切换。

我们可能会想知道如何参与到pgrust的开发中。一个方法是通过试用pgrust的WebAssembly演示版本,这可以让我们体验pgrust的功能和性能。我们也可以通过Docker运行pgrust,或者从源代码构建它。

如果我们遇到任何问题或有任何建议,我们可以通过打开一个issue或者加入pgrust的Discord社区来联系开发团队。他们非常欢迎任何反馈和建议,这将有助于pgrust的发展和改进。

本章小结

  • 了解了pgrust的当前状态,包括它的兼容性和性能
  • 了解了pgrust的未来计划,包括多线程、连接池、JSON支持等
  • 了解了如何参与到pgrust的开发中,包括试用WebAssembly演示版本、通过Docker运行pgrust、从源代码构建它
  • 了解了如何联系pgrust的开发团队,包括打开一个issue或者加入Discord社区

8. 使用Docker运行pgrust

使用Docker运行pgrust是一个非常方便的方式,尤其是对于那些不想从源代码构建的人来说。我们可以通过一个简单的命令就能运行起来pgrust的Docker容器。

首先,我们需要确保自己的机器上已经安装了Docker。如果还没有安装,可以去Docker的官方网站下载并安装。

安装好Docker后,我们可以使用以下命令运行pgrust的Docker容器:

docker run -d --name pgrust -e POSTGRES_PASSWORD=secret malisper/pgrust:v0.1

这个命令会下载pgrust的Docker镜像并运行一个容器。容器的名称为pgrust,环境变量POSTGRES_PASSWORD被设置为secret

等待容器启动后,我们可以使用以下命令连接到pgrust:

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

第一个命令会等待pgrust容器准备好,然后连接到psql。第二个命令会打开一个交互式的psql shell,我们可以在里面执行SQL命令。

如果我们想停止并删除容器,可以使用以下命令:

docker rm -f pgrust

使用Docker运行pgrust是一个非常方便的方式,我们可以快速地体验pgrust的功能和性能。同时,我们也可以使用Docker来进行开发和测试,这样可以避免在本地机器上安装和配置pgrust。

你可能会好奇为什么我们需要使用malisper/pgrust:v0.1作为Docker镜像的名称。这个名称是由pgrust的开发者指定的,v0.1表示这是pgrust的第一个版本。我们可以使用latest代替v0.1,但是这样可能会导致我们使用的版本不是最新的。

本章小结

  • 了解了如何使用Docker运行pgrust
  • 了解了如何连接到pgrust容器并执行SQL命令
  • 了解了如何停止并删除pgrust容器
  • 了解了Docker镜像的名称和版本的意义

9. 从源代码构建pgrust

从源代码构建pgrust是一个非常重要的步骤,我们可以通过这种方式来深入了解pgrust的内部实现和工作原理。别担心,如果你没有太多的编程经验,我们会一步一步地来完成这个过程。

首先,我们需要确保我们的系统上已经安装了必要的依赖包。我们可以通过以下命令来安装这些包:

# macOS
brew install icu4c openssl@3 libpq

# 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

这些包包括了 ICU、OpenSSL、libpq 等,都是 pgrust 构建所需要的。

接下来,我们需要设置一些环境变量,以便 pgrust 能够找到这些依赖包:

# macOS
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"

这些环境变量告诉 pgrust 在哪里可以找到这些依赖包。

现在,我们可以开始构建 pgrust 了。我们可以通过以下命令来构建 pgrust:

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

这个命令告诉 Cargo 来构建 pgrust 的 postgres 二进制文件。

构建完成后,我们需要创建一个数据目录,以便 pgrust 可以使用:

target/release/postgres --initdb \
  -D /tmp/pgrust-data \
  -L "$PWD/vendor/postgres-18.3/share" \
  --no-locale \
  --encoding UTF8 \
  -U postgres

这个命令创建了一个新的数据目录,并初始化了 pgrust 的数据库。

现在,我们可以运行 pgrust 了:

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

这个命令启动了 pgrust 的数据库服务器。

最后,我们可以通过以下命令来连接 pgrust 的数据库:

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

这个命令连接到了 pgrust 的数据库,并执行了一个简单的 SQL 查询。

如果你遇到任何问题或错误,可以检查一下你是否正确地安装了依赖包和设置了环境变量。同时,你也可以检查一下 pgrust 的日志文件来诊断问题。

本章小结

  • 了解了如何从源代码构建 pgrust
  • 了解了如何设置环境变量和构建 pgrust
  • 了解了如何创建数据目录和运行 pgrust
  • 了解了如何连接 pgrust 的数据库和执行 SQL 查询

10. 常见问题和故障排除

在上一章中,我们已经成功地从源代码构建并运行了 pgrust,现在我们可以继续探索如何使用它。然而,在使用的过程中,我们可能会遇到一些问题或错误,这就是本章要解决的问题。我们将一起学习如何排查和解决这些问题。

首先,我们需要了解 pgrust 的日志文件是非常重要的调试工具。通过查看日志文件,我们可以找到错误的原因和解决方法。日志文件通常位于 /tmp/pgrust-data/pg_log 目录下,我们可以使用以下命令来查看日志文件:

tail -f /tmp/pgrust-data/pg_log/postgres.log

这个命令会实时显示日志文件的内容,我们可以通过它来诊断问题。

其次,我们可能会遇到连接问题。连接问题通常是由于配置错误或网络问题引起的。我们可以通过检查 listen_addressesport 配置来确保 pgrust 正在监听正确的地址和端口。我们也可以使用 psql 命令来测试连接:

psql -h /tmp -p 5432 -U postgres -d postgres

如果连接失败,我们可以检查错误消息来找到原因。

另外,我们可能会遇到性能问题。性能问题通常是由于配置错误或数据量太大引起的。我们可以通过检查 io_methodmax_stack_depth 配置来优化性能。我们也可以使用 EXPLAIN 命令来分析查询性能:

EXPLAIN SELECT * FROM table;

这个命令会显示查询的执行计划,我们可以通过它来优化查询。

最后,我们可能会遇到兼容性问题。兼容性问题通常是由于 pgrust 不支持某些 Postgres 功能引起的。我们可以通过检查 pgrust 的文档来了解其兼容性情况。我们也可以使用 psql 命令来测试兼容性:

psql -h /tmp -p 5432 -U postgres -d postgres -c "SELECT version();"

这个命令会显示 pgrust 的版本信息,我们可以通过它来检查兼容性。

本章小结

  • 了解了如何查看 pgrust 的日志文件
  • 了解了如何排查连接问题
  • 了解了如何优化性能
  • 了解了如何检查兼容性

通过本章的学习,我们已经掌握了如何排查和解决 pgrust 中常见的问题。我们可以通过查看日志文件、检查配置、优化性能和检查兼容性来解决问题。同时,我们也可以通过 pgrust 的文档和社区来获取更多的帮助和支持。

常见问题

问题:如何安装pgrust?

安装pgrust可以通过Docker或从源代码编译两种方式进行。使用Docker只需运行一条命令即可启动pgrust容器,而从源代码编译则需要安装必要的依赖项并使用Cargo进行编译。

问题:pgrust是否支持所有Postgres功能?

pgrust目前还不支持所有Postgres功能,尤其是某些扩展和存储过程语言。虽然它可以兼容Postgres 18.3的数据目录,并通过了超过46,000个回归测试,但仍有一些功能尚未实现。

问题:如何运行pgrust的回归测试?

运行pgrust的回归测试可以使用脚本scripts/run-regression,此脚本使用pgrust自己的--initdb选项以及vendored Postgres 18.3测试文件。需要确保Postgres 18的psql客户端在系统路径中。

问题:pgrust的性能如何?

pgrust的新版本在事务工作负载上比Postgres快50%,在分析工作负载上快了大约300倍,尽管在某些基准测试中可能略慢于Clickhouse。但是,需要注意pgrust尚未针对性能进行优化。

问题:如何报告pgrust的问题或反馈?

如果遇到问题或有反馈,可以在pgrust的GitHub页面打开一个issue,或者通过电子邮件maintainers@pgrust.com联系维护者。

问题:pgrust的许可证是什么?

pgrust使用AGPL-3.0许可证,详细信息可以在LICENSE文件中找到。

问题:如何获取pgrust的最新更新?

可以通过访问pgrust的网站(https://pgrust.com/#updates)或加入Discord频道(https://discord.gg/FZZ4dbdvwU)来获取pgrust的最新更新和公告。

🔗 相关推荐

📦 相关项目