Raft实现报告(19)
客户端的交互
本篇将会介绍客户端如何与Raft交互,包括客户端如何找到集群的leader,以及Raft如何支持线性化语义。这些问题适用于所有基于共识的系统,Raft的解决方案与其他系统类似。
Raft的客户端将所有请求发送给leader。当客户端第一次启动时,他会连接到随机选择的服务器。如果客户端的首选不是leader,则该服务器将拒绝客户端的请求并提供有关它所听到的最新的leader的信息(AppendEntries请求包括leader的网络地址)。如果leader崩溃,客户端请求会超时;客户端然后使用随机选择的服务器重试。
我们对Raft的目标是实现可线性化的语义。然而,到目前为止,Raft可以多次执行命令:例如,如果leader在提交日志条目后但在响应客户端之前崩溃,则客户端将使用新的leader重试命令,导致他被执行了多几秒的时间。解决方案是让客户为每一个命令分配唯一的序列号。然后,状态机跟踪为每个客户端处理的最新序列号以及相关响应。如果他收到一个序列号已经被执行过的命令,他会立即响应而不重新执行一次。