给自己定了3个带Lab作业的课程

MIT6.824 2020

分布式系统 开始于 2020-04-20

Lab1 MapReduce

Lab2 Raft

暂时只打算做 Lab1Lab2 , Lab2 太耗时了而且后面的 两个lab 都依赖于它, 目前做完了 Lab1Lab 2A ,2B , 还是相当耗时的一个课程

2A , Raft 的选举阶段 重写了 2 遍 ,

第一次重写是因为代码太乱 ,担心后面的 lab 会被影响 (结果还是发生了)

第二次重写是因为写完复制阶段发现选举阶段有 bug , 又重新跑回去 debug 了

2B 重写了一遍 , 主要是因为没有一个一个测试过 , 直接把整个阶段的代码先写完导致到处都是 bug

重写的时候抽出了很多 helper 方法, 减少阅读压力

日志也全部重新打了一遍 , 并且按照阶段分开写到不同的文件中 , 多线程也只能靠打日志了,如果日志打好了 debug 起来事半功倍

看论文和资料 , 还有 debug 的过程相当耗时,有时候一个 bug 就是一天,不过整理了日志之后有所改善

做到 2B 这里整整花了 13 天,后面还有一个2c ,持久化的lab , 6 月再做..

image-20191120140931373

有两个case大概率不能通过 , 排查了一天没找到 , 只能先搁置了 , 是有关网络请求丢失和延迟的case

遇到的一些问题和收获

debug ++

打日志 ++

日志打的太频繁(磁盘 IO)导致一个 test 超时了 , 日志开销也是要注意的点

某个线程忘记 sleep 导致 cpu 百分百

follower 断开导致candidate 无法发出后续的投票请求, 所有 peer频繁选举超时 , 需要把每个请求放到新的线程里执行, 只要满足了过半投票就可以不用继续等待超时的请求

各种因为没有理解论文和忘记维护变量的 bug

....

go 相关

1.不要在 for 里用 defer,不可预测

2.shared memory+lock 的多线程开发模式时 , 有的变量要用闭包包起来, copy 一份线程独立的 , 比如 for 循环时候的 i 变量

3.利用 select+time.After() 实现超时机制

4.go race 检测死锁

....

资料

schedule 里给的资料很完善 ,不过做的时候还是另外找了些中文资料

两个动画:

https://raft.github.io/

http://thesecretlivesofdata.com/

etcd 的 Raft 实现

如何的才能更好的学习MIT6.824分布式系统课程?

MIT 6.824 2020 Raft 实现细节汇总

Raft 算法详解

论文翻译

CMU15/445 2019

数据库

Lab1 BufferPoolManager / ClockReplacer

前置知识 C++还没看完

A tour of C++

CMU15/441 2019

计算机网络

Lab1 HTTP Web Server

前置知识 C, UNIX 网络编程 , 并发编程,同步原语 ,直接看前置课程 CMU15-213 和 CSAPP , 然后实现前置课程 Lab7的 Proxy Lab