根据RAFT论文,它提到除领导服务器外,每个服务器都有自己的日志条目和状态机,每个状态机处理来自日志的相同命令序列。
在这种情况下,我的查询很少。
[1]如果1个客户端向领导服务器发出请求,是否意味着所有跟随服务器都处理请求并产生输出?但是谁将输出信息反馈给客户呢?
[2]如果仅第一个问题的答案是领导者,则将输出传达回客户端,那么多个跟随者在从日志条目中计算/处理其状态机中相同输入的用途是什么。因为已经知道RAFT确保所有日志条目必须包含相同顺序的相同命令。仅领导者就足以处理其状态机中的日志中的条目并将其返回给客户端吗?
[3]另外,如果有多个客户端向服务器发出相同的请求,是仅领导者将输出传达给所有客户端,还是跟随者出现在这里?
答案 0 :(得分:1)
第一个问题的答案确实是领导者的状态机输出已返回给客户端。
从技术上讲,使用基本的Raft协议,跟随者没有理由拥有立即将条目应用于其状态机。确实,追随者通常直到领导者已经对客户做出回应后才知道条目的承诺。追随者向其状态机应用命令的主要原因仅仅是为了跟上领导者。如果领导者崩溃,则跟随者将被选为领导者,并且需要接管服务于客户的请求。一旦选出,新的领导者将必须将所有未应用的命令应用到其状态机,然后才能开始为客户端请求提供服务。在追随者上执行命令后,将其应用于提交者可以减少更换领导者的成本,并且由于追随者不能满足客户的请求,因此在追随者上应用命令的成本仍然较低。
在跟随者上应用命令是另一个原因,而您的第三个问题即将揭晓。只有领导者曾经响应客户的 write 请求,但是跟随者却可以通过宽松的一致性保证(顺序一致性)来响应 read 请求。为此,领导者将完成命令的写索引与输出一起返回。然后,客户端可以查询关注者,一旦关注者的状态机至少达到了该客户最后一次写入的索引(由客户端提供),那么关注者就可以查询状态机并返回输出。这使客户可以在领导者和关注者之间分散查询,这可能是实用系统确保关注者的状态机试图跟上领导者状态的最佳原因。