最近几个月利用业余时间学习了大名鼎鼎的MIT 6.824 分布式系统课程。我跟的是2015年的课程内容,Lab的内容是使用Go语言实现一个分布式数据库。这门课主要是读Paper和做Lab,比较适合自学,但是阅读量和代码量还有课程的难度还是相当大的,缺少自我驱动力的情况下很难坚持。尤其是我这种上班族,一周差不多只有晚上下班后可以有一整块的时间用来学习,平均一周还得加几天班,完全是学一点是一点的状态,但是兴趣还是驱使我坚持了下来。这门课对于一个完全没接触过分布式系统的人来说是一个很好的入门教程,但是它的难度和大量的学习内容还是能把人弄得痛不欲生。我也总结一下自己学习的过程可以给新入坑的同学做个入坑指南。
在课程的官网(现在2016年的官网也上线了,新学的可以直接跟2016年的课程,在2015年的基础上增加了一些内容)有一个Schedule,布置了每周需要完成的任务,包括阅读推荐的Paper,还有针对Paper内容的一些问题可以让人抓住重点,然后就是做Lab了。
这门课对人的英语也是一个挑战,所有的Paper,Question,Lab都是英文描述的,使用非母语学习一个陌生的领域速度是相当慢的,但是没办法,计算机领域的好东西大部分都是英文的,不迎难而上就永远没法提高自己,没事把自己扔出舒适区虐一虐还是挺爽的。
在真正开始学习这门课之前,我推荐阅读一下这篇文章:Distributed systems, for fun and profit 。算是科普一下分布式系统领域的一些基础知识和基本理念,这篇文章的作用用作者的原话来说就是
To me, that means two things: introducing the key concepts that you will
need in order to have a good time reading more serious texts, and providing
a narrative that covers things in enough detail that you get a gist of
what's going on without getting stuck on details.
通过这篇文章对分布式系统有了大致的轮廓之后,就可以开始刷Paper和Lab了。Schedule为我们规划了一个合适的路线来打怪升级,当周Lab的内容与布置的Paper或多或少都有联系,比如MapReduce,Fault-Tolerant,Paxos等,还有一些Paper是与当前流行的技术有关的话题,如Spark,Bitcoin。时间充裕的话静下心来花一整块时间读完一篇还是很有收获的,不懂的地方多用Google。最好是先对Paper所讨论的话题有一个大概的了解,可以通过维基百科等网站,比如Paxos,如果你不理解什么是一致性,容错,是没法读下去的。
整个课程一共有5个Lab,MapReduce,Primary/Backup,Paxos,Shards,Persistence。每个Lab都有若干个Part,每个Part都会有一个大致的代码框架和完整的测试代码,可以从网站上给的git地址下载下来。一定要仔细阅读每个Part具体要做什么,然后到相应的代码位置补充相关的实现。在代码中需要我们添加代码的位置都有注释提示,不能添加代码的位置也有相应的注释,最好按照人家的要求做。在添加代码的同时也不要忘了阅读题目下面的一系列Hint,那些都是容易踩到的坑以及给你的一些提示。在理解了题目意思之后建议先看一下测试代码(test_test.go),了解每个方法的输入输出是什么,根据测试驱动开发。
以后想详细地一个一个地总结一下这些Lab,当作温故而知新。我现在的进度是Lab基本上已经完成,Paper就读了跟Lab内容相关的几篇,没办法整块的时间太少了,而读Paper又想一口气读完一篇不想思路断掉。接下来还是想在业余时间把课程推荐的Paper尽量读完。
最后,我总结了一些是我认为学完这门课后必须了解的概念(不断补充中)
- MapReduce
- RPC
- Goroutine
- Primary/Backup
- Paxos
- Raft
- Spark
- Shard
- Scalability
- Performance
- Availability
- Partition and Replicate
- CAP and FLP
- Consistency
- Fault tolerance
- 2PC and 3PC
- Byzantine fault tolerance
- GFS
- Big Table
- Time and order and clocks