Raft梳理
此文第一部分是对 schedule 中 Question 的自己的解答,第二部分是自己对 Raft 的梳理,如有不对,欢迎指正!
Questions
Lecture 5
Suppose we have the scenario shown in the Raft paper's Figure 7: a cluster of seven servers, with the log contents shown. The first server crashes (the one at the top of the figure), and cannot be contacted. A leader election ensues. For each of the servers marked (a), (d), and (f), could that server be elected? If yes, which servers would vote for it? If no, what specific Raft mechanism(s) would prevent it from being elected?
假设 Raft论文图7的场景:一个由7个服务器组成的集群,其中显示了日志内容。第一个服务器崩溃了(图中最上面的那个),且网络无法链接,紧接着发生 leader 选举。对于编号为(a)、(d)和(f)的服务器,它们之一是否可以当选?如果是,哪些服务器会投票?如果没有,具体有哪些机制会阻止它当选?
这个问题问的是 选举限制。在 5.4.1 Election restriction 中有提及,即
Raft 通过比较日志中最后一个条目的索引和任期来确定两个日志中哪一个是最新的。如果日志的最后一个条目具有不同的任期,那么后面更大任期的日志是最新的。如果日志以相同的任期结束,那么较长的日志是最新的。
同时还要考虑 votedFor 的话,用程序员的代码语言翻译过来就是
func (rf *raft) canVote(args *RequestVoteArgs) bool {
// If votedFor is null or candidateId, and CANDIDATE’s log is
// at least as up-to-date as receiver’s log, grant vote (§5.2, §5.4)
votedFor := rf.votedFor
if votedFor == votedForNil || votedFor == args.CandidateId {
lastLog, lastIndex := rf.logs.LastLog()
if lastLog.Term < args.LastLogTerm ||
(lastLog.Term == args.LastLogTerm && lastIndex