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