在大三暑假做的,做的时候时间相对比较紧张,做了四五周(中间还赶了几个报告),由于在之前学习过go语言,在做Project1 和 Project2a还是比较顺利的,做project2bproject3b的时候问题比较大,主要是其它几个project涉及的代码不是很多,主要是集中在一个模块内的代码,代码的阅读比较容易,project2bproject3b涉及了整个项目的代码,调试就比较困难。
Project1: 构建一个独立的 kv server
这一部分直接使用badger作为存储引擎,无需自行定义,编程前可以学习一下badger中的API,对badger数据库的get、put、delete等操作在框架代码中已基本提供,实现时只需构造相应的参数并调用对应的函数即可
Project2:基于raft算法实现分布式键值数据库服务端
2A、实现Raft算法
2B、基于Raft算法构建分布式kv数据库服务端
2C、在2B的基础上增加日志压缩和安装快照的相关处理逻辑
Project3:在project2的基础上支持多个Raft集群
3A 在raft模块增加处理增删节点、转换leader的相关处理逻辑
3B 在服务端增加处理增删节点、转换leader、region split的相关逻辑
3C 通过regionHeartbeat更新scheduler中的相关信息、实现Schedule函数生成调度操作,避免store中有过多region
Project4:在project3的基础上支持分布式事务
4A 实现结构体MvccTxn的相关函数
4B 实现server.go中的KvGet, KvPrewrite, KvCommit函数
4C 实现server.go中的KvScan, KvCheckTxnStatus, KvBatchRollback,KvResolveLock函数
建议:
在做之前和过程中务必多看几遍指导文档。里面有详细介绍Talent Plan 2.0的课程设置并且有着具体的实验指导教程,并且有对代码框架进行介绍,tinyKV总体代码量不大,主要难点在于了解框架代码运行的流程以及自己所需完成的工作,因此阅读指导文档十分重要。
没思路时可以考虑看看相应的测试函数的实现,但切忌只看测试函数,可能出现实现有问题但测试能通过的情况,会导致后面的模块出问题。
关于测试,可能会引起一些疑惑,一些测试代码可能与自己对Raft的理解有冲突,可能需要根据测试函数做相应修改。
对于复杂的测试函数,可以对其进行修改,分阶段进行测试。缩小测试规模进行测试。
有效利用输出日志,定点打印输出信息,阅读大片大片的输出信息是不可避免的,Debug时请一定耐心。
部分复杂的测试可能偶尔不通过的情况,测试时务必连续多次地进行测试,保证正确。