Raft究竟做什么?

众所周知,一个可靠的分布式系统需要冗余。因为一个人是很容易出错的,这时候需要一群人来帮忙纠错。这就是分布式系统的可靠性。当一个机器出现故障或者错误,那么其他机器需要帮助这个机器进行恢复。那么阅读实验文档,Raft也干这么一件事。Raft是一个用于分布式系统的状态机协议,这个协议维护一个数据的完整副本,也就是说每一个机器,都拥有一组数据或者叫状态。Raft将客户端请求组织成一个序列,称为日志,并确保所有副本服务器看到相同的日志。每个副本按日志顺序执行客户端请求,将其应用于服务状态的本地副本。由于所有实时副本都看到相同的日志内容,它们都以相同的顺序执行相同的请求,因此继续具有相同的服务状态。如果服务器出现故障但后来恢复,Raft会将其日志更新到最新状态。具体来说,就是Raft负责维护每一个副本服务器所拥有的“副本”是一致的。

6.824实验要求

  • A:领导人选举:在众多个peer中选举出一个peer,这个peer作为领导者维护日志。当旧的领导者出现问题了,就换新的领导者。
  • B:日志记录:当一个新的请求来的时候,领导者和追随者需要记录日志信息。
  • C:持久状态:Raft重新启动服务的时候,要判断怎么重新启动最好。
  • D:对数压实:因为需要传递日志,传递一个完整的日志是很困难的,这时候需要对日志进行压缩。

Intro

Raft具有下面的性质:

  • 更强大的leader:所有访问Raft的请求都是由leader转发给其他成员的
  • leader选举:使用随机的时钟来选择领导人
  • 成员更改:保证在配置文件更改的时候,Raft仍然正常运行

共识算法

对于一个分布式系统,若干个机器计算相同的状态的相同副本,当有一个服务器掉线了,服务也可以继续进行。复制状态机使用差错检测的方法。当客户访问分布式系统,提交一个新的请求的时候,首先先访问leader,leader记录客户的请求,生成日志,并把日志复制给其他的服务器中。最后更新状态,把最后的消息传递给客户端。

首先一个复制状态机需要推选出一个leader,然后存储在leader崩溃后的信息。然后leader需要对日志进行复制,日志本身就是一组命令的记录。然后状态机根据日志的记录按照顺序进行执行(状态的维护),每个服务器的每个日志都保存了相同命令。尽管每个服务器的状态机是不一致的,但是由于日志的存在,状态是一致的。

维护这个日志的一致性是共识算法的核心,共识模块从客户端获取信息然后加入进自己的日志中。然后定时的和其他服务器上的共识模块进行通信。只要命令被合理的复制保存了,那么每个服务器的状态机都会更改状态,然后输出会传递回客户端。执行的过程必须安全,可靠和高效。

Raft的共识算法

首先先选举出一个leader,然后给leader有一个维护日志的责任。所有的客户端请求都和leader进行交互,然后leader把复制log的请求给其他服务器,并且通知其他服务器执行状态机更新的合适时间。一个leader可能会断线,那么新的leader会被选举出来。

一个Raft集群会包括若干个服务器,一般来说是5个,它能让系统容忍两次失败。每个服务器都会有三个状态:leader(领导者),follower(追随者)和candidate(参与者)。follower什么都不干,只负责接受leader来的数据并且回应。candidate负责选举一个新的leader。leader拥有对日志完全的管理权限。leader接受客户的请求,然后把客户的请求复制给其他的服务器。然后告知其他服务器什么时候可以更新状态机(执行客户的操作)。指定一个leader会极大程度地减轻设计的难度。因为leader可以自己决定把日志写到哪个服务器上。leader可以掉线,如果lLeader掉线了,就重新选一个就好了。

Raft将时间分解成下面的若干个terms,这个terms有各种各样的长度,每个terms分成两个部分,第一个部分是选举,第二个部分是处理。每次terms结束了之后就重新进行选举,如果在一个terms中没能选举出一个合适的leader,那么这个terms提前终止

leader选举(lab2A)