文言-raft协议(三)

1 特别场景-投票环节follower的支撑和回绝

在集群的每一次从头推举过程中,总会有一个节点首要成为candidate,然后向其他节点建议投票央求。这时因为各种状况,follower节点需求依据自身的当时状况挑选是投支撑票仍是回绝票.vote_记载的是给谁投了支撑票

case1 小红(id=1,term=1)作为follower还没有给任何人投票(vote_=0)

  • 小红收到了小蓝(id=3)MsgVote,此时会当即给小蓝回复MsgVoteResp,而且更新自己的vote_为3

case2 小红(id=1,term=1)作为follower现已投了自己支撑票(vote_=1)

  • 这时分除了小红给自己发送MsgVote,小红会回来支撑票,其他人给小红投票都会回来回绝票

case3 小红(id=1,term=1)作为follower给小黄(id=2)投了一个支撑票(vote_=2)

  • 这时分除了小黄给小红发送MsgVote,小红会回来支撑票,其他人给小红投票都会回来回绝票

case4 小红(id=1,term=1)作为follower收到了或人的term=2的MsgVote

  • 上面case1到case3,假定的是投给小红的MsgVote的term都不大于小红自身的term
  • 假定小红收到的MsgVote的term大于自身term,小红也会回来支撑票,一起更新自己的vote_为发送MegVote的人

2 特别场景-candidate被“截胡”

当小红(id=1,term=1)成为candidate后,她发送了MsgVote给其他成员等候回复,但在这时分,小红收到了小蓝(id=3)的MsgApp(要求同步日志的央求),这时分小红的反响:

  • 假定小蓝的MsgApp中的term大于等于1,小红会主动转为follower人物。把小蓝作为leader
  • 假定小蓝的MsgApp的term小于1,小红会疏忽这个央求,持续等候其他成员的回复

3 特别场景-leader的提交日志

case1 外部客户端正常建议一个MsgProp

  • 在《文言-raft协议(一)》中,小红争取到leader人物后,会发送MsgApp向小蓝和小黄同步日志,同步成功后,小红的本地日志如下:

文言-raft协议(三)

  • 这时客户端发送一个新的央求MsgProp(内容为“some data”),小红收到央求后,先把央求放在本地,不提交

文言-raft协议(三)

  • 然后小红给其他同学(小红小蓝)发送同步音讯MsgApp(index=1,logterm=1,commit=1),这儿小红有个变量prs_[1].match = 2,记载当时小红的日志index
  • 假定小红先收到小黄的回复MsgAppResp(index=2),小红会更新prs_[2].match = 2,这时小红会发现三个人中已有两人记载了日志index(2),会把自己的日志状况commit_设置为2,然后给小黄和小蓝发送MsgApp信息(index=2,logterm=1,commit=2)
  • 随后小红收到了小蓝的回复MsgAppResp(index=2),小红会更新prs_[3].match = 2,这时,集群大部分人(本例中是悉数)日志index都等于2,小红自己的commit_也是2,小红不再持续发送央求

4 特别场景-同步日志

文言-raft协议(三)

etcd中的raft结束中,日志的存储分为两部分,一部分是storage(真实耐久化的数据),一部分是unstable(内存中的数据)

  • 虚线左面的数据是耐久化的数据
  • 测验用例中,小红在成为candidate前被手动设置了term为2
  • 当变为candidate时,term会主动加1,因此在unstable部分都变成了3
  • 当变为leader时,会自己追加一个空的entry

5 特别场景-作为follower被同步日志

这儿假定小红变为了follower,接纳到了小黄(leader)的同步日志央求MsgApp

  • 假定小黄发送的msg中,日志索引(index)小于小红自身已提交的索引(committed),阐明小红有一部分小黄不曾具有的日志,这时的处理方式是小红直接回来MsgAppResp,把自己的提交索引(committed)奉告小黄。假定小黄发送的msg,日志索引不小于小红自身已提交的索引,那么会持续下面的查看
  • 先查看小黄msg的index,在小红日志中所属的term(任期),然后跟小黄msg中的logterm比较,不持平小红会回绝小黄的同步日志的央求。持平持续下面的查看
  • 抵触查看,查看小黄msg中带的entries中,每一个entry里的index和term和小红自身的日志是否相同。假定都相同,回来0,假定有不想等的,回来第一个不持平的index
  • 小红依据回来的抵触的index,来判别更新自己的哪部分日志

6 特别场景-作为folloer被同步日志,发现日志不一致

文言-raft协议(三)

  • 小红(follower)的日志中现已有index为1和2的日志了,小黄(leader)发给小红的Entry为(index1,term3),小红在比照时分发现,index1的term在自己日志中term是1,在小黄中,term是3,两者不一样,发生抵触。
  • 发生抵触时分,毕竟的日志更新以leader为主,即小红更新自己的offset为1,用小黄的Entries替换自己的unstable部分