如何的才能更好的學習MIT6.824分散式系統課程?
求推薦學習經驗,感覺一個人看的有點吃力~~
首先 Google 的入門三篇(GFS / Big Table / Map Reduce) 是一定要讀的,有個對分散式系統的基本認識,另外需要理解 lamport 老爺子的 logical clock 的思想,之後去讀 Raft。
Raft 其實實現一個玩具還是比較容易的,真正難的是在原論文中沒有提到的很多工程優化。但是按照原論文的幾個 RPC 實現是沒啥大問題的,就是有點慢另外吞吐上不去而已。參考幾個 go 的 raft 實現咯,比如 hashicorp 的那個(consul 這個可能測試少了點,也許有 bug),c++ 的 logcabin (diego 自己寫的...不過性能呵呵)幾個工業級別的 raft 實現其實不太適合初學者,比如 coreos 的 etcd 和 pingcap 的 tikv(其實這兩個 raft 實現本是同根生,都是源自 etcd 的 raft 實現,由 pingcap 和 coreos 兩個團隊互相維護和開發). 這兩個實現做了大量的工程優化,有些地方和原論文有點不一樣。不過這兩個不管是測試還是生產環境中的檢驗,都是其他 raft 實現不可比的。mit6.824 確實是很好的 資源 自己在 今年4~6月 自學了16spring的內容
lab 最好可以 獨立完成 一個是裡面用 go 有不少坑 可以踩踩
同時 有助於理解 分散式通常 要注意的問題 比如裡面的 數據同步保證consistency, handle concurrency/repeated PRC, partition/fault tolerance, 自上而下 k/v system 可以work的 原理另外lab2 的raft 有助於深入理解 raft-extended paper的內容和 details 同時可以對 consensus algorithm 有一個了解 完成還是 挺有難度的 不過做完了 也很有成就感 Students" Guide to Raft :: Jon Gjengset 這個是 課程 TA的一個 blog 會很有用這門課的 難點和內功 應該就是 paper了 很多時候感覺 沒有一個綱要 不像很多課 有一個整體框架
paper 也可以選擇看 經典和感興趣的 還有可以根據 mit 自己學生的反饋來看(exam的 最後有個 paper的 投票) 額 自己 是 paper看一遍 感興趣會再 仔細讀 然後再參考 上面的notes 額 看paper的經驗也不行 能分享的 就是 之前一門課的professor Mike 有提過 『要想清楚 author 為什麼要這樣寫 假設是什麼 依據是什麼 是不是make sense 那其他情況會 怎麼樣』 感覺這樣想 挺有幫助的另外 學這門課的 同時 可以再補充些 內容 一個是可以弄清楚一些 consistency models 比如 strict consistency, linearizability, sequential consistency, eventual consistency, causal consistency
然後 總結看 paper中的system 是用了 哪個consistency model 為什麼要這樣用 優缺點再就是 可以補充幾篇paper 還是建議讀下paxos
另外 chubby 和 bigtable 值得讀讀 尤其是 chubby 個人認為 chubby是 google 所有系統中最 fundamental的 系統 對理解其他 paper很有幫助 另外據說 chubby 一直在完善 更新 和最初的已經 有很大不同 google 可能什麼時候會更新 一個新版本的 paper有一篇 paper 『A Short Primer on Causal Consistency』 簡單明了 也值得讀一下還有就是 如果OS 內功可以的話 應該會對這門課 學習很有幫助 有很多是相通的
分享一遍paper 『Hints for Computer System Design』 提到很多 經典的 實用的方法 像是 cache, batch, end to end 另外這裡 還是感謝下 mit 可以分享出 這麼好的資源 幫助很大(雖然 自己還是小白 ...試著寫過15和16年的824 project。16年 project 從 paxos 變成raft,容易理解了很多。
後來在Docker實習的時候,發現了一個使用etcd/raft的corner case沒cover到,解決的時候換了各種思路,犯了好多錯誤,最後其實就兩行代碼的事,很有趣。(傳送門 [WIP] raft: update stress test to cover node leave and join by runshenzhu · Pull Request #1162 · docker/swarmkit · GitHub)
寫raft的時候真的很爽,之後很少遇到能寫的這麼開心的project了。
目前在一點點的學習和翻譯,英文一般而且平常還需要做其他事情,進度很慢GitHub - feixiao/Distributed-Systems: MIT課程《Distributed Systems 》學習和翻譯
先看論文,然後對照lecture加深理解。lab要獨立做,如果實在卡殼了,可以參考別人的實現。
xingdl2007/6.824-2017 根據Spring 2017做的,lab4的challenge部分還沒有完成。
update: challenge部分也完成了~
lab2-lab4合在一起是一個分散式資料庫,今年暑假花了一個暑假做完了,收穫非常大,為數不多能讓人感到激動又有成就感的課程project。但是test很難過,多線程又不能單步,我只能看log找bug。做lab2之前建議看一下這個連接:Students" Guide to Raft :: Jon Gjengset。
還有一些開源的raft實現也可以參考一下。想好想清楚再開始寫,不然可能一些微小的bug卻費了很大功夫才找出來。。。另外寫的時候要考慮到各種corner case,有些corner case該怎麼處理等等這些很難權衡,只有自己踩了坑fail了test才能知道怎麼處理。我的代碼寫的很臭,尤其是lab3的,當時沒怎麼想清楚就寫了,結果最後縫縫補補導致代碼臃腫難看,所以想好設計好再寫很重要,這算是我最大的收穫了吧。
強烈建議有時間的話把框架代碼也看一下,學習一下別人是怎麼設計怎麼寫代碼的。lab4的test有一個會偶爾過不了,但我實在不想找了。。。。我也在做https://github.com/ldaochen/yfs2012
2016年的課程主線有四個工程,需要go語言編碼實現,主要基於raft論文。做完之後,可以對raft協議有比較細緻的理解,也能了解實現分散式系統的犄角旮旯之處。至於其它的一堆論文,如果沒有實戰其實不容易理解那麼深刻,不求深入的話,泛讀即可或者精讀若干片,以後有機會再深入。編程過程中可以先自己實現一遍,如果實在有細節沒法搞定的話再去看看別人的實現,琢磨明白,然後自己把測試都通過了也能達到理解的目的。有興趣的才學這門課,應該能堅持下來
做過2015年的,主要是跟著schedule讀論文,內容涉及分散式演算法,一致性問題,還有一些系統介紹。其中有一些課程油管上有學生在課堂上拍的視頻,可以結合課程內容拿來看看,加深理解。
實驗部分和課程內容關係不大,骨架部分基本是現成提供的,自己寫方法完成邏輯部分就好,在paxos的基礎上完成一個簡單的分散式鍵值資料庫。個人感覺最難的部分在第四個實驗,需要自己設計數據遷移的流程。
當時是剛開始接觸分散式,實驗部分完成後收穫不小,尤其是對於多線程並發編程,因為並發一致性問題很容易就會使測試常式不能準確執行,而debug時問題往往又不是很容易定位。6.824 這是我根據2017的課件做的作業
chaozh/MIT-6.824-2017 有個QQ群,大家一塊學吧,確實有一定挑戰
多查查,有很多過去的homework在github上,實在不會寫可以翻翻別人的實現。順別吐槽12年的project貌似已經不能用了。
推薦閱讀:
※請問哪位大神比較過spring cloud和dubbo,各自的優缺點是什麼?
※「分散式」「集群」「雲計算」三者是什麼區別呢?
※請問有沒有分散式系統、並行計算的優秀網站,期刊,論壇,課程,以及函數庫?
※有什麼關於pregel的論文或者演算法值得一讀?