Raft一致性算法( 十 )

  • 投票者在给领导人 U 投票时依然保存有这条日志条目,因为任何中间的领导人都包含该日志条目(根据上述的假设),领导人从不会删除条目,并且跟随者只有在和领导人冲突的时候才会删除条目 。
  • 投票者把自己选票投给领导人 U 时,领导人 U 的日志必须和投票者自己一样新 。这就导致了两者矛盾之一 。
  • 首先,如果投票者和领导人 U 的最后一条日志的任期号相同,那么领导人 U 的日志至少和投票者一样长,所以领导人 U 的日志一定包含所有投票者的日志 。这是另一处矛盾,因为投票者包含了那条已经被提交的日志条目,但是在上述的假设里,领导人 U 是不包含的 。
  • 除此之外,领导人 U 的最后一条日志的任期号就必须比投票人大了 。此外,他也比 T 大,因为投票人的最后一条日志的任期号至少和 T 一样大(他包含了来自任期 T 的已提交的日志) 。创建了领导人 U 最后一条日志的之前领导人一定已经包含了那条被提交的日志(根据上述假设,领导人 U 是第一个不包含该日志条目的领导人) 。所以,根据日志匹配特性,领导人 U 一定也包含那条被提交的日志,这里产生矛盾 。
  • 这里完成了矛盾 。因此,所有比 T 大的领导人一定包含了所有来自 T 的已经被提交的日志 。
  • 日志匹配原则保证了未来的领导人也同时会包含被间接提交的条目,例如图 8 (e) 中的索引 2 。
  •  
    通过领导人完全特性,我们就能证明图 3 中的状态机安全特性,即如果服务器已经在某个给定的索引值应用了日志条目到自己的状态机里,那么其他的服务器不会应用一个不一样的日志到同一个索引值上 。在一个服务器应用一条日志条目到他自己的状态机中时,他的日志必须和领导人的日志,在该条目和之前的条目上相同,并且已经被提交 。现在我们来考虑在任何一个服务器应用一个指定索引位置的日志的最小任期;日志完全特性保证拥有更高任期号的领导人会存储相同的日志条目,所以之后的任期里应用某个索引位置的日志条目也会是相同的值 。因此,状态机安全特性是成立的 。
    最后,Raft 要求服务器按照日志中索引位置顺序应用日志条目 。和状态机安全特性结合起来看,这就意味着所有的服务器会应用相同的日志序列集到自己的状态机中,并且是按照相同的顺序 。
    5.5 跟随者和候选人崩溃
    到目前为止,我们都只关注了领导人崩溃的情况 。跟随者和候选人崩溃后的处理方式比领导人要简单的多,并且他们的处理方式是相同的 。如果跟随者或者候选人崩溃了,那么后续发送给他们的 RPCs 都会失败 。Raft 中处理这种失败就是简单地通过无限的重试;如果崩溃的机器重启了,那么这些 RPC 就会完整的成功 。如果一个服务器在完成了一个 RPC,但是还没有响应的时候崩溃了,那么在他重新启动之后就会再次收到同样的请求 。Raft 的 RPCs 都是幂等的,所以这样重试不会造成任何问题 。例如一个跟随者如果收到附加日志请求但是他已经包含了这一日志,那么他就会直接忽略这个新的请求 。
    5.6 时间和可用性
    Raft 的要求之一就是安全性不能依赖时间:整个系统不能因为某些事件运行的比预期快一点或者慢一点就产生了错误的结果 。但是,可用性(系统可以及时的响应客户端)不可避免的要依赖于时间 。例如,如果消息交换比服务器故障间隔时间长,候选人将没有足够长的时间来赢得选举;没有一个稳定的领导人,Raft 将无法工作 。
    领导人选举是 Raft 中对时间要求最为关键的方面 。Raft 可以选举并维持一个稳定的领导人,只要系统满足下面的时间要求:
     
    广播时间(broadcastTime) << 选举超时时间(electionTimeout) << 平均故障间隔时间(MTBF)
     
    在这个不等式中,广播时间指的是从一个服务器并行的发送 RPCs 给集群中的其他服务器并接收响应的平均时间;选举超时时间就是在 5.2 节中介绍的选举的超时时间限制;然后平均故障间隔时间就是对于一台服务器而言,两次故障之间的平均时间 。广播时间必须比选举超时时间小一个量级,这样领导人才能够发送稳定的心跳消息来阻止跟随者开始进入选举状态;通过随机化选举超时时间的方法,这个不等式也使得选票瓜分的情况变得不可能 。选举超时时间应该要比平均故障间隔时间小上几个数量级,这样整个系统才能稳定的运行 。当领导人崩溃后,整个系统会大约相当于选举超时的时间里不可用;我们希望这种情况在整个系统的运行中很少出现 。


    推荐阅读