这篇文章总结了由Diego Ongaro和John Ousterhout所发表的论文《In Search of An Understandable Consensus Algorithm》里所描述的Raft共识算法。所有的引用都来自该论文。
Raft:
Raft是一种分布式共识算法。它被设计的易于理解。用来解决多台服务器在共享状态上即使发生故障也能达成一致的问题。共享状态通常是一个通过复制日志来支持的数据结构。我们需要确保只要大多数服务在运行时,整个系统就可以全面运转。
Raft通过在集群里选择出一个领导者的方式来工作。这个领导者负责接收客户端请求以及管理对其他服务器的日志复制。数据的流向只有一个方向:从领导者流向其他服务器。
Raft将共识拆解成以下三个子问题:
领导者选举(Leader Election):在现有的领导者出现故障的情况下,需要选举出一个新的领导者。
日志复制(Log replication):领导者需要通过复制来确保所有服务器上的日志与自身的保持同步。
安全性(Safety):如果服务器中的一台已经在特定的索引提交了一份日志条目,那么没有任何其他服务器可以向这个索引再提交一份不同的日志条目。
Raft在任何时候都确保以下这些特性为真:
选举的安全性(Election Safety):在一个指定的任期内最多只会有一个领导者被选举出来。
领导者只追加(Leader Append-Only):领导者永远都不会覆盖或者删除它自己的日志条目;它只会追加新增的条目。
日志的匹配处理(Log Matching):如果两份日志里含有一个具有相同索引和任期编号的条目,那么在这个索引之前的所有日志条目都是相同的。
领导者的完整性(Leader Completeness):如果一份日志条目在一个特定的任期内被提交了,那么这份条目也将会出现在所有后续更高任期编号的领导者的日志中。
状态机的安全性(State Machine Safety)&