Raft 领导人选举算法一票任期?

Raft leader election algorithm one vote for term?

我对Raft算法的leader选举算法理解有疑问。在论文中,我读到每个节点 con 每个任期只投一票。我的疑惑是因为每个节点的term可以不一样,指的是请求投票的节点term还是给节点的节点term?谢谢

在一个 raft 集群中,让我们有一个想要成为领导者的节点并将其称为候选者。所有其他节点,包括当前领导者,我们将简单地称为对等节点。

让我们看看当同行从候选人那里收到 RequestVoteRPC 时会发生什么。

如果对等方的任期大于请求中收到的任期(候选人任期),则投票将被拒绝。响应将包含对等方的任期,因此候选人将转换为跟随者状态并在收到响应后立即更新其任期。这将确保请求投票的节点的任期与投票的节点的任期相同。

否则同行需要决定做什么。

如果对等方的任期小于请求中收到的任期(候选人任期),则此对等方将转换为追随者并将其当前任期更新为从候选人处收到的任期,然后再继续决定。这将确保请求投票的节点的任期与投票的节点的任期相同。

有可能多个节点转换为候选状态,而我们正在观察的节点已经投票给候选人。在那种情况下,votedFor 变量将不会是 null 并且我们不能将投票授予第二个(或任何其他)候选人。 但我们在这里也需要小心,因为我们可能会收到重复的 RequestVoteRPC 请求(来自同一候选人),因此我们需要检查 votedFor 是否等于我们请求的候选人 ID重新观察。如果votedFor等于当前候选人id,我们将授予投票。

总而言之,如果 votedFor 变量为 null 或等于候选人 ID,我们将授予投票权。

我特意排除了示例中的条件,即为了授予投票,候选人日志至少需要是最新的,但不要忘记这也很重要。

每个节点可以在一个 term 期间授予 one 投票,并且由于 terms 将同步在通信过程中,投票的节点的任期将与请求投票的任期相同。