原文html
Gwen Shapira曾在Cloudera作工程師,如今宣傳Kafka,他在Twitter問了如下問題,使我有所思考。web
我想在分佈式理論上有所提高。應該從哪開始?有推薦的書?
— Gwen (Chen) Shapira (@gwenshap) August 7, 2014
我第一反應是「能夠看:FLP論文、paxos論文、Byzantine將軍論文」。我推薦的主要閱讀材料,若是你貿然去讀,你至少要閱讀6個月纔會有感受。由此可知,推薦一噸的理論論文讓你閱讀,這是瞭解分佈式系統的錯誤的方式(除非你在讀博士)。 論文通常是深奧、複雜的,並且須要一系列學習和豐富的經驗才能感受到其貢獻、才能把其放到對應的場景(以理解和應用)。算法
工程師瞭解分佈式理論有什麼好處?api
很不幸,幾乎沒有好的引導文章,來總結、提煉、場景化 分佈式系統理論中的重要結論和想法; 特別是 通俗易懂的引導文章 更沒有。
考慮這樣的空白區域,讓我想問另外一個問題:安全
一個分佈式系統工程師應該瞭解什麼樣的分佈式系統理論?app
這種狀況下,瞭解一點點理論並非壞事。我平常工做是一個分佈式系統工程師,下面會給出 我認爲適合個人基本概念 們。
你認爲我缺失的請告知我!cors
下面四個讀物解釋了構建分佈式系統會遇到的困難。這些讀物都勾勒了一些列 抽象而非技術 的困難,分佈式系統工程師必需要克服這些困難。這些讀物的後面章節有更詳細的研究。dom
Distributed Systems for Fun and Profit 是一本小書,它想覆蓋分佈式系統中的一些基本問題,包括 時鐘所起的做用、不一樣策略的複製。異步
Notes on distributed systems for young bloods - 非理論,而是一個很好的實踐,以讓你落到實處。分佈式
A Note on Distributed Systems - 一個經典論文,關於 爲何你不能僞裝全部遠程交互像本地對象同樣。
The fallacies of distributed computing 分佈式計算的8個錯誤的推論,以提醒系統設計者。
你應該知道 安全 和 活力:
分佈式系統工程師面對的許多困難能夠歸結爲如下兩個緣由:
進程間怎麼共用時鐘、什麼樣的失敗能夠檢測、什麼樣的算法和原語能夠被正確實現,這三者之間有很深的聯繫。通常狀況下,咱們假設不一樣節點絕對沒法共用時鐘(時刻值或流過了多少時間).
你應該知道:
一個系統容忍一些錯誤而沒有降級 必須能當成 就像這些錯誤沒有發生過同樣。這意味着系統的一部分要冗餘地工做(一樣的功能部署多個節點),冗餘是絕對必要的,冗餘通常會帶來性能和資源的消耗。這就是給一個系統添加冗餘的基本矛盾。
你應該知道:
(多數派中有一個是主節點,其他爲從節點,以主節點接收到的寫請求序列爲準[即串行],主節點單方面的要求從節點們接受主節點的寫請求序列[從節點不得反抗、不得有異議:從節點是誠實的非惡意的、遵照全局規則的、非拜占庭的])
在分佈式系統中,不多有約定的基本構建塊,更多的是處於造成中的基本構建塊。你應該知道下面的問題是什麼,而且從哪能找到他們的解決方案:
廣播 - 同時發送消息給集羣
* Gossip ([經典論文](http://bitsavers.informatik.uni-stuttgart.de/pdf/xerox/parc/techReports/CSL-89-1_Epidemic_Algorithms_for_Replicated_Database_Maintenance.pdf)) * [因果廣播](https://www.cs.cornell.edu/courses/cs614/2003sp/papers/BSS91.pdf) (也能夠看看 [Birman](https://www.cs.rice.edu/~alc/comp520/papers/Cheriton_Skeen.pdf)和[forth](https://www.cs.princeton.edu/courses/archive/fall07/cos518/papers/catocs-limits-response.pdf) ).
鏈式複製 (將節點們放進一個虛擬鏈表中,從而能夠乾淨的確保寫請求的一致性和順序 ).
有些事實只須要主觀理解(不須要關注證實).
(一個異步系統中,假設節點崩潰後中止而不是奔潰後又恢復;一、要確保結果老是正確的,二、每次寫請求可以在有限時間內返回結果。這兩點無法同時知足:這就是FLP結論)
最重要的、應該不斷重複的實踐是:讀新的、真實的系統的描述,並評價他們設計的決定。 下面是建議的系統:
若是你馴服了這個列表中的全部概念和技術,我很樂意和你聊聊Cloudera的分佈式系統工程師職位。