raft选举与日志

选举

  1. 初始时,没有leader,所有节点都是follower,每个follower都有随机生成的选举超时时间。A超时时间到时,角色会从follower变为candidate,将自己的term加1后,给其余节点发送voteRpc,rpc消息中带有logIndex、logTerm。
  2. 其余follower收到rpc后,会拿rpc的Term跟本地的term比较,如果小于本地的Term,不投票并带回本地的Term;如果等于本地的Term,则不投票;如果大于本地的Term,则更新本地Term并且投票。(不会重复投票,follower投票后,在没有新的Term的情况下,不会给别的节点投票)
  3. 如果超过半数票,则candidate变更为leader;否则等待下次选举。
  4. A成为leader后,会发心跳给follower以确保自己的地位。follower收到心跳后,会重置选举超时时间。(心跳间隔应远小于选举超时时间,否则系统就难以达到稳态)

日志

  1. A成为Leader后,会跟各个follower协商日志。其中leader,维护了commitIndex,即已经提交的日志的index。leader会维护各个follower的matchIndex和lastIndex,协商前,将matchIndex设置为0,lastIndex设置为commitIndex,然后逆序去跟follower匹配,即lastIndex–逐个去跟follower比较,当匹配上时,将matchIndex设置为lastIndex,然后从lastIndex开始同步日志。稳态时,matchIndex == commitIndex,lastIndex==leader的下一条日志条目。
  2. 客户端写数据时,会先写leader,leader将日志同步到follower,具体流程如下
client leader followerA followerB req write log write log write log rsp rsp 超半数 持久化log 持久化 log 持久化 log rsp rsp 超半数 超半数且半数的term跟leader term一样才推进 推进commitIndex rsp client leader followerA followerB

注意

  • 拥有最新数据的节点,选举时可能成为不了Leader,因为最新数据可能没有超过半数。比如A:3;B:2;C:2,虽然A上有最新数据,但是没有过半。
  • 即使数据过半,也有可能被覆盖。所以commitIndex推进的条件为:超半数且半数的term跟leader term一样才推进
    场景如下:
A1,2N1,2Y1,2,41,2,4N1,3
B1,21,21,21,21,3
C1111,21,3
D11111,3
E1Y1,3N1,31,3Y1,3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值