13个版本 (7个破坏性更新)
0.7.0 | 2023年3月7日 |
---|---|
0.6.0 | 2021年6月16日 |
0.6.0-alpha | 2019年7月24日 |
0.5.0 | 2019年2月20日 |
0.0.0 | 2015年6月17日 |
#72 in 算法
7,579 每月下载量
在 17 个crate中使用(15个直接使用)
400KB
7.5K 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驱动的分布式事务键值数据库。
进一步研究链接
依赖关系
~2–12MB
~125K SLoC