天天看点

raft协议学习总结

什么是raft?

 raft 是一种保证系统高可用的解决方案

如下图,假如我们有1个master和2个slave节点,形成主备

raft协议学习总结

那么问题来了,如果Master节点宕掉了怎么办?

raft协议学习总结

先简单说一下raft是怎么工作的,raft不是一个注册中心,而只是一个组件,它包含1个logtrace,用来记录最新状态

raft协议学习总结

下面从3方面来阐述raft

1.Leader Election  leader是如何被选举出来的?

raft中是以Term 进行划分的,每一个term都是以election开始的,如果election超时了,那么将进入新的Term进行下一轮选举

raft协议学习总结

选举的算法:

current_term += 1

vote for self

ask for vote from all peers

下面分几种情况来分析选举最终产生leader的过程:

第一种情况:

3个节点随机选取的超时时间不同,

raft协议学习总结

那么最左边节点会先进入下一个Term,成为candidate ,向其他两个节点发起拉票

raft协议学习总结

 其他两个Follower 节点Term 没有该节点新,因此将票投给它

raft协议学习总结

那么左侧节点赢得了选票,成为leader 

raft协议学习总结

第二种情况:其中两个节点(左侧和上面的)的超时时间几乎一致,

raft协议学习总结

因此这两个节点同时进入了下一个Term 成为了candidate, 并且想另外的Follower发起拉票

此时左侧节点和上方节点都处于T1,因此都没有得到对方的票

但是右侧节点先收到了左侧节点的请求,所以将票投给了左侧节点,

raft协议学习总结

 当上方节点来拉票的时候,已经将票给了左侧节点,因此只能拒绝投给上方节点

raft协议学习总结

 那么左侧节点有自己投自己的1票,加上右侧节点一票,多于半数,赢得选举

raft协议学习总结

 这时左侧节点(leader)也会向其他节点发送heartbeat,宣布自己已经赢得选举,那么上方节点收到后会切换回follower身份

raft协议学习总结

 第3种情况,3个节点进入下一个Term的时间几乎相同,

raft协议学习总结

 那么3个节点会几乎同时进入新Term变成candidate,那么3个节点都向其他节点发起拉票

raft协议学习总结

 第一次拉票都不成功,因为大家都投了自己,但是进入下次Term的随机时间有所不同

raft协议学习总结

 这一次 左侧节点提前进入了新的Term,向另外两个节点发起了拉票

raft协议学习总结

 其他两个节点看到比它们新的Term, 因此都把票投给了左侧节点,并且更新了自己的Term

那么左侧节点成功当选leader

raft协议学习总结

日志复制部分,

 大致思路是 leader向follower发起数据同步时,会从后向前发起match

raft协议学习总结
raft协议学习总结
raft协议学习总结
raft协议学习总结
raft协议学习总结
raft协议学习总结
raft协议学习总结

 未完待续。。。。

-如果半数以上节点都宕掉了怎么办? 可以增加一下observer

但是这些家伙不参与 read/write ,但是raft中未必好使,xd会中提到他们公司16+5个节点,其中5个节点是observer ,我理解这套是zk的机制

新leader当选成功后,如何进行数据的复制? 

从后向前直到match

当leader没来得及复制就宕掉了?

过半数才会成功

但是如果新leader,没有最新信息呢? 会保证最新信息的拿到票,先比较index,index相同的情况下才会比较term大小

网络不稳定 network speration 的时候,可能导致leader不停的切换