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

bin+lib raft-engine-ctl

Raft Engine 的控制工具

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次下载

Apache-2.0

565KB
13K SLoC

Raft Engine

Rust codecov Docs crates.io

Raft Engine 是一个类似于 bitcask 的日志结构设计持久化嵌入式存储引擎。它是为 TiKV 存储 多 Raft 日志而构建的。

特性

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

设计

Raft Engine 由两个基本结构组成:memtable 和日志文件。

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

写入

类似于 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:启用仅在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