1

我正在用Raft 论文从头学习 Raft ,我无法理解领导者选举过程。我在 5.4.1 中读到,领导者需要在其日志中包含集群的所有已提交条目:

Raft 使用一种更简单的方法,它保证从选举的那一刻起,每个新领导者上都存在之前任期内所有已提交的条目,而无需将这些条目转移给领导者。

Raft uses the voting process to prevent a candidate from winning an election unless its log contains all committed entries.

但后来,据说候选人持有所有提交的条目,如果它至少与大多数其他日志一样最新。确定这个最新的机制是比较最后条目的索引和术语。最后一个条目上具有较高期限的日志将是最新的。

这难道不会导致在没有所有先前提交的条目的情况下选举领导者的情况吗?例如:

在此处输入图像描述

在这种情况下,如果服务器 4 发生故障,服务器 2 可能会成为领导者,因为它有一个比大多数人更大的条目。但它不会在其日志中包含第 2 学期的两个已提交条目。对吗?我误解了一些东西,但我能明白它是什么......

4

1 回答 1

2

问题是,日志最初是如何达到那种状态的?这是不可能的。

所以,它看起来像:

* Server 2 is leader for term 1
* Server 1 is leader for term 2
* Server 2 (perhaps) is leader for term 3
* Server 4 is leader for term 4

但是服务器 2 不可能是第 3 学期的领导者,因为它无法根据日志中的最后一个条目来自第 1 学期的事实获得投票。如果另一台服务器是第 3 学期的领导者,它必须写如果服务器 2 的日志中存在来自 term 3 的条目,则在其日志中记录 term 3 的条目。但是,如果在另一个服务器的日志中还有第 3 学期的另一个条目,则无法选择具有第 2 学期条目的服务器,因为只有其中两个。即使服务器 3 在其日志中有来自第 2 期的条目,它也不可能在那个位置被选举,因为在日志中的更高索引处仍然会有其他三台服务器具有来自第 2 期的条目。

So, I think you need to describe how the cluster got in a state in which server 2 could have won an election that would put an entry from term 3 in its log at index 4. It's important to note that the election protocol is not just关于术语,它也与索引有关。如果两个服务器的最后一个条目具有相同的术语,则具有较大最后索引的服务器被认为是最新的。

于 2016-05-17T20:42:40.223 回答