前言
做2020的MIT6.824,部分完成了实验 Lab4B(challenge部分没有写), 通过了测试,对于之前的Raft实现的实验请参考Lab 2A, Lab 2B 和 Lab 2C 和 Lab 3A 和 Lab 3B 以及Lab 4A
Lab4需要实现一个分区的kv存储服务,其中Lab4A实现ShardMaster负责维护分区配置信息;这个Lab负责ShardKv,分别存储零至多个分区的数据,其中难点就是怎么使用多个raft实现分区储存服务。本文主要讲一下实现的思路,我也是参考了网上的很多做法,其中总体思路跟这位博主非常相似,这位博主提供比较完整的代码实现,这里就不放代码了
一、两个实现细节
1.0 流程
- Monitor config部分
- Monitor shard 部分
1.1 Monitor
实现ShardKv,首先可以参考RaftKv(Lab3B)之前的实现,完成一个单区的储存服务,然后在此基础上实现:
- Monitor config的变化,如果有新的config,往raft新增一个log,通知其他server跟新
- 自己负责的shard
- 如果自己不再负责某个分区,应该把当前的kvStore的数据保存在一个map(DBTempMap)中,等待新的shard的server去pull
- Monitor 是否有server需要向别的server push数据,如果有则通知需要pull数据的servers
1.2 处理monitor发过来的message
- UpdateShardMetadataFromMonitor 负责处理ConfigurationMonitor发过来的数据,总的来说需要注意跟新自己负责的shard,并且
- 如果是新的区,记录上一次的config number到shard2config的map中,比如{1: 2}代表shard1需要pull config的代码
- 如果是不再去负责的区,也就是新的server需要从本server pull data,那么把当前db数据保存起来
- DataMigrateFromMonitor 负责处理pull data,基本过程如下
- ShardsMonitor 发现kv. shard2config有数据,代表当前sever需要向别的sever pull data
- 于是向需要pull data的server 发送RPC请求,这些servers把data 通过reply发送过来
- 当前kv把reply通过raft persist gid其它servers中
而DataMigrateFromMonitor 就是处理其它server收到上一步的apply msg的,操作就是把收到的msg保存到当前的kvStore中就可以了
二、 总结
Lab4B的难点是处理race问题,老师也给了不少这方面的提示,但是总会有race问题带一步步解决的,这就是分布式系统的一个难点吧。总的来说Lab4B是6.824这么多实验我认为中最难的一个,主要是实现细节上老师留了很多空白,不像Raft有一篇paper可以参考。
三、后记
至此,6.824的实验就全部完成了,收获了很多系统设计的知识,同时对分布式系统及其算法有了初步但还算深刻的了解(这个深刻主要是就raft算法实现而言的)Robert Morris的lecture讲得还是很不错的,非常值得听一下,他的lecture notes我部分有在博客中记录,有空也会更新。
这是一门还需要回味的课,有机会能够完成一些分布式系统的项目后再回来看,肯定有不一样的收获
最后放上Robert Morris的照片,真挚的感谢能开放这么好的一个课程,共勉