raft要点总结
需要维护的内容:
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冲掉