RAFT

与BFT类共识算法相比,CFT共识,尤其是Raft共识算法,从性能、可理解性和可实现性等方面来说具有一定优势。与不限制共识成员的公链不同,联盟链中所有参与节点的身份都是已知的,每个节点有很高的可信度,故在某些可信度高的业务场景下可采用不容拜占庭节点的传统共识算法,基于此,平台同时支持Raft共识算法。

角色介绍

首先在Raft共识机制中,节点共分为三种角色:

  • 领导者(Leader):接受客户端请求,并向从节点同步请求日志,当日志同步到大多数节点上后将提交日志,并广播给从节点。
  • 从节点(Follower):单向接收并持久化主节点同步的日志。
  • 候选节点(Candidate):主节点选举过程中的过渡角色,当从节点在规定的超时时间内没有收到主节点的任何消息,将转变为候选节点,并广播选举消息,且只有候选状态的节点才会接收选举投票的消息。候选节点有可能被选举为主节点,也有可能回退为从节点。

在同一时刻,集群中只有一个Leader,负责生成日志数据(对应在区块链中即负责打包)并广播给Follower节点,为了保证共识的正确性和简单性,所有Follower节点只能单向接收从Leader发来的日志数据。

共识流程

Raft算法共识流程分为主节点选举和日志同步两步。将时间分为一个个的任期(term),每一个term以Leader选举开始。在成功选举Leader之后,Leader会在整个term内管理整个集群。如果Leader选举失败,该term就会因为没有Leader而结束。

具体共识流程如下图所示:

RAFT - 图1

  1. 领导人选举:Raft 使用心跳(heartbeat)触发Leader选举。当服务器启动时,Leader向所有Followers周期性发送heartbeat。如果Follower在选举超时时间内没有收到Leader的heartbeat,就会发起一次Leader选举。Follower将其当前term加一然后转换为Candidate。它首先给自己投票并且给集群中的其他服务器发送RequestVoteRPC。当赢得了多数的选票,成功当选为Leader后,它会重复开头的操作,即定期向所有Followers发送heartbeat维持其统治;
  2. 日志同步:Leader选出后,就开始接收客户端的请求。Leader把请求作为日志条目(Log entries)加入到它的日志中,然后并行的向其他Follower节点发起AppendEntries RPC以复制该日志条目。当这条日志被复制到大多数服务器上,Leader将这条日志应用到它的状态机并向客户端返回执行结果。