9个版本
0.4.2 | 2024年4月26日 |
---|---|
0.4.1 | 2023年9月14日 |
0.3.0 | 2022年9月14日 |
0.2.2 | 2022年7月26日 |
0.1.0 | 2022年3月28日 |
#46 in 压缩
3,461 每月下载量
用于raft-engine-ctl
555KB
13K SLoC
raft-engine
raft-engine是一个具有类似bitcask日志结构设计的持久嵌入式存储引擎。它为TiKV构建,用于存储Multi-Raft日志。
功能
设计
raft-engine由两个基本结构组成:memtable和日志文件。
在内存中,每个Raft组都持有自己的memtable,包含所有键值对以及所有日志条目的文件位置。在存储上,用户写入依次写入活动日志文件,该文件在达到可配置阈值时定期轮换。不同的Raft组共享相同的日志流。
写入
类似于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
:启用包括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。
依赖关系
~8–16MB
~206K SLoC