#log-entries #log-file #log-structured #storage-engine #raft #garbage-collection #key-value-store

raft-engine

Multi-Raft日志的持久化存储引擎

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 压缩

Download history 331/week @ 2024-04-27 494/week @ 2024-05-04 712/week @ 2024-05-11 344/week @ 2024-05-18 589/week @ 2024-05-25 1254/week @ 2024-06-01 750/week @ 2024-06-08 1047/week @ 2024-06-15 1831/week @ 2024-06-22 706/week @ 2024-06-29 756/week @ 2024-07-06 876/week @ 2024-07-13 686/week @ 2024-07-20 704/week @ 2024-07-27 881/week @ 2024-08-03 915/week @ 2024-08-10

3,461 每月下载量
用于raft-engine-ctl

Apache-2.0

555KB
13K SLoC

raft-engine

Rust codecov Docs crates.io

raft-engine是一个具有类似bitcask日志结构设计的持久嵌入式存储引擎。它为TiKV构建,用于存储Multi-Raft日志。

功能

  • 提供API以存储和检索具有连续索引的protobuf日志条目
  • 为单个Raft组提供键值存储
  • 最小写放大率
  • 协同垃圾回收
  • 支持日志条目上的lz4压缩
  • 支持文件系统扩展

设计

raft-engine由两个基本结构组成:memtable和日志文件。

在内存中,每个Raft组都持有自己的memtable,包含所有键值对以及所有日志条目的文件位置。在存储上,用户写入依次写入活动日志文件,该文件在达到可配置阈值时定期轮换。不同的Raft组共享相同的日志流。

写入

类似于RocksDB,raft-engine提供原子写入。用户可以在提交之前将更改存储到日志批次中。

一个日志批次的写入可以分为三个步骤

  1. 可选压缩日志条目
  2. 写入日志文件
  3. 应用到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