課程背景
構(gòu)建分布式系統(tǒng)的原因:
- Parallelism,資源并行(提高效率)。
- Fault tolerance,容錯。
- Physical,系統(tǒng)內(nèi)在的物理分散。
- Security,不可信對端(區(qū)塊鏈)。
分布式系統(tǒng)面臨的挑戰(zhàn):
- Concurrency,系統(tǒng)構(gòu)件很多,并行繁雜,交互復(fù)雜。
- Partial failure,存在部分失敗,而不是像單機(jī)一樣要么正常運(yùn)行,要么完全宕機(jī)。
- Performance,精巧設(shè)計才能獲取與機(jī)器數(shù)量線性相關(guān)的性能。
課程組成
Lectures,授課,一些案例學(xué)習(xí)。
-
Papers,論文。
- 包括一些經(jīng)典的和前沿的、學(xué)術(shù)的和工業(yè)界的。
- 看其觀點(diǎn),學(xué)其實(shí)現(xiàn),斷其性能。
- 抓重要部分,略次要部分。
- 課程主頁有所有論文鏈接。
Exams,期中期末兩次考試。
-
Labs:四個實(shí)驗(yàn)
- lab1: MapReduce
- lab2: Raft 容錯
- lab3: K/V server use Raft
- lab4: Shared K/V based on lab3
分布式系統(tǒng)巨難調(diào)試,做好心理準(zhǔn)備,早點(diǎn)開做。
Project,可以自選相關(guān)題目,組隊完成,用來替代 lab4。
課程內(nèi)容
本課程旨在學(xué)習(xí)支撐應(yīng)用的基礎(chǔ)設(shè)施抽象(abstraction),包括
- Storage,存儲,一個很直接并常用的抽象;如何構(gòu)建多副本、容錯、高性能分布式存儲系統(tǒng)。
- Communication,通信,如何可靠的通信。
- Computation,現(xiàn)代的大規(guī)模計算,如 MapReduce
最終理想是提供能夠屏蔽分布式細(xì)節(jié)的、類似于單機(jī)的通用接口,同時能兼具容錯和性能。
對于上述抽象,我們有哪些實(shí)現(xiàn)呢?
- RPC:像在本機(jī)調(diào)用一樣跨節(jié)點(diǎn)通信
- Concurrency,Threads:并發(fā)載體
- Concurrency,Lock:并發(fā)控制。
Performance 性能
scalability,可擴(kuò)展性
- 可以線性的集結(jié)計算機(jī)資源:使用兩倍的機(jī)器獲取兩倍的吞吐。
- 意味著遇到瓶頸你只需要花少量的錢買機(jī)器,而不用付很多的工資找程序員重構(gòu)。
- 但這個特點(diǎn)很難實(shí)現(xiàn)。通常你將一個組件擴(kuò)展后,瓶頸就轉(zhuǎn)移到了另一個組件,全組件的無限擴(kuò)展很難。
Fault Tolerance 容錯
單機(jī)雖好,作為上千臺機(jī)器組成的集群來說,故障卻是常態(tài)。比如說:
- 主機(jī)宕機(jī)
- 網(wǎng)絡(luò)抖動
- 交換機(jī)故障
Availability 可用性
Recoverbility 可恢復(fù)性,無干預(yù) 、不影響正確性的可恢復(fù)
手段:
NV storage:持久化
Replication:多副本
Consistency 一致性
分布式系統(tǒng)產(chǎn)生不一致的因素:
- 緩存
- 多副本
不同程度的一致性:
-
強(qiáng)一致性:每個客戶端每次都能讀到(自己 or 他人)之前所寫數(shù)據(jù)。在多副本系統(tǒng)實(shí)現(xiàn)強(qiáng)一致性代價十分高昂,需要進(jìn)行大量的通信。簡單說兩種方法:
- 每次更改同時寫到所有副本
- 每次讀取都去讀所有副本,使用具有最新時間戳的數(shù)據(jù)。
弱一致性,為了性能,工業(yè)級系統(tǒng)通常選擇弱一致性。
MapReduce
背景
Google (2003 年左右)面對巨量(數(shù)十 T)的索引數(shù)據(jù)和全網(wǎng)結(jié)構(gòu)的數(shù)據(jù),需要找到最重要的網(wǎng)頁??梢院喕癁橐粋€排序問題,但如此數(shù)量級的排序,單機(jī)不是一個可選項。而又不是所有工程師都有手?jǐn)]分布式系統(tǒng)的能力,因此產(chǎn)生了做一個分布式框架的需求,以對應(yīng)用程序員屏蔽分布式環(huán)境細(xì)節(jié):
- 如何將工作高效分配到上千臺機(jī)器上。
- 如何控制數(shù)據(jù)流動。
- 如何進(jìn)行容錯。
工作原理
以 WordCount 為例:
Map: document -> (word, 1)
Shuffle:group by word in Map machine,send each key Range to the corresponding Reduce Machine。
Reduce: List(word, 1) -> (word, count)
術(shù)語體系
任務(wù):Job
工作:Task,分為 Map Task 和 Reduce Task。
工作節(jié)點(diǎn):worker server
工作進(jìn)程:worker process
主節(jié)點(diǎn):master server
存儲配合
為了更好的并行讀寫,需要一個網(wǎng)絡(luò)文件系統(tǒng)來配合輸入和輸出,這就是 GFS(谷歌文件系統(tǒng))。
GFS 可以簡單理解為,一個將大文件拆為一個個小的 64M 的塊分散到不同機(jī)器上網(wǎng)絡(luò)文件系統(tǒng)。
網(wǎng)絡(luò)開銷
為了盡量繞開當(dāng)時的主要瓶頸(網(wǎng)絡(luò)傳輸),Google 做了一系列優(yōu)化,包括 GFS 和 MR 跑在一個集群上,以減少讀取和寫入數(shù)據(jù)的網(wǎng)絡(luò)傳輸。具體做法是讓 Map 任務(wù)(Map Task)去找數(shù)據(jù)(Block)—— 將 Task 調(diào)度到其輸入所在的機(jī)器上。但對于 Reduce 任務(wù),無論如何都會存在大量網(wǎng)絡(luò)開銷:GFS 對數(shù)據(jù)都進(jìn)行了冗余備份,意味著每個結(jié)果都要寫多次。
不過,時下的數(shù)據(jù)中心可以通過很多手段使得網(wǎng)絡(luò)傳輸?shù)乃俣却蟠筇岣?,比如使用多個根路由器進(jìn)行分?jǐn)偭髁浚馕吨谠O(shè)計時可以有更多靈活性,不用太為網(wǎng)絡(luò)傳輸而優(yōu)化。