什么是raft?
raft 是一种保证系统高可用的解决方案
如下图,假如我们有1个master和2个slave节点,形成主备

那么问题来了,如果Master节点宕掉了怎么办?
先简单说一下raft是怎么工作的,raft不是一个注册中心,而只是一个组件,它包含1个logtrace,用来记录最新状态
下面从3方面来阐述raft
1.Leader Election leader是如何被选举出来的?
raft中是以Term 进行划分的,每一个term都是以election开始的,如果election超时了,那么将进入新的Term进行下一轮选举
选举的算法:
current_term += 1
vote for self
ask for vote from all peers
下面分几种情况来分析选举最终产生leader的过程:
第一种情况:
3个节点随机选取的超时时间不同,
那么最左边节点会先进入下一个Term,成为candidate ,向其他两个节点发起拉票
其他两个Follower 节点Term 没有该节点新,因此将票投给它
那么左侧节点赢得了选票,成为leader
第二种情况:其中两个节点(左侧和上面的)的超时时间几乎一致,
因此这两个节点同时进入了下一个Term 成为了candidate, 并且想另外的Follower发起拉票
此时左侧节点和上方节点都处于T1,因此都没有得到对方的票
但是右侧节点先收到了左侧节点的请求,所以将票投给了左侧节点,
当上方节点来拉票的时候,已经将票给了左侧节点,因此只能拒绝投给上方节点
那么左侧节点有自己投自己的1票,加上右侧节点一票,多于半数,赢得选举
这时左侧节点(leader)也会向其他节点发送heartbeat,宣布自己已经赢得选举,那么上方节点收到后会切换回follower身份
第3种情况,3个节点进入下一个Term的时间几乎相同,
那么3个节点会几乎同时进入新Term变成candidate,那么3个节点都向其他节点发起拉票
第一次拉票都不成功,因为大家都投了自己,但是进入下次Term的随机时间有所不同
这一次 左侧节点提前进入了新的Term,向另外两个节点发起了拉票
其他两个节点看到比它们新的Term, 因此都把票投给了左侧节点,并且更新了自己的Term
那么左侧节点成功当选leader
日志复制部分,
大致思路是 leader向follower发起数据同步时,会从后向前发起match
未完待续。。。。
-如果半数以上节点都宕掉了怎么办? 可以增加一下observer
但是这些家伙不参与 read/write ,但是raft中未必好使,xd会中提到他们公司16+5个节点,其中5个节点是observer ,我理解这套是zk的机制
新leader当选成功后,如何进行数据的复制?
从后向前直到match
当leader没来得及复制就宕掉了?
过半数才会成功
但是如果新leader,没有最新信息呢? 会保证最新信息的拿到票,先比较index,index相同的情况下才会比较term大小
网络不稳定 network speration 的时候,可能导致leader不停的切换