前言
大三下暑假才开始的实习,也是我的第一次分布式 lab,之前没做过6.824,所以完成的过程中很折磨,bug 飞来飞去。最后用了6个星期多才完成了项目,并且还是建立在很多基于样例编程的基础上,即使这样也没有完成全部测试点,project3b 还是太难了。
项目最后需要编写一个文档,里面写了我对四个project的理解以及一些重要函数的实现流程。实际上,如果不做另行优化的话,大部分的函数流程都是固定的,因此只要清楚了思想,至少在宏观上可以减少一些走弯路的风险,接下来就是疯狂对着bug调细节了。文档写的稍微有点书面,而且字不少,直接cp过来有点不合适哈哈哈,所以还是放链接吧:
弱弱的TinyKV文档
实现的思路和流程基本都写进去了,还有个人认为非常关键的 raft 角色转换逻辑,在 project2 的文档中我尝试画图来更直观地去梳理一下,效果还可以。细节写进文档中了,这里我想谈谈一些杂感和心得分享。
整体感受
感受就一个字:痛。
首先是花时间,Code 之前要研读很多东西,比如 raft 论文,不读个两遍我个人是不建议上手敲代码的,还比如代码框架,再比如官方的文档,外加上我还读了一些别人的心得分享。接着就会发现,读完这些后,还是不太好下手,因为整个 raft 都要我们自己来实现,需要从整体的角度去构建。所以会花很多的时间去一点点完善 raft 的所有步骤,不过好在大部分函数/方法官网已经给函数名了,至少知道了方向。实现完了之后就是调 bug,这是最耗费时间的,而且会出现解决了后面的 bug,前面又出了新的 bug 这种情况,这就属于按照测试点 debug 而忽略了实现逻辑上的问题,很难受。解决这些 bug 要花很多的时间,尤其是 project3b 的一些 bug,还随机出现,只能不断地打日志、猜想/验证来去找到 bug 的源头,这会花很多时间,比如有一个我就用了整整3天,那3天项目一点进度都没有,全拿来解决那个 bug 去了。
前两个 project 都好说。project1 通过研读代码框架直接就可以确定实现逻辑,project2就是仔细仔细读 raft 论文,而且只要是线性测试的,那都不是问题,2b/c的非线性测试也没遇见那种扣破头也解决不了 bug。除去前期对项目整体的熟悉之外,project2 一天半做完了,看网上的分享都是说两三个小时就做完了,我觉得对我来说不现实,毕竟拿到手还要花时间读代码框架,整理 API 啥的,这一下就不止几个小时了,如果说两三个小时是纯 Code 时间,那才差不多能接受。
然后就是绝望。这在 project3b 中尤为明显,在做 Split 的时候,就是会出现很多奇奇怪怪的 bug,而且随机出现,很难复现。有时候,只要这个 bug 出现了我就很高兴,对,没有解决,仅仅是出现,因为这样我就可以通过日志尝试追踪了。在解决3b的一些 bug 时,很多时候我是靠猜的,然后去验证,然后发现猜错了,由此往复。有一个 bug,我调了3天,前两天真的很绝望,没有靠追踪日志来溯源成功,就硬猜,然后一直猜错,都想放弃了。不过好在最后发现了是在 raft 层中的 tick 出了问题,和心跳有关,第三天晚上解决了,不然我快绝望死了。
最重要的,提升工程能力。这点很重要,因为项目不同于小 lab 或者一些算法刷题那样,它需要完完整整的实现一个系统,这就要求我们从整体到细节都要考虑到,不能只拘泥于某一项功能的实现,会很好地锻炼整体性、模块化的开发思想。在组会的时候,基本每周都有大佬建议先不要硬磕测试点,把整个项目结构搞明白了先,这比测试点重要。
开发建议
Project1
- 先看看 badger,了解一下 Txn 和 DB;
- 读相应的代码框架,在 engine_util 这个包里,整理每个 API 的功能与使用方法;
Project2
- 好好读 raft 论文,其实很多细节在论文中是提到了的;
- 参考 etcd,project2 的设计很多都是和 etcd 大同小异的,看 etcd 源码可以有很大的启发;
- 写 Project2A 和 2B 的时候可以先不考虑 2C 的内容,因为少了快照,前两个完成起来会相对简单很多,等写到Project2C 再去前面补充就行,并不会影响到代码框架;
Project3
- 心态,心态,还是心态!
- 打日志,一定要打日志,多线程的测试,还带随机数,不打日志有些 bug 根本追踪不出来;
Project4
- 这部分刚看会有些困惑,但是实现起来就比较简单,Project123 都能完成了,这肯定没问题;
其他
- github 上有个 TinyKV 白皮书,如果没思路了可以参考一下,虽然有一些他写错了或者写的不完善;
- 调 bug 时遇到的问题和解决办法都记录下来,不仅仅是为了写文档,更能让我们明白项目中忽略的细节;
- 多交流,多分享自己遇见的 bug 或者见解,有时候我们碰见的问题,会被别人一点即通;
参考资料