2

我一直在阅读有关 Raft 的几个文档,并且我得到了关于提交的相互矛盾的信息。我知道一个条目只有在已知存储在大多数服务器中时才能提交,但是还有其他条件吗?我已经读过,当前术语的条目也必须存储在每个服务器中,但其他一些文档对此只字未提。有什么帮助吗?

4

1 回答 1

5

从技术上讲,存储在大多数服务器上的条目被提交是不正确的。确实,一旦条目存储在大多数服务器上,领导者就会确定该条目已提交,但仅在其当前期限内。来自另一个任期的条目可以存储在大多数服务器上,但永远不会被提交,并且实际上稍后会被另一个领导者覆盖。这在 Raft 论文中的图 8 中显示。

这就是为什么领导者必须确保提交当前任期的条目,然后才能考虑提交之前任期的任何(附加)条目。一旦选出领导者,该领导者就有可能将先前任期的条目复制到大多数节点而无需提交它们。如果该领导者随后崩溃,则可以选择另一个具有后期条目的领导者并覆盖存储在大多数集群上的条目。这就是图 8 中所示的内容,这也是提交的技术定义的原因:领导者当前任期内的条目一旦存储在集群的大多数成员上就被提交,并且一旦领导者任期内的条目被全部提交领导者日志中先前条款的条目是隐式提交的。

What this means in practice is when a leader is elected, it typically commits a no-op entry to force a commit in its current term. commitIndex在无操作条目存储在大多数服务器上之前,领导者不会增加它。

于 2016-05-13T16:57:38.177 回答