Raft算法要求由领导者处理客户端请求,如果客户端不知道领导者是谁,那么它会和任意一台服务器通信;如果通信的节点不是领导者,那么它会告诉领导者是谁。
领导者将命令写入本地并复制、提交到状态机之后,才做出相应。
如果领导者收到请求后宕机,则会导致请求超时,客户端会重新发出请求到其他服务器上,最终定位到新的领导者,用新的领导者处理请求,直到命令被执行。
这里有一个问题和multi-paxos类似,就是有一个命令可能被执行两次——领导者可能在执行命令之后在响应客户端之前宕机,该命令已经执行成功,只是回复客户端的过程中宕机,客户端没有收到命令执行的回复,会寻址下一个领导者处理请求,同一个命令会被执行两次,这是不可接受的。
解决办法是让客户端发送给领导者每个请求都附加上一个唯一id,领导者将唯一id写到日志记录中。在领导者接受请求之前,先检查其日志中是否已经具有该请求的id。如果请求id已在日志中,说明这是重复的请求,此时忽略新的命令,直接返回已执行的命令的响应。
每个命令只执行一次,这是实现线性一致性的关键因素。
文章讨论了Raft算法中如何通过领导者角色处理客户端请求,避免请求重复执行的问题,关键在于使用唯一ID保证命令的线性一致性。当领导者宕机时,通过检查日志避免执行已处理过的请求。

被折叠的 条评论
为什么被折叠?



