#sql-database #database-server #sql #database #postgresql #i-m #postre-sql

bin+lib feophant

基于 Rust 编写并受到 PostgreSQL 启发的 SQL 数据库服务器

7 个版本 (破坏性更新)

0.9.0 2021 年 10 月 10 日
0.8.0 2021 年 8 月 15 日
0.7.1 2021 年 8 月 1 日
0.7.0 2021 年 7 月 19 日
0.4.0 2021 年 7 月 10 日

#189 in 数据库实现

AGPL-3.0-or-later

320KB
8K SLoC

FeOphant

基于 Rust 编写并受到 PostgreSQL 启发的 SQL 数据库服务器。

我们现在支持持久存储!虽然不是崩溃安全的,但我正在努力实现!

Latest Build codecov

网站

启动

启动服务器 ./feophant

启动一个 postgres 客户端应用程序进行测试 ./pgbench -h 127.0.0.1 -p 50000 ./psql -h 127.0.0.1 -p 50000

用于分析的基准测试 cargo instruments --bench feophant_benchmark -t time

用户界面功能

  • 使用 postgres 客户端/驱动程序未认证连接。
  • 您可以创建表、插入数据并查询单个表。
  • 数据持久化到磁盘,不是崩溃安全的,且磁盘上的格式不是稳定的。

Postgres 差异

盲目地重复已经完成的事情有点意义不大,因此我在数据库服务器设计上对 PostgreSQL 做了以下更改。

  • Rust 的内存安全和强类型系统。

  • 基于 Tokio 的多线程异步设计,而不是 PostgreSQL 的多进程设计。

    • 这个的好处是不需要管理 SYSV 共享内存。(PostgreSQL 大部分已经修复了这个问题,但我认为仍然值得注意)。
  • 想避免事务绕圈时进行清理。将尝试 64 位事务 ID,但可能改为 128 位。

    • 我可以避免需要冻结事务 ID,但是提示位需要扫描以确保它们已更新。
  • 用 UUIDv4 替换 OIDs。

  • 我认为我已经弄清楚了我感兴趣的Postgres的核心差异。我非常喜欢Postgres的事务性DDL,但版本控制模式结构真的很糟糕。如果我将数据库服务器做成库,您的模式就是代码呢?您提供一个新的运行作为数据库服务器的二进制文件,如果您需要更改它,只需部署二进制文件即可?然后编译器可以优化掉您在您的用例中不需要运行系统的任何内容。最难的部分是处理影响您的磁盘格式的模式更改。

Rust笔记

如何理智地设置模块:[链接](https://dev.to/stevepryde/intro-to-rust-modules-3g8k)

合理的应用程序错误类型创建:[链接](https://github.com/dtolnay/anyhow)

库错误:[链接](https://github.com/dtolnay/thiserror)

Rust无法将枚举变体视为类型是一个巨大的痛点。我最终需要有一个枚举来存储数据,另一个枚举来验证和匹配子类型。《[RFC](https://github.com/rust-lang/rfcs/pull/2593)》修复此问题已被无限期推迟。

我明确努力实现与PostgreSQL的SQL+Driver兼容性,因此诸如系统表和处理它们的代码将具有相同的名称。我认为这不会违反他们的商标政策,但如果我违反了,请随时联系我!我还采用了相当严格的许可证,但如果这对其他人使用代码造成问题,我不会坚持这个许可证。

依赖项

~13-26MB
~370K SLoC