Contents

MIT 6.824 Lab3B笔记

Lab3B总结

3B的主要目标是给我们基于raft的kvserver增加快照支持,而底层raft的快照我们在2D已经实现了,这次lab的任务就是使用我们的raft底层功能作为支撑,让kvserver能够接受来此底层raft的snapshot install,以及能够在整个raft日志开始变得过大时发送自己状态机作为snapshot给底层raft(因为需要raft将其持久化,以便故障恢复后能发回给上层的kvserver),好让它丢弃之前的日志来自我瘦身。

其实lab 3B的实现思路并不复杂,但由于2D没做好,3B的测试测出来很多底层raft snapshot功能的bug,于是又回去对2D的代码进行了不小的修改。整个lab前前后后断断续续竟花了快一个月。。。具体的复杂性就不赘述了,在下面记录一下测试结果,就算是把整个MIT 6.824的lab暂时完结了,讲道理lab 4作为6.824的期末项目,应该咬咬牙做完它的,但考虑到接下来就要开始新工作了,想想之前每个lab的平均耗时,还是先不开坑为妙,或许将来会重新把它完结掉吧。

总的来说,6.824的Lab确实不负盛名,质量极高。

整体上来说,整个raft系列(2a~)充满了“设计感”——先让学生实现raft最重要的功能:实现选举和日志追加,然后在其之上做快照压缩和的leader跳跃发送日志的优化,等学生完整实现好自己的raft library后,再让他们基于它来实现自己的分布式键值存储服务。如此一来,学生得以循序渐进、自下往上地深入理解分布式系统的内部实现和原理。

具体到每个Lab,它们的guide都写得十分具体清晰,测试更是可以看出授课团队的用心——他们甚至实现了kvraft测试结果的可视化来让学生更方便的debug(虽然我没怎么用上,测试用例到最后都太复杂,可视化了也理不清):

从TA的blog可以管中窥豹出,这门课自己本身是有积累的,授课团队每年根据学生的反馈和作业情况,不断地改进lecture和lab,比如说最近几年,把分布式算法从paxos改为更容易理解的raft,让整个lab的难度曲线平缓了不少。

不得不说,MIT 6.824让我稍稍体会到了CS名校的深厚教育功底,以及教育课程设计的精妙之处,虽然UCSD的CS课也不差,但整体而言还是给了我不少惊艳。十分感谢Robert Morris以及6.824的授课团队,让这么好的课程免费对外公开。在往后的程序员生涯中,在工作之外倘若能坚持一门一门地学习这些由名校公开的cs课,想必受益匪浅,接下来的任务便是,趁着还没上班,赶紧找下一门好课吧。

Lab3B 测试结果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Test: InstallSnapshot RPC (3B) ...
  ... Passed --   3.0  3   583   63
Test: snapshot size is reasonable (3B) ...
  ... Passed --   5.3  3  2528  800
Test: ops complete fast enough (3B) ...
timePerOp: 6.093935ms  ... Passed --   6.6  3  3130    0
Test: restarts, snapshots, one client (3B) ...
  ... Passed --  19.6  5 10926 2076
Test: restarts, snapshots, many clients (3B) ...
  ... Passed --  20.3  5 28810 10350
Test: unreliable net, snapshots, many clients (3B) ...
  ... Passed --  16.1  5 12499 1443
Test: unreliable net, restarts, snapshots, many clients (3B) ...
  ... Passed --  20.8  5 13465 1554
Test: unreliable net, restarts, partitions, snapshots, many clients (3B) ...
  ... Passed --  28.2  5  8712  611
Test: unreliable net, restarts, partitions, snapshots, random keys, many clients (3B) ...
  ... Passed --  30.8  7 26164 2000
PASS
ok      6.5840/kvraft   150.777s

real    2m31.146s
user    1m45.000s
sys     0m9.512s