图解Raft:应该是最容易理解的分布式一致性算法( 二 )


图解Raft:应该是最容易理解的分布式一致性算法

文章插图
选举超时
  • 心跳超时
如下图所示,节点A和C投票给了B,所以节点B是leader节点 。节点B会固定间隔时间向两个Follower节点A和C发送心跳消息,这个固定间隔时间被称为heartbeat timeout 。Follower节点收到每一条日志信息都需要向Leader节点响应这条日志复制的结果:
图解Raft:应该是最容易理解的分布式一致性算法

文章插图
心跳超时
重新选举选举过程中,如果Leader节点出现故障,就会触发重新选举 。如下图所示,Leader节点B故障(灰色),这时候节点A和C就会等待一个随机时间(选举超时),谁等待的时候更短,谁就先成为Candidate,然后向其他节点发送投票请求:
图解Raft:应该是最容易理解的分布式一致性算法

文章插图
re-election
如果节点A能得得到节点C的投票,加上自己的投票,就有大多数选票 。那么节点A将成为新的Leader节点,并且Term即任期的值加1更新到2:
图解Raft:应该是最容易理解的分布式一致性算法

文章插图
新Leader节点
需要说明的是,每个选举期只会选出一个Leader 。假设同一时间有两个节点成为Candidate(它们随机等待选举超时时间刚好一样),如下图所示,并且假设节点A收到了节点B的投票,而节点C收到了节点D的投票:
图解Raft:应该是最容易理解的分布式一致性算法

文章插图
2个Candidate节点
这种情况下,就会触发一次新的选举,节点A和节点B又等待一个随机的选举超时时间,直到一方胜出:
图解Raft:应该是最容易理解的分布式一致性算法

文章插图
sc_20190511214801.png
我们假设节点A能得到大多数投票,那么接下来节点A就会成为新的Leader节点,并且任期term加1:
图解Raft:应该是最容易理解的分布式一致性算法

文章插图
sc_20190511215048.png
网络分区在发生网络分区的时候,Raft一样能保持一致性 。如下图所示,假设我们的集群由5个节点组成,且节点B是Leader节点:
图解Raft:应该是最容易理解的分布式一致性算法

文章插图
5个节点的集群
我们假设发生了网络分区:节点A和B在一个网络分区,节点C、D和E在另一个网络分区,如下图所示,且节点B和节点C分别是两个网络分区中的Leader节点:
图解Raft:应该是最容易理解的分布式一致性算法

文章插图
发生网络分区
我们假设还有一个客户端,并且往节点B上发送了一个SET 3,由于网络分区的原因,这个值不能被另一个网络分区中的Leader即节点C拿到,它最多只能被两个节点(节点B和C)感知到,所以它的状态是uncomitted(红色):
图解Raft:应该是最容易理解的分布式一致性算法

文章插图
操作1
另一个客户端准备执行SET 8的操作,由于可以被同一个分区下总计三个节点(节点C、D和E)感知到,3个节点已经符合大多数节点的条件 。所以,这个值的状态就是committed:
图解Raft:应该是最容易理解的分布式一致性算法

文章插图
操作2
接下来,我们假设网络恢复正常,如下图所示 。节点B能感知到C节点这个Leader的存在,它就会从Leader状态退回到Follower状态,并且节点A和B会回滚之前没有提交的日志(SET 3产生的uncommitted日志) 。同时,节点A和B会从新的Leader节点即C节点获取最新的日志(SET 8产生的日志),从而将它们的值更新为8 。如此以来,整个集群的5个节点数据完全一致了:
图解Raft:应该是最容易理解的分布式一致性算法

文章插图
分区网络恢复
参考地址:http://thesecretlivesofdata.com/raft/




推荐阅读