Raft一致性算法(14)


我们 Raft 的目标是要实现线性化语义(每一次操作立即执行,只执行一次,在他调用和收到回复之间) 。但是,如上述,Raft 是可能执行同一条命令多次的:例如,如果领导人在提交了这条日志之后,但是在响应客户端之前崩溃了,那么客户端会和新的领导人重试这条指令,导致这条命令就被再次执行了 。解决方案就是客户端对于每一条指令都赋予一个唯一的序列号 。然后,状态机跟踪每条指令最新的序列号和相应的响应 。如果接收到一条指令,它的序列号已经被执行了,那么就立即返回结果,而不重新执行指令 。
只读的操作可以直接处理而不需要记录日志 。但是,在不增加任何限制的情况下,这么做可能会冒着返回脏数据的风险,因为响应客户端请求的领导人可能在他不知道的时候已经被新的领导人取代了 。线性化的读操作必须不能返回脏数据,Raft 需要使用两个额外的措施在不使用日志的情况下保证这一点 。首先,领导人必须有关于被提交日志的最新信息 。领导人完全特性保证了领导人一定拥有所有已经被提交的日志条目,但是在他任期开始的时候,他可能不知道哪些是已经被提交的 。为了知道这些信息,他需要在他的任期里提交一条日志条目 。Raft 中通过领导人在任期开始的时候提交一个空白的没有任何操作的日志条目到日志中去来实现 。第二,领导人在处理只读的请求之前必须检查自己是否已经被废黜了(他自己的信息已经变脏了如果一个更新的领导人被选举出来) 。Raft 中通过让领导人在响应只读请求之前,先和集群中的大多数节点交换一次心跳信息来处理这个问题 。可选的,领导人可以依赖心跳机制来实现一种租约的机制,但是这种方法依赖时间来保证安全性(假设时间误差是有界的) 。
9 算法实现和评估
我们已经为 RAMCloud 实现了 Raft 算法作为存储配置信息的复制状态机的一部分,并且帮助 RAMCloud 协调故障转移 。这个 Raft 实现包含大约 2000 行 C++ 代码,其中不包括测试、注释和空行 。这些代码是开源的 。同时也有大约 25 个其他独立的第三方的基于这篇论文草稿的开源实现,针对不同的开发场景 。同时,很多公司已经部署了基于 Raft 的系统 。
这一节会从三个方面来评估 Raft 算法:可理解性、正确性和性能 。
9.1 可理解性
为了和 Paxos 比较 Raft 算法的可理解能力,我们针对高层次的本科生和研究生,在斯坦福大学的高级操作系统课程和加州大学伯克利分校的分布式计算课程上,进行了一次学习的实验 。我们分别拍了针对 Raft 和 Paxos 的视频课程,并准备了相应的小测验 。Raft 的视频讲课覆盖了这篇论文的所有内容除了日志压缩;Paxos 讲课包含了足够的资料来创建一个等价的复制状态机,包括单决策 Paxos,多决策 Paxos,重新配置和一些实际系统需要的性能优化(例如领导人选举) 。小测验测试一些对算法的基本理解和解释一些边角的示例 。每个学生都是看完第一个视频,回答相应的测试,再看第二个视频,回答相应的测试 。大约有一半的学生先进行 Paxos 部分,然后另一半先进行 Raft 部分,这是为了说明两者从第一部分的算法学习中获得的表现和经验的差异 。我们计算参加人员的每一个小测验的得分来看参与者是否在 Raft 算法上更加容易理解 。
我们尽可能的使得 Paxos 和 Raft 的比较更加公平 。这个实验偏爱 Paxos 表现在两个方面:43 个参加者中有 15 个人在之前有一些 Paxos 的经验,并且 Paxos 的视频要长 14% 。如表格 1 总结的那样,我们采取了一些措施来减轻这种潜在的偏见 。我们所有的材料都可供审查 。
关心
缓和偏见采取的手段
可供查看的材料
相同的讲课质量
两者使用同一个讲师 。Paxos 使用的是现在很多大学里经常使用的 。Paxos 会长 14% 。
视频
相同的测验难度
问题以难度分组,在两个测验里成对出现 。
小测验
公平评分
使用评价量规 。随机顺序打分,两个测验交替进行 。
评价量规(rubric)
 

表 1:考虑到可能会存在的偏见,对于每种情况的解决方法,和相应的材料 。
 
参加者平均在 Raft 的测验中比 Paxos 高 4.9 分(总分 60,那么 Raft 的平均得分是 25.7,而 Paxos 是 20.8);图 14 展示了每个参与者的得分 。配置t-检验(又称student‘s t-test)表明,在 95% 的可信度下,真实的 Raft 分数分布至少比 Paxos 高 2.5 分 。


推荐阅读