Raft一致性算法(15)

Raft一致性算法
文章插图
 
 

图 14:一个散点图表示了 43 个学生在 Paxos 和 Raft 的小测验中的成绩 。在对角线之上的点表示在 Raft 获得了更高分数的学生 。
 
我们也建立了一个线性回归模型来预测一个新的学生的测验成绩,基于以下三个因素:他们使用的是哪个小测验,之前对 Paxos 的经验,和学习算法的顺序 。模型预测,对小测验的选择会产生 12.5 分的差别 。这显著的高于之前的 4.9 分,因为很多学生在之前都已经有了对于 Paxos 的经验,这相当明显的帮助 Paxos,对 Raft 就没什么太大影响了 。但是奇怪的是,模型预测对于先进行 Paxos 小测验的人而言,Raft的得分低了6.3分; 虽然我们不知道为什么,这似乎在统计上是有意义的 。
我们同时也在测验之后调查了参与者,他们认为哪个算法更加容易实现和解释;这个的结果在图 15 上 。压倒性的结果表明 Raft 算法更加容易实现和解释(41 人中的 33个) 。但是,这种自己报告的结果不如参与者的成绩更加可信,并且参与者可能因为我们的 Raft 更加易于理解的假说而产生偏见 。
Raft一致性算法

文章插图
 
 
图 15:通过一个 5 分制的问题,参与者(左边)被问哪个算法他们觉得在一个高效正确的系统里更容易实现,右边被问哪个更容易向学生解释 。
 
关于 Raft 用户学习有一个更加详细的讨论 。
9.2 正确性
在第 5 节,我们已经制定了正式的规范,和对一致性机制的安全性证明 。这个正式规范使用 TLA+ 规范语言使图 2 中总结的信息非常清晰 。它长约400行,并作为证明的主题 。同时对于任何想实现 Raft 的人也是十分有用的 。我们通过 TLA 证明系统非常机械的证明了日志完全特性 。然而,这个证明依赖的约束前提还没有被机械证明(例如,我们还没有证明规范的类型安全) 。而且,我们已经写了一个非正式的证明关于状态机安全性是完备的,并且是相当清晰的(大约 3500 个词) 。
9.3 性能
Raft 和其他一致性算法例如 Paxos 有着差不多的性能 。在性能方面,最重要的关注点是,当领导人被选举成功时,什么时候复制新的日志条目 。Raft 通过很少数量的消息包(一轮从领导人到集群大多数机器的消息)就达成了这个目的 。同时,进一步提升 Raft 的性能也是可行的 。例如,很容易通过支持批量操作和管道操作来提高吞吐量和降低延迟 。对于其他一致性算法已经提出过很多性能优化方案;其中有很多也可以应用到 Raft 中来,但是我们暂时把这个问题放到未来的工作中去 。
我们使用我们自己的 Raft 实现来衡量 Raft 领导人选举的性能并且回答两个问题 。首先,领导人选举的过程收敛是否快速?第二,在领导人宕机之后,最小的系统宕机时间是多久?
Raft一致性算法

文章插图
 
 
图 16:发现并替换一个已经崩溃的领导人的时间 。上面的图考察了在选举超时时间上的随机化程度,下面的图考察了最小选举超时时间 。每条线代表了 1000 次实验(除了 150-150 毫秒只试了 100 次),和相应的确定的选举超时时间 。例如,150-155 毫秒意思是,选举超时时间从这个区间范围内随机选择并确定下来 。这个实验在一个拥有 5 个节点的集群上进行,其广播时延大约是 15 毫秒 。对于 9 个节点的集群,结果也差不多 。
 
为了衡量领导人选举,我们反复的使一个拥有五个节点的服务器集群的领导人宕机,并计算需要多久才能发现领导人已经宕机并选出一个新的领导人(见图 16) 。为了构建一个最坏的场景,在每一的尝试里,服务器都有不同长度的日志,意味着有些候选人是没有成为领导人的资格的 。另外,为了促成选票瓜分的情况,我们的测试脚本在终止领导人之前同步的发送了一次心跳广播(这大约和领导人在崩溃前复制一个新的日志给其他机器很像) 。领导人均匀的随机的在心跳间隔里宕机,也就是最小选举超时时间的一半 。因此,最小宕机时间大约就是最小选举超时时间的一半 。
图 16 中上面的图表明,只需要在选举超时时间上使用很少的随机化就可以大大避免选票被瓜分的情况 。在没有随机化的情况下,在我们的测试里,选举过程往往都需要花费超过 10 秒钟由于太多的选票瓜分的情况 。仅仅增加 5 毫秒的随机化时间,就大大的改善了选举过程,现在平均的宕机时间只有 287 毫秒 。增加更多的随机化时间可以大大改善最坏情况:通过增加 50 毫秒的随机化时间,最坏的完成情况(1000 次尝试)只要 513 毫秒 。


推荐阅读