如果 term < currentTerm 返回 false(5.1 节)
如果 votedFor 为空或者与 candidateId 相同,并且候选人的日志和自己的日志一样新,
则给该候选人投票(5.2 节 和 5.4 节)
表-2-iii
服务器需要遵守的规则:
所有服务器:
如果 commitIndex > lastApplied,lastApplied 自增,将 log[lastApplied]
应用到状态机(5.3 节)
如果 RPC 的请求或者响应中包含一个 term T 大于 currentTerm,则 currentTerm 赋值
为 T,并切换状态为追随者(Follower)(5.1 节)
追随者(followers): 5.2 节
响应来自候选人和领导人的 RPC
如果在超过选取领导人时间之前没有收到来自当前领导人的 AppendEntries RPC 或者
没有收到候选人的投票请求,则自己转换状态为候选人
候选人:5.2 节
转变为选举人之后开始选举:
currentTerm 自增
给自己投票
重置选举计时器
向其他服务器发送 RequestVote RPC
如果收到了来自大多数服务器的投票:成为领导人
如果收到了来自新领导人的 AppendEntries RPC(heartbeat):转换状态为追随者
如果选举超时:开始新一轮的选举
领导人:
一旦成为领导人:向其他所有服务器发送空的 AppendEntries RPC(heartbeat);在
空闲时间重复发送以防止选举超时(5.2 节)
如果收到来自客户端的请求:向本地日志增加条目,在该条目应用到状态机后响应客户端
(5.3 节)
对 于 一 个 追 随 者 来 说 , 如 果 上 一 次 收 到 的 日 志 索 引 大 于 将 要 收 到 的 日 志 索 引
(nextIndex):通过 AppendEntries RPC 将 nextIndex 之后的所有日志条目发送出去
如果发送成功:将该追随者的 nextIndex 和 matchIndex 更新
如果由于日志不一致导致 AppendEntries RPC 失败:nextIndex 递减并且重新发送
(5.3 节)
如果存在一个满足 N > commitIndex 和 matchIndex[i] >= N 并且 log[N].term
== currentTerm 的 N,则将 commitIndex 赋值为 N
表-2-iv
表-2:Ra 一致性算法的总结(不包括成员变化 membership changes 和日志压缩 log compac!on)