1个不稳定版本

0.6.0 2021年10月3日

#872 in 算法

Apache-2.0

390KB
7K 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驱动的分布式事务键值数据库。

依赖关系

~3–13MB
~142K SLoC