动画理解: http://thesecretlivesofdata.com/raft/
博客理解:
https://www.cnblogs.com/xybaby/p/10124083.html
注:
- 每个节点都有三种状态, follower, candidate, leader
- 初始状态每个节点都是follower
- 每个follower在的那个term中只能投一次票
过程:
初始状态
- 所有节点等待leader发请求,由于没有leader,所以某些节点会率先超时并进入candidate状态.
- candidate节点向其他follow节点请求投票,投票完后获得majority票数的candidate成为leader并开启第一个term(即term数为1)
同步数据过程
- client向leader发送更新数据请求.
- leader首先将这个更新操作存进log, 然后通过log replication将这个操作同步广播给follower的log.
- 各follower会返回数据包表示已同步.
- leader在收到majority数量的包后会进行数据更新(此时才真正影响了该leader节点),并广播通知follower可以更改数据了(此时才真正影响了各个follower节点)
重新选举的情况
- 某个follower停止接受心跳且成为了candidate, 那么该term结束
- 平票
投票过程, 在开启投票的时候若某节点成为了candidate,就会发起投票请求,然后等待其他节点回复,这里面可能存在三种结果
- 收到majority投票成为leader, 并广播给其他节点避免出发新的选举
- 被告知别人已经当选, 那么自行切换到follower
- 没收到majorrity也没被告知有人当选, 则保持candidate状态等待超时时间过后重新发起选举
follower如何决定是否给某个选举请求投票:
- 在任一任期内,单个节点最多只能投一票
- 候选人知道的信息不能比自己的少(通过log replication和safety)
- first-come-first-served 先来先得