消息在 RAFT 上被丢弃了吗?

Are messages dropped on RAFT?

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

因此,考虑一个由 2 个节点组成的集群,1 个 Leader,1 个 Follower。

分区之前,那里写了X条消息,复制成功,然后假设网络问题导致分区,所以有2个分区,A(ex-leader)和B(ex-follower),现在是两位领导者(接收写入):

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,有什么具体的方法吗?还是取决于客户端的实现? (例如:消息时间戳...)

当领导者被选出并成功写入该任期的初始日志条目时,领导者日志将被视为 "the log"。但是,在您的情况下,起始前提不正确。在一个由 2 个节点组成的集群中,一个节点需要 2 票才能成为领导者,而不是 1 票。因此给定一个网络分区,两个节点都不会成为领导者。