当领导者获得日志条目时,它会将其复制到群集中的其他服务器。然后它提交条目并告诉其他服务器也提交。这里似乎有两种情况:
1)领导者提交条目,然后告诉其他服务器也提交
2)领导者告诉每个人提交,然后它也会提交。
在#1中,如果领导者在告诉其他人提交之前崩溃,那么即使没有提交,任何成为新领导者的人都会使用该条目吗?如果没有,那么我们有一些与最新条目不同步的日志。 (旧的领导者会应用它,而另一个则不会。)如果是这样,那么它如何知道可以提交呢?
在#2中,如果领导者在提交之前崩溃,那么所有其他节点在提交后崩溃,然后在选举中,旧的领导者再次成为新的领导者,然后其他服务器提交了条目,新领导人没有。在这种情况下会发生什么?
答案 0 :(得分:3)
注意存储在服务器上的条目,正在提交的条目和正在应用的条目之间的区别非常重要。承诺实际上是一个理论概念。在大多数情况下,服务器不会执行任何操作来提交条目。它的存在是因为它存储在大多数服务器上,因此保证不会丢失。条目可以在提交时应用,也可以在以后的某个时间应用,只要服务器按顺序应用它们。
由于分布式系统的性质,所有服务器不可能同时提交条目。相反,当领导者将其应用到其状态机时,Raft仅保证大多数服务器上的条目持久。大多数Raft实现采用方法#1,以允许领导者将命令应用于其状态机并在其他服务器必须将其应用于其状态机之前响应客户端。
如果领导者应用命令然后失败,将会发生什么:
* We know that the command has been stored on a majority of servers therefore...
* Raft's election algorithm guarantees that the next server that's elected has that entry
* When the next leader is elected, it will append a no-op entry to its log and commit it
* Once the no-op entry is committed, the leader will increase its commitIndex to that of the no-op entry and thereby commit all entries remaining from the previous term (including the original leader's last commit)
* On the next heartbeat, the leader will send the index of the no-op as the `commitIndex`
* Remaining followers will be replicated entries up to the leader's no-op and commit entries from the previous leader's term
这有意义吗?
所以,重要的是要注意,即使领导者没有机会通知粉丝已经提交了一个条目,Raft保证下一个领导者将拥有第一个领导者的承诺条目,并且该领导者最终将将这些条目复制到尚未拥有它们的关注者,并且提交索引将继续超出前一个领导者的最后一个索引。
参考文献: 有关提交先前条款的条目的信息,请参阅筏纸(https://ramcloud.atlassian.net/wiki/download/attachments/6586375/raft.pdf)的第5.4.2节
答案 1 :(得分:0)
回答#1。 是的,新的领导者将始终拥有承诺的价值,因为“选举限制”被用于确保领导者完整性,这定义了 “如果一个条目在一个术语中被提交,那么所有更高编号的术语的领导者的日志肯定会有该条目”。