筏子:承诺进入可能会丢失?

kin*_*luo 9 raft

在所有关注者更新提交索引之前,领导者崩溃会发生什么?

例如,节点A,B,C形成集群:

  • 只有A和B活着,A是领导者

  • A将一个条目(比如说它的entry1)复制到B并从B获得成功的结果

  • 提交entry1,并在向B发送心跳消息之前崩溃(这会导致B更新其提交索引)

  • C现在在线

我的问题是:

  • C会被选为新领导人吗?如果是这样,那么entry1会丢失吗?此外,如果A重新加入,其数据将与其他数据不一致?

我知道筏子规格说:

Raft使用一种更简单的方法,它保证从选举之时起,每个新领导者都会出现之前条款中的所有已提交条目,而无需将这些条目转移给领导者.

但是这里的entry1可能不被视为已提交的条目?因为B没有得到老领导的确认(来自领导者的心跳).那么C有机会成为新的领导者吗?

  • 如果B成为新的领导者,那么它应该如何处理entry1?

kuu*_*ujo 10

重要的是要注意,一旦条目存储在集群中的大多数服务器上,它就被认为是提交的(技术上有一些警告,但对于这个对话我们应该假设是这种情况)而不是当节点收到提交消息时来自领导者.如果需要提交消息来考虑提交的条目,则每次提交都需要两次往返 - 一次用于复制,一次用于承诺 - 并且必须保持提交索引.

相反,在您的场景中,当A崩溃和C恢复时,Raft选举算法将确保C不能被选为领导者,因此C不能删除已提交的条目.B由于它具有最新的日志,因此只能被选为领导者.如果C试图获得当选的领导者,那么它将只收到拒绝的投票,B因为B日志的更新是比最新C的(它有承诺的条目).因此,您在实践中将看到的B最终将被选出并将提交其前一个学期的所有条目,此时该条目仍将被提交.即使B当时崩溃并且A要恢复,A仍然会有更新的日志C,因此它将再次被选为领导者.

(而不是如果)B成为领导者时,它将首先确保来自先前术语的条目在从其当前术语提交任何条目之前存储在大多数服务器上.通常,这是通过在新领导者任期开始时提交无操作条目来完成的.从本质上讲,新的领导者提交了一个no-op条目,一旦该条目存储在大多数服务器上,它就会增加其提交索引并将新的提交索引发送给所有关注者.因此,该条目不会丢失.新领导人将确保承诺.

在Raft论文和解释中都描述了考虑存储在大多数集群上的条目的警告.