2020 6.824 的 Raft Lab 4B

前言

做2020的MIT6.824,部分完成了实验 Lab4B(challenge部分没有写), 通过了测试,对于之前的Raft实现的实验请参考Lab 2ALab 2BLab 2CLab 3ALab 3B 以及Lab 4A

Lab4需要实现一个分区的kv存储服务,其中Lab4A实现ShardMaster负责维护分区配置信息;这个Lab负责ShardKv,分别存储零至多个分区的数据,其中难点就是怎么使用多个raft实现分区储存服务。本文主要讲一下实现的思路,我也是参考了网上的很多做法,其中总体思路跟这位博主非常相似,这位博主提供比较完整的代码实现,这里就不放代码了


一、两个实现细节

1.0 流程

  1. Monitor config部分
    在这里插入图片描述
  2. Monitor shard 部分
    在这里插入图片描述

1.1 Monitor

实现ShardKv,首先可以参考RaftKv(Lab3B)之前的实现,完成一个单区的储存服务,然后在此基础上实现:

  1. Monitor config的变化,如果有新的config,往raft新增一个log,通知其他server跟新
    • 自己负责的shard
    • 如果自己不再负责某个分区,应该把当前的kvStore的数据保存在一个map(DBTempMap)中,等待新的shard的server去pull
  2. Monitor 是否有server需要向别的server push数据,如果有则通知需要pull数据的servers

1.2 处理monitor发过来的message

  1. UpdateShardMetadataFromMonitor 负责处理ConfigurationMonitor发过来的数据,总的来说需要注意跟新自己负责的shard,并且
    • 如果是新的区,记录上一次的config number到shard2config的map中,比如{1: 2}代表shard1需要pull config的代码
    • 如果是不再去负责的区,也就是新的server需要从本server pull data,那么把当前db数据保存起来
  2. DataMigrateFromMonitor 负责处理pull data,基本过程如下
    1. ShardsMonitor 发现kv. shard2config有数据,代表当前sever需要向别的sever pull data
    2. 于是向需要pull data的server 发送RPC请求,这些servers把data 通过reply发送过来
    3. 当前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的照片,真挚的感谢能开放这么好的一个课程,共勉

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值