6.4.1 领导者选举 Raft 算法中,节点有三种角色,并且可以互相转换: 领导者(Leader):接收 client(客户端)的所有请求,Raft 算法中所有的操作以 Leader 为准。Leader 平常的工作包括 3 个部分:处理写请求、管理日志复制、不断发送心跳信息通知其他节点”我是 Leader,我还活者,你们现在不要发起新的选举“; Follower(跟随者):相当于普通群众,被动接收和处理来自 Leader 的消息。当 Leader 心跳超时时,就主动站出来,变成“候选人”; Candidate(候选人):用于选举出一个新的 Leader。
Raft 算法中,节点有三种角色,并且可以互相转换:
Raft 将整个系统的时间划分为一个个独立的阶段,
简单来说,任期标明了 Leader 的服役阶段。
:::center
图 6-15 Raft term 与成员状态变更
:::
每个 Follower 在本地维持一个选举计时器,选举计时器到期前,如果没有收到 Leader 的日志或者心跳,那么就开始发起选举。Follower 向所有的节点发送投票消息(RequestVote RPC)结构如下:
{ "term": 5, "candidateId": "candidate-123", "lastLogIndex": 10, "lastLogTerm": 4 }
图 6-16 概述了 Raft 集群 Leader 选举过程。会发生下面的情况:
:::center
图 6-16 Raft 选举过程
:::
Raft 算法中还有个很重要的概念 —— term,Raft 将时间分割为不同长度,称为 Leader 的 term(任期)。每个 term 由单调递增的数字(任期编号)标识。任期一般包含两阶段:第一阶段是选举阶段,第二阶段为已选举出领导者的阶段。但任期也可能只包含选举阶段(并没有成功选举出 Leader )。如图 6-15 所示,term 1 开始一次新选举,这次选举成功并开始正常操作,term 2 同样如此,但 term 3 选举失败,进入 term 4。
term 在 Raft 中起到了逻辑时钟的作用,可用于保证在某些极端的情况下最终只有一个 Leader,例如下面两种情况: