
文章插图
选举超时
- 心跳超时

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

文章插图
re-election
如果节点A能得得到节点C的投票,加上自己的投票,就有大多数选票 。那么节点A将成为新的Leader节点,并且Term即任期的值加1更新到2:

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

文章插图
2个Candidate节点
这种情况下,就会触发一次新的选举,节点A和节点B又等待一个随机的选举超时时间,直到一方胜出:

文章插图
sc_20190511214801.png
我们假设节点A能得到大多数投票,那么接下来节点A就会成为新的Leader节点,并且任期term加1:

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

文章插图
5个节点的集群
我们假设发生了网络分区:节点A和B在一个网络分区,节点C、D和E在另一个网络分区,如下图所示,且节点B和节点C分别是两个网络分区中的Leader节点:

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

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

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

文章插图
分区网络恢复
参考地址:http://thesecretlivesofdata.com/raft/
推荐阅读
- 图解Kubernetes故障排查指南
- 保肝茶应该怎样喝,男人喝什么茶最好
- 中乙|中乙球员月薪一万是高薪?这不应该是很正常的事情吗?
- 如何选择普洱茶,如何选择和鉴别普洱茶
- 步行健身的最好方式是什么 步行健身的正确方式应该是什么
- 老式海尔冰箱调温图解 老式海尔冰箱温度调节
- 五峰毛尖的冲泡方法图解
- 翡翠|购买翡翠原石被忽悠了,应该怎么处理?
- 包教包会!用一张白纸教你推导出 RAFT 算法
- 餐厨垃圾应该如何处理
