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 数据库实现
320KB
8K SLoC
FeOphant
基于 Rust 编写并受到 PostgreSQL 启发的 SQL 数据库服务器。
我们现在支持持久存储!虽然不是崩溃安全的,但我正在努力实现!
启动
启动服务器 ./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