美文网首页
raft要点总结

raft要点总结

作者: silencehere | 来源:发表于2019-01-24 20:55 被阅读0次

    需要维护的内容:

    1. 所有server持久化自己的current term 

    2. leader内存维护所有follower的nextIndex,

    3. 持久化committed和uncommitted的log

    4 一个server一个term只能投一票,要持久化防止重启后重复投票

    5 设election timeout为T, 随机投票间隔为[T, 2T],T要远大于server之间通信时间,

    log同步流程:

    client->leader record log->forward log to all followers to record in parallel->receive response from servers that exceed half->leader commit and apply into sm locally->leader returned result to client ->forward  commit command to all followers in parallel -> retry forward log and commit to remained servers

    约束1 AppendEntries Consistency Check

    1) leader 给follower发送AppendEntries rpc时,除了携带log 新entry(index, term)外,还需要新entry的前一个entry(index, term)

    2)follower接收时比较本地entry是否匹配发送来的前一entry(index, term),相同则接收new entry,不同则拒绝

    推导1:

    1.不同server上只要某条entry的index和term相同,则这条entry完全相同, 这条entry所有之前的entry也都完全相同

    2. 如果某条entry已被committed,则其之前所有的entries也一定已被committed:

    约束2 new election rule

    1) 发起RequestVote rpc时,要携带最近的一条entry,接收方将其与自身最后的entry对比,对比规则是先比term,term相同时再比index,如果接收方的entry比发送方的新,则拒绝投票

    推导2:

    1  该规则为了保证leader日志永不被覆盖,集群中只要有entry被committed新leader必然包含该条entry,只有leader中的log才有权被commit,所有server的log entry将最终与leader保持一致

    约束3  new commit rule

    1) leader 并不是将log发送到过半server就认为提交,因为此时的leader可能发送的是旧term的log,即使过半,也不发起commit,而是必须将至少一条current term的log发送到过半server后才可发起commit

    推导3

    1  该规则保证leader如果同步成功的是旧term的log, 此时如果commit然后leader宕掉,刚同步成功的log可能被新leader中的旧term冲掉

    相关文章

      网友评论

          本文标题:raft要点总结

          本文链接:https://www.haomeiwen.com/subject/girkgftx.html