#raft-consensus #distributed-consensus #distributed-systems #state-machine #consensus-algorithm #ha #log

raft

Raft算法的Rust语言实现

13个版本 (7个破坏性更新)

0.7.0 2023年3月7日
0.6.0 2021年6月16日
0.6.0-alpha2019年7月24日
0.5.0 2019年2月20日
0.0.0 2015年6月17日

#72 in 算法

Download history 2182/week @ 2024-03-13 1656/week @ 2024-03-20 1490/week @ 2024-03-27 1397/week @ 2024-04-03 1309/week @ 2024-04-10 1523/week @ 2024-04-17 1497/week @ 2024-04-24 2382/week @ 2024-05-01 2084/week @ 2024-05-08 1586/week @ 2024-05-15 1903/week @ 2024-05-22 1846/week @ 2024-05-29 2460/week @ 2024-06-05 1659/week @ 2024-06-12 1711/week @ 2024-06-19 1487/week @ 2024-06-26

7,579 每月下载量
17 个crate中使用(15个直接使用)

Apache-2.0

400KB
7.5K SLoC

Raft

Build Status Documentation Crates.io dependency status

问题和重要性

在构建分布式系统时,一个主要目标通常是实现容错性。也就是说,如果网络中的某个节点宕机,或者出现网络分区,整个集群不会崩溃。参与分布式一致性协议的节点集群必须就值达成一致,一旦达成决策,该选择就是最终确定的。

分布式一致性算法通常采用复制的状态机和日志的形式。每个状态机从其日志接收输入,并代表要复制的值,例如,哈希表。它们允许一组机器作为一个统一的整体工作,即使其成员中的一些发生故障也能生存。

两个著名的分布式一致性算法是Paxos和Raft。Paxos被Google在Chubby等系统中使用,而Raft被用于tikvetcd等系统中。Raft通常被认为比Paxos更易于理解且更容易实现。

设计

Raft通过日志复制状态机。如果你能确保所有机器都有相同的日志序列,在按顺序应用所有日志后,状态机将达到一致状态。

一个完整的Raft模型包含4个基本部分

  1. 共识模块,核心共识算法模块;

  2. 日志,保存Raft日志的地方;

  3. 状态机,保存用户数据的地方;

  4. 传输,通信的网络层。

The design of the Raft crate

注意:此Rust版本的Raft实现仅包含核心共识模块,不包括其他部分。Raft crate中的核心共识模块是可定制的、灵活的、健壮的。您可以直接使用Raft crate,但需要自己构建日志、状态机和网络传输组件。

使用raft crate

您可以使用rust-protobufProst来编码/解码gRPC消息。我们默认使用rust-protobuf。要使用Prost,请使用prost-codec特性构建(或依赖)Raft,不要使用默认特性。

开发Raft crate

Raft使用最新的stable Rust版本构建,使用2018版。最低支持版本为1.44.0

使用rustup可以这样开始

rustup component add clippy
rustup component add rustfmt

为了使您的PR合并,以下操作必须无错误完成

cargo test --all && \
cargo clippy --all --all-targets -- -D clippy::all   && \
cargo fmt --all -- --check

您可以选择安装cargo-watch,以便在编辑时自动重新构建

cargo watch -s "cargo check"

修改Protobufs

请参阅proto子目录中的说明

基准测试

我们使用Criterion进行基准测试。

目前正在努力构建适当的基准测试套件。如果您想帮忙,请告诉我们!感兴趣吗?

您可以通过安装gnuplot然后运行来运行基准测试

cargo bench

您可以在target/criterion/report/index.html中查看与基准测试相关的图表和图表。

您可以检查两个分支之间的性能

git checkout master
cargo bench --bench benches -- --save-baseline master
git checkout other
cargo bench --bench benches -- --baseline master

这将报告每个基准测试的相对增加或减少。

致谢

感谢etcd提供的惊人的Go实现!

使用Raft crate的项目

  • TiKV,一个由Rust和Raft驱动的分布式事务键值数据库。

依赖关系

~2–12MB
~125K SLoC