#tree-root #file-format #b-tree #database #transaction #transaction-id #key

nebari

符合 ACID 的数据库存储实现,使用只追加文件格式

3 个版本

0.5.5 2023 年 2 月 27 日
0.5.4 2022 年 5 月 29 日
0.5.1 2022 年 4 月 30 日
0.5.0 2022 年 3 月 12 日
0.1.0-rc.6 2021 年 11 月 21 日

#25 in 数据库实现

Download history 187/week @ 2024-03-11 123/week @ 2024-03-18 137/week @ 2024-03-25 220/week @ 2024-04-01 118/week @ 2024-04-08 112/week @ 2024-04-15 135/week @ 2024-04-22 99/week @ 2024-04-29 62/week @ 2024-05-06 71/week @ 2024-05-13 119/week @ 2024-05-20 117/week @ 2024-05-27 76/week @ 2024-06-03 90/week @ 2024-06-10 81/week @ 2024-06-17 80/week @ 2024-06-24

每月下载量 341
8 个 crate 中使用 (通过 bonsaidb-local)

MIT/Apache 许可

395KB
9K SLoC

Nebari

nebari forbids unsafe code nebari is considered alpha crate version Live Build Status HTML Coverage Report for main branch Documentation for main branch

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