1个不稳定版本
0.6.0 | 2021年10月3日 |
---|
#872 in 算法
390KB
7K SLoC
Raft
问题和重要性
在构建分布式系统时,一个主要目标通常是构建容错性。也就是说,如果网络中的某个节点宕机,或者出现网络分区,整个集群不会崩溃。参与分布式一致性协议的节点集群必须在值上达成一致,一旦达成决策,该选择就是最终的。
分布式一致性算法通常采用复制状态机和日志的形式。每个状态机接受其日志的输入,并代表要复制的值(例如,哈希表)。它们允许一组机器作为一个协调一致的组工作,即使其成员中的一些失败也能继续工作。
两个著名的分布式一致性算法是Paxos和Raft。Paxos被Google的系统中如Chubby使用,Raft被用于tikv
或etcd
等项目中。Raft通常被认为比Paxos更容易理解和实现。
设计
Raft通过日志复制状态机。如果你能确保所有机器都有相同的日志序列,在依次应用所有日志后,状态机将达到一致状态。
一个完整的Raft模型包含4个基本部分
-
共识模块,核心共识算法模块;
-
日志,存储Raft日志的地方;
-
状态机,保存用户数据的地方;
-
传输,通信的网络层。
注意:此Rust版本的Raft实现仅包括核心一致性模块,不包括其他部分。Raft crate中的核心一致性模块是可定制、灵活且健壮的。您可以直接使用Raft crate,但需要构建自己的日志、状态机和传输组件。
使用raft crate
您可以使用rust-protobuf或Prost来对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