一、复制状态机

复制状态机(Replicated state machine)的概念就是,相同的初始状态 + 相同的输入 = 相同的结束状态。也就意味在多节点集群中,从相同的初始状态开始,执行相同的一串命令,产生相同的最终状态。

简单说说:Raft一致性共识算法_RPC

 

在 raft 中,leader将客户端请求封装成一个一个 log entry 中,将这些 log 发送到 follow 节点,然后大多数的节点按照同样的顺序应用 log entry 中的 command,依据复制状态机的理论,大家最后的状态是会一致的。在分布式场景中,各个节点就是依靠共识算法,保证命令序列的一致,从而始终保持它们的状态一致,从而实现高可用性。

论文提及raft算法的特性有以下几点:

  • 安全性保证(绝对不会返回一个错误的结果):在非拜占庭错误情况下,包括网络延迟、分区、丢 包、冗余和乱序等错误都可以保证正确。(这里的拜占庭错误指的是节点的本身就不可靠,变成集群中的恶意节点,它为了阻挠真实信息的传递以及有效一致的达成,会向各个节点发送前后不一致的信息)
  • 可用性:集群中只要有大多数的机器可运行并且能够相互通信、和客户端通信,就可以保证可用。 因此,一个典型的包含 5 个节点的集群可以容忍两个节点的失败。服务器被停止就认为是失败。他们当有稳定的存储的时候可以从状态中恢复回来并重新加入集群。
  • 不依赖时序来保证一致性:物理时钟错误或者极端的消息延迟只有在最坏情况下才会导致可用性问题。
  • 通常情况下,一条指令可以尽可能快的在集群中大多数节点响应一轮远程过程调用时完成。小部分 比较慢的节点不会影响系统整体的性能。 

 

二、状态变化

在任意时刻,每个服务器节点都只处于 leader,follower或candidate这三个状态之一。

  • leader:领导者,在通常情况下,系统中只有一个领导人并且其他的节点全部都是跟随者。
  • follow:跟随者,他们不会发送任何请求,只是简单的响应来自领导者或者候选人的请求。
  • candidate:选举者,当集群没有领导者时,跟随者会转变成 candidate

简单说说:Raft一致性共识算法_服务器_02

 

starts up:集群启动时

time out, start election:follow 在没有收到 leader 心跳后开始选举变成选举者 candidate;

time out,new election:在当前选举中没有出现 leader,此轮次超时后进行下一轮选举

dicocers current leader or new term:当发现已经选出新的 leader,也就是收到 leader 的心跳信息,或者发现已经开始新的 term 任期,选举者状态 candidate 将会转化成 follow。

dicover serer with higher term:当前的 leader 可能因为网络分区的问题和集群中的其他 follow 失去心跳联系,这时候集群选举出了新的 leader,这时候 leader 就要变成 follow 状态。

receives votes from mahority servers:当 candidate 收到集群中大多数的投票时,会被选举成新的 leader,进入 leader 状态

这图展示了 raft 中几个状态的转化。

 

在论文中解释了 term 任期

简单说说:Raft一致性共识算法_状态机_03

 

raft将时间划分成一个一个的任期,每个任期开始都是一个选举, 选举成功后 leader 会管理集群到任期结束,如果任期中没有选举成功,那么这个任期会因为没有领导人而结束,这时候 candidate 因为选举超时(也就是没有选出 leader 的超时时间)而自动开启下一个任期 term。

他们通过 rpc 请求来进行服务器之间的远程调用和通信,并且基本的一致性算法只需要两种类型的 RPCs。请求投票(RequestVote) RPCs 由候选人在选举期间发起,然后附加条目 (AppendEntries)RPCs 由领导人发起,用来复制日志和提供一种心跳机制。除此之外在服务器之间传输快照增加了第三种 RPC。

  • RequestVote RPC(请求投票):由 candidate 在选举期间发起。
  • AppendEntries RPC(追加条目):由 leader 发起,用来复制日志和提供一种心跳机制。