#嵌入式数据库 #无锁 #持久化 #LSM 树 #数据库 #并发 #嵌入式

bin+lib rsdb

一种闪存友好型的持久化无锁 B+ 树,页面缓存和日志

23 个版本 (10 个重大更新)

使用旧 Rust 2015

0.12.1 2017 年 9 月 5 日
0.11.2 2017 年 9 月 3 日
0.2.2 2017 年 7 月 30 日
0.1.0 2016 年 11 月 2 日

#208数据库实现

Apache-2.0

235KB
5.5K SLoC

Rust 4.5K SLoC // 0.1% comments Perl 1K SLoC // 0.2% comments Shell 23 SLoC // 0.1% comments Forge Config 1 SLoC // 0.8% comments

rsdb

Build Status documentation

一个现代的无锁原子嵌入式数据库,旨在在读取性能上击败 LSM 树,在写入性能上击败传统的 B+ 树。

它采用模块化设计,也可以用于实现您自己的高性能持久化系统,使用包含的 LockFreeLogPageCache。最终,将在 Tree 上构建一个版本化数据库,它提供多键事务和快照。

Tree 具有C语言API,因此您可以使用任何主流语言访问它。

extern crate rsdb;

let tree = rsdb::Config::default()
  .path(Some(path))
  .tree();

// set and get
tree.set(k, v1);
assert_eq!(tree.get(&k), Some(v1));

// compare and swap
tree.cas(k, Some(v1), Some(v2));

// scans
let mut iter = tree.scan(b"a non-present key < k!");
assert_eq!(iter.next(), Some((k, v2)));
assert_eq!(iter.next(), None);

// deletion
tree.del(&k);

警告

  • 相当年轻,有很多模糊测试,但不要将其作为十亿美元的生意来赌!
  • C语言API可能很快就会发生变化
  • 日志清理目前仅通过 fallocate 在 Linux 上实现!
  • 尚未得到许多性能调优的关注,它具有极高的理论性能,但要达到那里需要一些调整。目前,在特定负载下每秒大约只有200k个操作。这很快就会得到改善!

欢迎贡献!

  • 想帮助推动开源嵌入式数据库的发展?查看 CONTRIBUTING.md

功能

  • 无锁的 b-link 树
  • 带有预留槽位的无锁日志
  • 带有缓存友好型部分更新的无锁页面缓存
  • zstd 压缩
  • 可配置的缓存大小
  • C语言API
  • 日志清理
  • 合并运算符支持
  • 支持多键事务和快照的高级接口
  • 通过符号执行对无锁算法进行形式化验证

目标

  1. 在读取性能上击败 LSM,在写入性能上击败传统的 B+ 树。
  2. 不要使用过多的电力。我们的数据结构应该发挥现代硬件的优势。
  3. 不要让用户惊讶于性能陷阱。
  4. 将学术界的可靠性技术应用到实际实践中。

架构

无锁树在无锁日志上的无锁页缓存。页缓存将部分页面碎片分散到日志中,而不是像历史上用于旋转磁盘的B+树那样一次性重写整个页面。在页面读取时,我们并发地在日志中散列收集读取,以从其碎片中实现页面。

该系统主要受《申命记》架构的启发,并旨在实现RocksDB的最佳特性。

参考文献

依赖项

~1.6–4MB
~74K SLoC