RAFT:提交条目的术语条件

van*_*ies 2 replication distributed-system consensus raft

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

kuu*_*ujo 5

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

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

这在实践中意味着当领导者当选时,它通常会提交一个无操作条目来强制在当前任期内进行提交。commitIndex直到无操作条目存储在大多数服务器上后,领导者才会增加其值。