Raft一致性算法(16)


图 16 中下面的图显示,通过减少选举超时时间可以减少系统的宕机时间 。在选举超时时间为 12-24 毫秒的情况下,只需要平均 35 毫秒就可以选举出新的领导人(最长的一次花费了 152 毫秒) 。然而,进一步降低选举超时时间的话就会违反 Raft 的时间不等式需求:在选举新领导人之前,领导人就很难发送完心跳包 。这会导致没有意义的领导人改变并降低了系统整体的可用性 。我们建议使用更为保守的选举超时时间,比如 150-300 毫秒;这样的时间不大可能导致没有意义的领导人改变,而且依然提供不错的可用性 。
10 相关工作
已经有很多关于一致性算法的工作被发表出来,其中很多都可以归到下面的类别中:
 

  • Lamport 关于 Paxos 的原始描述,和尝试描述的更清晰 。
  • 关于 Paxos 的更详尽的描述,补充遗漏的细节并修改算法,使得可以提供更加容易的实现基础 。
  • 实现一致性算法的系统,例如 Chubby,ZooKeeper 和 Spanner 。对于 Chubby 和 Spanner 的算法并没有公开发表其技术细节,尽管他们都声称是基于 Paxos 的 。ZooKeeper 的算法细节已经发表,但是和 Paxos 着实有着很大的差别 。
  • Paxos 可以应用的性能优化 。
  • Oki 和 Liskov 的 Viewstamped Replication(VR),一种和 Paxos 差不多的替代算法 。原始的算法描述和分布式传输协议耦合在了一起,但是核心的一致性算法在最近的更新里被分离了出来 。VR 使用了一种基于领导人的方法,和 Raft 有很多相似之处 。
 
Raft 和 Paxos 最大的不同之处就在于 Raft 的强领导特性:Raft 使用领导人选举作为一致性协议里必不可少的部分,并且将尽可能多的功能集中到了领导人身上 。这样就可以使得算法更加容易理解 。例如,在 Paxos 中,领导人选举和基本的一致性协议是正交的:领导人选举仅仅是性能优化的手段,而且不是一致性所必须要求的 。但是,这样就增加了多余的机制:Paxos 同时包含了针对基本一致性要求的两阶段提交协议和针对领导人选举的独立的机制 。相比较而言,Raft 就直接将领导人选举纳入到一致性算法中,并作为两阶段一致性的第一步 。这样就减少了很多机制 。
像 Raft 一样,VR 和 ZooKeeper 也是基于领导人的,因此他们也拥有一些 Raft 的优点 。但是,Raft 比 VR 和 ZooKeeper 拥有更少的机制因为 Raft 尽可能的减少了非领导人的功能 。例如,Raft 中日志条目都遵循着从领导人发送给其他人这一个方向:附加条目 RPC 是向外发送的 。在 VR 中,日志条目的流动是双向的(领导人可以在选举过程中接收日志);这就导致了额外的机制和复杂性 。根据 ZooKeeper 公开的资料看,它的日志条目也是双向传输的,但是它的实现更像 Raft 。
和上述我们提及的其他基于一致性的日志复制算法中,Raft 的消息类型更少 。例如,我们数了一下 VR 和 ZooKeeper 使用的用来基本一致性需要和成员改变的消息数(排除了日志压缩和客户端交互,因为这些都比较独立且和算法关系不大) 。VR 和 ZooKeeper 都分别定义了 10 种不同的消息类型,相对的,Raft 只有 4 种消息类型(两种 RPC 请求和对应的响应) 。Raft 的消息都稍微比其他算法的要信息量大,但是都很简单 。另外,VR 和 ZooKeeper 都在领导人改变时传输了整个日志;所以为了能够实践中使用,额外的消息类型就很必要了 。
Raft 的强领导人模型简化了整个算法,但是同时也排斥了一些性能优化的方法 。例如,平等主义 Paxos (EPaxos)在某些没有领导人的情况下可以达到很高的性能 。平等主义 Paxos 充分发挥了在状态机指令中的交换性 。任何服务器都可以在一轮通信下就提交指令,除非其他指令同时被提出了 。然而,如果指令都是并发的被提出,并且互相之间不通信沟通,那么 EPaxos 就需要额外的一轮通信 。因为任何服务器都可以提交指令,所以 EPaxos 在服务器之间的负载均衡做的很好,并且很容易在 WAN 网络环境下获得很低的延迟 。但是,他在 Paxos 上增加了非常明显的复杂性 。
一些集群成员变换的方法已经被提出或者在其他的工作中被实现,包括 Lamport 的原始的讨论,VR 和 SMART 。我们选择使用共同一致的方法因为他对一致性协议的其他部分影响很小,这样我们只需要很少的一些机制就可以实现成员变换 。Lamport 的基于 α 的方法之所以没有被 Raft 选择是因为它假设在没有领导人的情况下也可以达到一致性 。和 VR 和 SMART 相比较,Raft 的重新配置算法可以在不限制正常请求处理的情况下进行;相比较的,VR 需要停止所有的处理过程,SMART 引入了一个和 α 类似的方法,限制了请求处理的数量 。Raft 的方法同时也需要更少的额外机制来实现,和 VR、SMART 比较而言 。


推荐阅读