服务器如何在 RAFT 中与客户端通信?



根据RAFT论文,它提到除了领导者服务器之外,每个服务器都有自己的日志条目及其状态机,每个状态机处理日志中的相同命令序列。

我对这种情况几乎没有疑问。

[1] 如果 1 个客户端向领导服务器发出一些请求,则意味着所有从属服务器都处理请求并生成输出?但是谁通过输出与客户端通信?

[2] 如果第一个问题的答案只是领导者将输出传达回客户端,那么多个追随者从日志条目计算/处理其状态机中的相同输入有什么用。因为众所周知,RAFT 确保所有日志条目必须以相同的顺序包含相同的命令。仅领导者在其状态机中处理日志中的条目并将其返回给客户端还不够吗?

[3] 此外,如果有多个客户端向服务器发出相同的请求,是只有领导者将输出传达给所有客户端,还是跟随者在这里出现?

  1. 第一个问题的答案确实是领导者的状态机输出返回给客户端。

  2. 从技术上讲,使用基本的 Raft 协议,追随者没有理由必须立即将条目应用于他们的状态机。事实上,追随者通常直到领导者已经回复客户之后才知道条目的承诺。追随者将命令应用于其状态机的主要原因只是为了跟上领导者的步伐。如果领导者崩溃,追随者将被选为领导者,并且需要接管服务客户端请求。当选后,新领导者必须将所有未应用的命令应用于其状态机,然后才能开始为客户端请求提供服务。在提交时对追随者应用命令可以降低领导者更改的成本,并且无论如何,在追随者上应用命令的成本都很低,因为它们不为客户端请求提供服务。

  3. 对关注者应用命令还有另一个原因,你的第三个问题几乎发现了它。只有领导者会响应客户端写入请求,但追随者可以使用宽松的一致性保证(顺序一致性(来响应读取请求。为此,领导者返回已完成命令的写入索引以及输出。然后,客户端可以查询追随者,一旦追随者的状态机至少达到客户端上次写入的索引(由客户端提供(,追随者就可以查询状态机并返回输出。这允许客户端在领导者和追随者之间传播查询,这可能是实用系统确保追随者的状态机试图跟上领导者状态的最佳原因。

最新更新