0

我正在阅读有关 raft 的信息,但在网络分区后达成共识时我有点困惑。

因此,考虑一个包含 2 个节点、1 个领导者、1 个跟随者的集群。

在分区之前,那里有X条消息写入,成功复制,然后想象网络问题导致分区,所以有2个分区,A(前领导)和B(前跟随),现在都是领导(接收写入):

before partition | Messages  |x| Partition   | Messages  
Leader           | 0 1 2 3 4 |x| Partition A | 5  6  7  8  9
Follower         | 0 1 2 3 4 |x| Partition B | 5' 6' 7' 8' 9'

在分区事件之后,我们已经弄清楚了,会发生什么?

a) 我们选出 1 个新的领导者并考虑它的日志?(删除新追随者的消息?例如:

0 1 2 3 4 5 6 7 8 9 (total of 10 messages, 5 dropped)

甚至:

0 1 2 3 4 5' 6' 7' 8' 9' (total of 10 messages, 5 dropped)

(取决于哪个节点成为领导者)

b) 我们选出一个新的领导者,并找到一种方法来就所有信息达成共识?

0 1 2 3 4 5 5' 6 6' 7 7' 8 8' 9 9' (total of 15 messages, 0 dropped)

如果是b,有什么具体的方法吗?还是取决于客户端的实现?(例如:消息时间戳...)

4

1 回答 1

2

The leaders log is taken to be "the log" when the leader is elected and has successfully written its initial log entry for the term. 但是,在您的情况下,起始前提不正确。在一个有 2 个节点的集群中,一个节点需要 2 个投票才能成为领导者,而不是 1 个。因此,给定一个网络分区,任何一个节点都不会成为领导者。

于 2019-04-07T17:17:52.387 回答