pgrust:30分钟内搭建Postgres兼容的Rust版数据库
pgrust是一个使用Rust重写的Postgres数据库,目标是保持Postgres的行为和兼容性,同时利用Rust和AI-assisted编程探索更深层次的服务器变化。通过本教程,您将学会如何快速搭建和使用pgrust,包括如何运行回归测试、连接数据库以及执行查询。
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 postgresulimit -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的表,包含两个字段:id和name。
接着,我们可以插入一些测试数据:
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_addresses 和 port 配置来确保 pgrust 正在监听正确的地址和端口。我们也可以使用 psql 命令来测试连接:
psql -h /tmp -p 5432 -U postgres -d postgres如果连接失败,我们可以检查错误消息来找到原因。
另外,我们可能会遇到性能问题。性能问题通常是由于配置错误或数据量太大引起的。我们可以通过检查 io_method 和 max_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的最新更新和公告。