3 个版本
0.5.5 | 2023 年 2 月 27 日 |
---|---|
0.5.4 | 2022 年 5 月 29 日 |
0.5.1 |
|
0.5.0 |
|
0.1.0-rc.6 |
|
#25 in 数据库实现
每月下载量 341
在 8 个 crate 中使用 (通过 bonsaidb-local)
395KB
9K SLoC
Nebari
Nebari - 名词 - 色叶植物树干底部向外伸展的表面根
此 crate 提供了 Roots
类型,它是 BonsaiDb
的事务性存储层。它受到了 Couchstore
的启发。
此 crate 在访问文件系统时阻止当前线程。如果您正在寻找一个异步就绪的数据库,BonsaiDb 是我们基于 Nebari 构建的异步感知数据库的愿景。
此 crate 是 alpha 版本。虽然其格式被认为是稳定的,但可能存在导致数据丢失的错误。请在使用此 crate 时采取良好的备份策略。
示例
在磁盘树中插入具有完整修订历史的键值对
use nebari::{
tree::{Root, Versioned},
Config,
};
let database_folder = tempfile::tempdir().unwrap();
let roots = Config::default_for(database_folder.path())
.open()
.unwrap();
let tree = roots.tree(Versioned::tree("a-tree")).unwrap();
tree.set("hello", "world").unwrap();
有关更多示例,请参阅 nebari/examples/
。
功能
Nebari 提供多个功能级别。最低级别的功能是 TreeFile
。一个 TreeFile
是一个使用只追加文件格式实现的键值存储。
使用 TreeFile
和事务日志,Roots
实现了符合 ACID 的多树事务。
每个树支持
- 键值存储:键可以是任意长度的字节序列,最长可达 65,535 字节。为了效率,键应保持较短。值的大小可达 4 千兆字节(2^32 字节)。
- 灵活的查询选项:一次获取一个键的记录,一次获取多个键的记录,或键的范围。
- 强大的多键操作:在内部,所有改变树中数据的函数都使用
TreeFile::modify()
,它允许对一个或多个键进行操作,并执行 各种操作。 - 可插拔的低级修改:
Vault
特性 允许你将自定义的加密、压缩或其他功能引入此格式。每个独立可寻址的数据块在写入文件时都会通过保险库。 - 可选的完整修订历史。如果你不想丢失旧的数据修订版本,可以使用
VersionedTreeRoot
存储允许扫描旧版本信息的资料。或者,如果你想避免额外的IO,可以使用UnversionedTreeRoot
,它只存储检索文件中最新数据所需的信息。 - ACID兼容性:
-
原子性:对
TreeFile
的每个操作都是原子性的。可以使用Operation::CompareSwap
来执行需要评估当前存储值的原子操作。 -
一致性:在发布新的事务状态时使用原子锁定操作。这确保读者永远不会在部分更新的状态下进行操作。
-
隔离性:目前,每个树只能在一个事务中独占访问。这意味着如果有两个事务请求同一个树,一个将在第二个被允许访问树之前执行并完成。这种策略将来可能会修改以提供更多灵活性。
-
持久性:仅追加文件格式设计为只允许读取已完全刷新到磁盘的数据。任何被中断的写入都将从文件末尾截断。
事务ID记录在树标题中。在从磁盘恢复时,使用事务日志验证事务ID。由于是追加格式,如果我们遇到未记录的事务,我们可以继续扫描文件以恢复以前的状态。我们这样做,直到找到成功提交的事务。
由于追加格式提供的简单保证,这个过程比大多数数据库实现都要简单得多。
-
为什么使用追加文件格式?
@ecton 在开始这个项目之前不是数据库工程师,根据你的观点,可能仍然不被认为是数据库工程师。实现ACID兼容性不是应该轻易尝试的事情。
然而,使用追加格式创建ACID兼容性要容易得多,只要你能够保证以下两点
- 打开先前存在的文件时,你能否识别最后一次有效写入发生的位置?
- 在写入文件时,直到文件完全刷新到磁盘,不要报告事务已成功。
Nebari中的B-Tree实现旨在提供这些确切的保证。
只添加不删除格式的主要缺点是,直到维护过程(压缩)发生,删除的数据都不会被清理:压缩过程会重写文件内容,跳过不再存在的条目。这个过程可以在不阻止文件操作的情况下发生,但确实会在操作期间引入I/O开销。
Nebari提供执行压缩的API,但目前将调度和自动化委托给该库的消费者。
开源许可
该项目,如Khonsu Labs的所有项目一样,都是开源的。该存储库可在MIT许可证或Apache许可证2.0下获得。
有关贡献的更多信息,请参阅CONTRIBUTING.md。
依赖关系
~5–12MB
~131K SLoC