如何理解Raft算法的实现原理?
(一)Raft的基本流程过程:
首先在整个过程中只有三种状态:
- 首先是Leader
- Follower (一开始都是这种状态)
- Candidate
然后进行开始整个流程:
- start up:起始状态,节点刚启动的时候自动进入的是follower状态。 times out, starts election:follower在启动之后,将开启一个选举超时的定时器,当这个定时器到期时,将切换到candidate状态发起选举。
- times out, starts election:follower在启动之后,将开启一个选举超时的定时器,当这个定时器到期时,将切换到candidate状态发起选举。
- times out, new election:进入candidate 状态之后就开始进行选举,但是如果在下一次选举超时到来之前,都还没有选出一个新的leade,那么还会保持在candidate状态重新开始一次新的选举。
- receives votes from majority of servers:当candidate状态的节点,收到了超过半数的节点选票,那么将切换状态成为新的leader。
- discovers current leader or new term:candidate状态的节点,如果收到了来自leader的消息,或者更高任期号的消息,都表示已经有leader了,将切换回到follower状态。
- discovers server with higher term:leader状态下如果收到来自更高任期号的消息,将切换到follower状态。这种情况大多数发生在有网络分区的状态下。
Leader的选举:
- 在进行Leader选举的时候Raft使用的是心跳机制来触发leader选举的,在节点刚开始启动时,初始状态是follower状态。
- 一个follower状态的节点,只要一直收到来自leader或者candidate的正确RPC消息的话,将一直保持在follower状态,而且每一个任期的Leader都会定期发送周期性的心跳请求,如果在这个周期内没有收到Leader的心跳就说明Leader已经宕机了,就会发起新一轮的Leader选举,每次发起新一轮的选举的时候都会把leader的term【任期】进行加一,
- 如果当一个candidate节点在选举超时到来的时候,既没有赢得也没有输掉这次选举
,说明此时有两个candidate打成平手,需要再次进行发起选举,理论上会一直进行进行下去,但是这里进行优化点【选举超时时间都是随机决定的,一般在150~300毫秒之间】,意思就是谁的选举任期时间短就是谁当老大
(二)日志的复制过程:
日志的组成: