1

场景 1:假设有一个 5 节点集群,其中 3 个节点已经失效。服务A(leader), B, C中有3个节点

A 向 B、C 复制了一个日志条目,收到成功的响应,提交它,应用它,响应客户端,然后死亡。现在,只有两个节点 B、C 有一些未应用的日志条目。现在,如果 D 出现,并且 B 成为新的领导者,那么未应用的条目会发生什么?它们也会被提交/应用吗?

场景二: 5个节点集群,3个刚下线,A仍然是leader,B在线

A 向 B 复制了一个条目,但无法提交,然后 A 被杀死,C、D 出现(所以 B、C、D 都出现了)。复制到 B 的条目会怎样?他们会被承诺/应用吗?

4

1 回答 1

1

请记住,正在提交的条目和正在应用的条目之间是有区别的。条目可以提交但尚未应用,但条目不能应用且未提交。一旦提交了一个条目(在领导者当前任期内复制到大部分集群),它就保证最终应用于所有节点。因此,下一个领导者必须应用它,否则如果您使用 Raft 管理复制的状态机,可能会导致状态不一致。The election protocol guarantees that the next leader elected will have the committed entries (so either B or C, but not D), and the new leader's first action will be to replicate those entries to another node (D), determine they're committed ,

在第二种情况下,如果 B 获得额外的条目,那么它将最终提交并应用它们。这就是为什么会话是保证客户端线性化的关键组成部分。当一个操作由于未能达到法定人数而失败时,总是有可能稍后实际提交更改。应该使用会话来保证更改只应用于状态机一次,无论它提交多少次(幂等性)。有关会话的更多信息,请参阅 Raft 论文。

于 2017-12-22T00:44:05.473 回答