7 个不稳定版本
0.4.1 | 2023年9月14日 |
---|---|
0.4.0 | 2023年9月1日 |
0.3.0 | 2022年9月14日 |
0.2.2 | 2022年7月26日 |
0.1.0 | 2022年3月28日 |
#525 在 文件系统
每月42次下载
565KB
13K SLoC
Raft Engine
Raft Engine 是一个类似于 bitcask 的日志结构设计持久化嵌入式存储引擎。它是为 TiKV 存储 多 Raft 日志而构建的。
特性
设计
Raft Engine 由两个基本结构组成:memtable 和日志文件。
在内存中,每个 Raft Group 都持有自己的 memtable,其中包含所有键值对和所有日志条目的文件位置。在存储上,用户写入顺序写入活动日志文件,该文件在达到可配置的阈值后定期轮换。不同的 Raft Group 共享相同的日志流。
写入
类似于 RocksDB,Raft Engine 提供原子写入。用户可以在提交之前将更改存入日志批处理。
一个日志批次的写入可以分为三个步骤
- 可选压缩日志条目
- 写入日志文件
- 应用到 memtable
在第 2 步,为了分组并发请求,每个写入线程必须进入队列。第一个进入的线程自动成为队列领导者,负责将整个组写入日志文件。
支持同步和非同步写入。当批次中的一个写入被标记为同步时,批次领导者将在写入后调用 fdatasync()
。这样,缓冲数据就可以保证被刷新到存储中。
数据写入后,每个写入线程将自行将更改应用到自己的memtable。
垃圾回收
更改应用到本地状态机后,相应的日志条目可以从Raft引擎中逻辑地压缩。由于多个Raft组共享同一个日志流,这些截断的日志会在日志文件中留下空隙。在垃圾回收期间,Raft引擎扫描这些空隙,压缩日志文件以释放存储空间。只有在此时,不再需要的日志条目才会被物理删除。
Raft引擎以协作方式执行垃圾回收。
首先,其时间由用户控制。只有在用户主动调用purge_expired_files()
例程时,Raft引擎才会合并并删除其日志文件。例如,TiKV默认每10秒调用一次。
其次,它向用户发送有用的反馈。每次调用GC例程时,Raft引擎都会检查自身并返回包含特别旧日志条目的Raft组的列表。这些日志条目阻碍GC的进度,应由用户进行压缩。
使用此包
将其放入您的Cargo.toml中
[dependencies]
raft-engine = "0.4"
可用的Cargo功能
scripting
:与Rhai编译。这启用了包括unsafe_repair
在内的脚本调试工具。nightly
:启用仅在nightly中可用的功能,包括test
。internals
:重新导出Raft引擎内部的关键组件。在为docs.rs构建时启用。failpoints
:启用由tikv/fail-rs提供的故障点测试。swap
:使用SwappyAllocator
限制Raft引擎的内存使用。内存预算可以通过"memory-limit"进行配置。根据nightly
功能。
在examples目录下查看一些基本用例。
贡献
贡献总是受欢迎!以下是一些提交PR的技巧
- 所有提交都必须签署(使用
git commit -s
)以通过DCO检查。 - 测试将自动针对更改运行,其中一些可以在本地运行
# run tests with nightly features
make
# run tests on stable toolchain
make WITH_STABLE_TOOLCHAIN=force
# filter a specific test case
make test EXTRA_CARGO_ARGS=<testname>
- 对于可能引起性能变化的更改,请在PR描述中引用目标基准测试结果。除了微基准测试外,还有一个独立的压力测试工具,您可以使用它来展示系统性能。
cargo +nightly bench --all-features <bench-case-name>
cargo run --release --package stress -- --help
许可
版权所有(c)2017年至今,PingCAP,Inc。在Apache 2.0许可下发布。有关详细信息,请参阅LICENSE。
lib.rs
:
Raft引擎控制
依赖关系
~12–20MB
~271K SLoC