# `Raft` 领导选举

![`smart`](RaftLeaderElect01_aa_001_20220511.png)

------------------------------------------------------------------------------
我们首先介绍一个叫做term的概念，它是Raft共识算法将时间划分成的一小段时间。也可以理解为，在Raft共识算法的眼中，时间是一个接一个的term，每个term的大小可能不同。我们用连续递增的数字来标识这些term。

每个节点都存储有一个任期号，在任期初始阶段，必须进行选举，当领导者诞生后，整个Raft集群就会在这个任期剩余时间内提供正常服务。如果没有异常发生，这个任期就会一直持续下去，如果发生异常（比如领导者崩溃或者网络问题），那么当前任期就会结束，新节点就会将前一个任期号加一，然后开始新一轮的选举。

拓扑必须确保，在一个任期内，集群中最多只有一个领导者。

在集群开始时，所有节点都是跟随者。当跟随者在指定时间内没有收到来自领导者或候选者的有效消息时，将发起选举。这个指定的时间被称为选举超时。选举超时是一个随机值（例如，默认值为10秒）。

领导者的有效消息是心跳消息，候选者的有效消息是投票消息。这里引入了两个状态变量，选举超时和心跳时间间隔，心跳时间间隔小于`min(election timeout)`，以避免追随者发起不必要的投票。

假设节点2首先打破选举超时，它将增加其期标识符，成为候选角色，并为自己投票。同时，它将向集群中的其他机器发送投票请求，其中包含其新增加的期标识符。接收到具有大于或等于当前期标识符的投票请求的其他追随者将同意并更新自己的期标识符，并向具有候选角色的节点发送同意消息。

此时，候选角色TiKV节点收到集群中超过一半的TiKV节点同意它是leader，状态变更为leader，立即向所有节点发送心跳消息，然后按照心跳间隔发送心跳消息。

这里，第一次选举已经结束。
