前段時間,我寫了一系列分布式系統(tǒng)架構(gòu)方面的文章(拉到文末看目錄),有很多讀者紛紛留言討論相關(guān)的話題,還有讀者留言表示對分布式系統(tǒng)架構(gòu)這個主題感興趣,希望我能推薦一些學(xué)習(xí)資料。
就像我在前面的文章中多次提到的,分布式系統(tǒng)的技術(shù)棧巨大無比,所以我要推薦的學(xué)習(xí)資料也比較多,會在后面的文章中陸續(xù)發(fā)出。在今天這篇文章中,我將推薦一些分布式系統(tǒng)的基礎(chǔ)理論和一些不錯的圖書和資料。
這篇文章比較長,所以我特意整理了目錄,幫你快速找到自己感興趣的內(nèi)容。
基礎(chǔ)理論部分
CAP 定理
Fallacies of Distributed Computing
經(jīng)典資料部分
Distributed systems theory for the distributed systems engineer
FLP Impossibility Result
An introduction to distributed systems
Distributed Systems for fun and profit
Distributed Systems: Principles and Paradigms
Scalable Web Architecture and Distributed Systems
Principles of Distributed Systems
Making reliable distributed systems in the presence of software errorsDesigning Data Intensive Applications
下面這些基礎(chǔ)知識有可能你已經(jīng)知道了,不過還是容我把其分享在這里。我希望用比較通俗易懂的文字將這些枯燥的理論知識講請楚。
CAP 定理是分布式系統(tǒng)設(shè)計中最基礎(chǔ),也是最為關(guān)鍵的理論。它指出,分布式數(shù)據(jù)存儲不可能同時滿足以下三個條件。
一致性(Consistency):每次讀取要么獲得最近寫入的數(shù)據(jù),要么獲得一個錯誤。
可用性(Availability):每次請求都能獲得一個(非錯誤)響應(yīng),但不保證返回的是最新寫入的數(shù)據(jù)。
分區(qū)容忍(Partition tolerance):盡管任意數(shù)量的消息被節(jié)點間的網(wǎng)絡(luò)丟失(或延遲),系統(tǒng)仍繼續(xù)運行。
也就是說,CAP 定理表明,在存在網(wǎng)絡(luò)分區(qū)的情況下,一致性和可用性必須二選一。而在沒有發(fā)生網(wǎng)絡(luò)故障時,即分布式系統(tǒng)正常運行時,一致性和可用性是可以同時被滿足的。這里需要注意的是,CAP 定理中的一致性與 ACID 數(shù)據(jù)庫事務(wù)中的一致性截然不同。
掌握 CAP 定理,尤其是能夠正確理解 C、A、P 的含義,對于系統(tǒng)架構(gòu)來說非常重要。因為對于分布式系統(tǒng)來說,網(wǎng)絡(luò)故障在所難免,如何在出現(xiàn)網(wǎng)絡(luò)故障的時候,維持系統(tǒng)按照正常的行為邏輯運行就顯得尤為重要。你可以結(jié)合實際的業(yè)務(wù)場景和具體需求,來進行權(quán)衡。
例如,對于大多數(shù)互聯(lián)網(wǎng)應(yīng)用來說(如門戶網(wǎng)站),因為機器數(shù)量龐大,部署節(jié)點分散,網(wǎng)絡(luò)故障是常態(tài),可用性是必須要保證的,所以只有舍棄一致性來保證服務(wù)的 AP。而對于銀行等,需要確保一致性的場景,通常會權(quán)衡 CA 和 CP 模型,CA 模型網(wǎng)絡(luò)故障時完全不可用,CP 模型具備部分可用性。
CA (consistency + availability),這樣的系統(tǒng)關(guān)注一致性和可用性,它需要非常嚴格的全體一致的協(xié)議,比如“兩階段提交”(2PC)。CA 系統(tǒng)不能容忍網(wǎng)絡(luò)錯誤或節(jié)點錯誤,一旦出現(xiàn)這樣的問題,整個系統(tǒng)就會拒絕寫請求,因為它并不知道對面的那個結(jié)點是否掛掉了,還是只是網(wǎng)絡(luò)問題。唯一安全的做法就是把自己變成只讀的。
CP (consistency + partition tolerance),這樣的系統(tǒng)關(guān)注一致性和分區(qū)容忍性。它關(guān)注的是系統(tǒng)里大多數(shù)人的一致性協(xié)議,比如:Paxos 算法 (Quorum 類的算法)。這樣的系統(tǒng)只需要保證大多數(shù)結(jié)點數(shù)據(jù)一致,而少數(shù)的結(jié)點會在沒有同步到最新版本的數(shù)據(jù)時變成不可用的狀態(tài)。這樣能夠提供一部分的可用性。
AP (availability + partition tolerance),這樣的系統(tǒng)關(guān)心可用性和分區(qū)容忍性。因此,這樣的系統(tǒng)不能達成一致性,需要給出數(shù)據(jù)沖突,給出數(shù)據(jù)沖突就需要維護數(shù)據(jù)版本。Dynamo 就是這樣的系統(tǒng)。
然而,還是有一些人會錯誤地理解 CAP 定理,甚至誤用。Cloudera 工程博客中,CAP Confusion: Problems with ‘partition tolerance’一文中對此有詳細的闡述。
在谷歌的 Transaction Across DataCenter 視頻中,我們可以看到下面這樣的圖。這個是 CAP 理論在具體工程中的體現(xiàn)。
本文是英文維基百科上的一篇文章。它是 Sun 公司的勞倫斯·彼得·多伊奇(Laurence Peter Deutsch)等人于 1994~1997 年提出的,講的是剛剛進入分布式計算領(lǐng)域的程序員常會有的一系列錯誤假設(shè)。
多伊奇于 1946 年出生在美國波士頓。他創(chuàng)辦了阿拉丁企業(yè)(Aladdin Enterprises),并在該公司編寫出了著名的 Ghostscript 開源軟件,于 1988 年首次發(fā)布。
他在學(xué)生時代就和艾倫·凱(Alan Kay)等比他年長的人一起開發(fā)了 Smalltalk,并且他的開發(fā)成果激發(fā)了后來 Java 語言 JIT 編譯技術(shù)的創(chuàng)造靈感。他后來在 Sun 公司工作并成為 Sun 的公司院士。在 1994 年,他成為了 ACM 院士。
基本上,每個人剛開始建立一個分布式系統(tǒng)時,都做了以下 8 條假定。隨著時間的推移,每一條都會被證明是錯誤的,也都會導(dǎo)致嚴重的問題,以及痛苦的學(xué)習(xí)體驗。
網(wǎng)絡(luò)是穩(wěn)定的。
網(wǎng)絡(luò)傳輸?shù)难舆t是零。
網(wǎng)絡(luò)的帶寬是無窮大。
網(wǎng)絡(luò)是安全的。
網(wǎng)絡(luò)的拓撲不會改變。
只有一個系統(tǒng)管理員。
傳輸數(shù)據(jù)的成本為零。
整個網(wǎng)絡(luò)是同構(gòu)的。
阿爾農(nóng)·羅特姆 - 蓋爾 - 奧茲(Arnon Rotem-Gal-Oz)寫了一篇長文 Fallacies of Distributed Computing Explained 來解釋這些點。
由于他寫這篇文章的時候已經(jīng)是 2006 年了,所以從中能看到這 8 條常見錯誤被提出十多年后還有什么樣的影響:一是,為什么當(dāng)今的分布式軟件系統(tǒng)也需要避免這些設(shè)計錯誤;二是,在當(dāng)今的軟硬件環(huán)境里,這些錯誤意味著什么。比如,文中在談“延遲為零”假設(shè)時,還談到了 AJAX,而這是 2005 年開始流行的技術(shù)。
而加勒思·威爾遜(Gareth Wilson)的文章則用日常生活中的例子,對這些點做了更為通俗的解釋。
這 8 個需要避免的錯誤不僅對于中間件和底層系統(tǒng)開發(fā)者及架構(gòu)師是重要的知識,而且對于網(wǎng)絡(luò)應(yīng)用程序開發(fā)者也同樣重要。分布式系統(tǒng)的其他部分,如容錯、備份、分片、微服務(wù)等也許可以對應(yīng)用程序開發(fā)者部分透明,但這 8 點則是應(yīng)用程序開發(fā)者也必須知道的。
為什么我們要深刻地認識這 8 個錯誤?是因為,這要我們清楚地認識到——在分布式系統(tǒng)中錯誤是不可能避免的,我們能做的不是避免錯誤,而是要把錯誤的處理當(dāng)成功能寫在代碼中。
后面,我會寫一個系列的文章來談一談,分布式系統(tǒng)容錯設(shè)計中的一些常見設(shè)計模式。敬請關(guān)注!
本文作者認為,推薦大量的理論論文是學(xué)習(xí)分布式系統(tǒng)理論的錯誤方法,除非這是你的博士課程。因為論文通常難度大又很復(fù)雜,需要認真學(xué)習(xí),而且需要理解這些研究成果產(chǎn)生的時代背景,才能真正的領(lǐng)悟到其中的精妙之處。
在本文中,作者給出了他整理的分布式工程師必須要掌握的知識列表,并直言掌握這些足夠設(shè)計出新的分布式系統(tǒng)。首先,作者推薦了 4 份閱讀材料,它們共同概括了構(gòu)建分布式系統(tǒng)的難點,以及所有工程師必須克服的技術(shù)難題。
Distributed Systems for Fun and Profit,這是一本小書,涵蓋了分布式系統(tǒng)中的關(guān)鍵問題,包括時間的作用和不同的復(fù)制策略。后文中對這本書有較詳細的介紹。
Notes on distributed systems for young bloods,這篇文章中沒有理論,是一份適合新手閱讀的分布式系統(tǒng)實踐筆記。
A Note on Distributed Systems,這是一篇經(jīng)典的論文,講述了為什么在分布式系統(tǒng)中,遠程交互不能像本地對象那樣進行。
The fallacies of distributed computing,每個分布式系統(tǒng)新手都會做的 8 個錯誤假設(shè),并探討了其會帶來的影響。上文中專門對這篇文章做了介紹。
隨后,分享了幾個關(guān)鍵點。
失敗和時間(Failure and Time)。分布式系統(tǒng)工程師面臨的很多困難都可以歸咎于兩個根本原因:1. 進程可能會失??;2. 沒有好方法表明進程失敗。這就涉及到如何設(shè)置系統(tǒng)時鐘,以及進程間的通訊機制,在沒有任何共享時鐘的情況下,如何確定一個事件發(fā)生在另一個事件之前??梢詤⒖?Lamport 時鐘和 Vector 時鐘,還可以看看 Dynamo 論文。
容錯的壓力(The basic tension of fault tolerance)。能在不降級的情況下容錯的系統(tǒng)一定要像沒有錯誤發(fā)生的那樣運行。這就意味著,系統(tǒng)的某些部分必須冗余地工作,從而在性能和資源消耗兩方面帶來成本。
最終一致性以及其他技術(shù)方案在以系統(tǒng)行為弱保證為代價,來試圖避免這種系統(tǒng)壓力。閱讀 Dynamo 論文和帕特·赫爾蘭(Pat Helland)的經(jīng)典論文 Life Beyond Transactions 能獲很得大啟發(fā)。
基本原語(Basic primitives)。在分布式系統(tǒng)中幾乎沒有一致認同的基本構(gòu)建模塊,但目前在越來越多地在出現(xiàn)。比如 Leader 選舉,可以參考Bully 算法;分布式狀態(tài)機復(fù)制,可以參考維基百科和 Lampson 的論文,后者更權(quán)威,只是有些枯燥。
基本結(jié)論(Fundamental Results)。某些事實是需要吸收理解的,有幾點:如果進程之間可能丟失某些消息,那么不可能在實現(xiàn)一致性存儲的同時響應(yīng)所有的請求,這就是 CAP 定理;一致性不可能同時滿足以下條件:a. 總是正確,b. 在異步系統(tǒng)中只要有一臺機器發(fā)生故障,系統(tǒng)總是能終止運行——停止失?。‵LP 不可能性);一般而言,消息交互少于兩輪都不可能達成共識(Consensus)。
真實系統(tǒng)(Real systems)。學(xué)習(xí)分布式系統(tǒng)架構(gòu)最重要的是,結(jié)合一些真實系統(tǒng)的描述,反復(fù)思考和點評其背后的設(shè)計決策。如谷歌的 GFS、Spanner、Chubby、BigTable、Dapper 等,以及 Dryad、Cassandra 和 Ceph 等非谷歌系統(tǒng)。
FLP 不可能性的名稱起源于它的三位作者,F(xiàn)ischer、Lynch 和 Paterson。它是關(guān)于理論上能做出的功能最強的共識算法會受到怎樣的限制的討論。
所謂共識問題,就是讓網(wǎng)絡(luò)上的分布式處理者最后都對同一個結(jié)果值達成共識。該解決方案對錯誤有恢復(fù)能力,處理者一旦崩潰以后,就不再參與計算。在同步環(huán)境下,每個操作步驟的時間和網(wǎng)絡(luò)通信的延遲都是有限的,要解決共識問題是可能的,方式是:等待一個完整的步長來檢測某個處理者是否已失敗。如果沒有收到回復(fù),那就假定它已經(jīng)崩潰。
共識問題有幾個變種,它們在“強度”方面有所不同——通常,一個更“強”問題的解決方案同時也能解決比該問題更“弱”的問題。共識問題的一個較強的形式如下。
給出一個處理者的集合,其中每一個處理者都有一個初始值:
所有無錯誤的進程(處理過程)最終都將決定一個值;
所有會做決定的無錯誤進程決定的都將是同一個值;
最終被決定的值必須被至少一個進程提出過。
這三個特性分別被稱為“終止”、“一致同意”和“有效性”。任何一個具備這三點特性的算法都被認為是解決了共識問題。
FLP 不可能性則討論了異步模型下的情況,主要結(jié)論有兩條。
在異步模型下不存在一個完全正確的共識算法。不僅上述較“強”形式的共識算法不可能實現(xiàn),F(xiàn)LP 還證明了比它弱一些的、只需要有一些無錯誤的進程做決定就足夠的共識算法也是不可能實現(xiàn)的。
在異步模型下存在一個部分正確的共識算法,前提是所有無錯誤的進程都總能做出一個決定,此外沒有進程會在它的執(zhí)行過程中死亡,并且初始情況下超過半數(shù)進程都是存活狀態(tài)。
FLP 的結(jié)論是,在異步模型中,僅一個處理者可能崩潰的情況下,就已經(jīng)沒有分布式算法能解決共識問題。這是該問題的理論上界。其背后的原因在于,異步模型下對于一個處理者完成工作然后再回復(fù)消息所需的時間并沒有上界。因此,無法判斷出一個處理者到底是崩潰了,還是在用較長的時間來回復(fù),或者是網(wǎng)絡(luò)有很大的延遲。
FLP 不可能性對我們還有別的啟發(fā)。一是網(wǎng)絡(luò)延遲很重要,網(wǎng)絡(luò)不能長時間處于擁塞狀態(tài),否則共識算法將可能因為網(wǎng)絡(luò)延遲過長而導(dǎo)致超時失敗。二是計算時間也很重要。對于需要計算共識的處理過程(進程),如分布式數(shù)據(jù)庫提交,需要在短時間里就計算出能否提交的結(jié)果,那就要保證計算結(jié)點資源充分,特別是內(nèi)存容量、磁盤空閑時間和 CPU 時間方面要足夠,并在軟件層面確保計算不超時。
另一個問題是,像 Paxos 這樣的共識算法為什么可行?實際上它并不屬于 FLP 不可能性證明中所說的“完全正確”的算法。它的正確性會受超時值的影響。但這并不妨礙它在實踐中有效,因為我們可以通過避免網(wǎng)絡(luò)擁塞等手段來保證超時值是合適的。
它是分布式系統(tǒng)基礎(chǔ)課的課程提綱,也是一份很棒的分布式系統(tǒng)介紹,幾乎涵蓋了所有知識點,并輔以簡潔并切中要害的說明文字,非常適合初學(xué)者提綱挈領(lǐng)地了解知識全貌,快速與現(xiàn)有知識結(jié)合,形成知識體系。此外,還可以把它作為分布式系統(tǒng)的知識圖譜,根據(jù)其中列出的知識點一一搜索,你能學(xué)會所有的東西。
這是一本免費的電子書。作者撰寫此書的目的是希望以一種更易于理解的方式,講述以亞馬遜的 Dynamo、谷歌的 BigTable 和 MapReduce 等為代表的分布式系統(tǒng)背后的核心思想。
因而,書中著力撰寫分布式系統(tǒng)中的關(guān)鍵概念,以便讓讀者能夠快速了解最為核心的知識,并且進行了足夠詳實的講述,方便讀者體會和理解,又不至于陷入細節(jié)。
全書分為五章,講述了擴展性、可用性、性能和容錯等基礎(chǔ)知識,F(xiàn)LP 不可能性和 CAP 定理,探討了大量的一致性模型;討論了時間和順序,及時鐘的各種用法。隨后,探討了復(fù)制問題,如何防止差異,以及如何接受差異。此外,每章末尾都給出了針對本章內(nèi)容的擴展閱讀資源列表,這些資料是對本書內(nèi)容的很好補充。
本書是由計算機科學(xué)家安德魯·斯圖爾特·塔能鮑姆(Andrew S. Tanenbaum)和其同事馬丁·范·斯蒂恩(Martin van Steen)合力撰寫的,是分布式系統(tǒng)方面的經(jīng)典教材。
語言簡潔,內(nèi)容通俗易懂,介紹了分布式系統(tǒng)的七大核心原理,并給出了大量的例子;系統(tǒng)講述了分布式系統(tǒng)的概念和技術(shù),包括通信、進程、命名、同步化、一致性和復(fù)制、容錯以及安全等;討論了分布式應(yīng)用的開發(fā)方法(即范型)。
但本書不是一本指導(dǎo)“如何做”的手冊,僅適合系統(tǒng)性地學(xué)習(xí)基礎(chǔ)知識,了解編寫分布式系統(tǒng)的基本原則和邏輯。中文翻譯版為《分布式系統(tǒng)原理與范型》(第二版)。
這是一本免費的在線小冊子,其中文翻譯版為可擴展的 Web 架構(gòu)和分布式系統(tǒng)。
本書主要針對面向的互聯(lián)網(wǎng)(公網(wǎng))的分布式系統(tǒng),但其中的原理或許也可以應(yīng)用于其他分布式系統(tǒng)的設(shè)計中。作者的觀點是,通過了解大型網(wǎng)站的分布式架構(gòu)原理,小型網(wǎng)站的構(gòu)建也能從中受益。本書從大型互聯(lián)網(wǎng)系統(tǒng)的常見特性,如高可用、高性能、高可靠、易管理等出發(fā),引出了一個類似于 Flickr 的典型的大型圖片網(wǎng)站的例子。
首先,從程序模塊化易組合的角度出發(fā),引出了面向服務(wù)架構(gòu)(SOA)的概念。同時,引申出寫入和讀取兩者的性能問題,及對此二者如何調(diào)度的考量——在當(dāng)今的軟硬件架構(gòu)上,寫入幾乎總是比讀取更慢,包括軟件層面引起的寫入慢(如數(shù)據(jù)庫的一致性要求和 B 樹的修改)和硬件層面引起的寫入慢(如 SSD)。
網(wǎng)絡(luò)提供商提供的下載帶寬也通常比上傳帶寬更大。讀取往往可以異步操作,還可以做 gzip 壓縮。寫入則往往需要保持連接直到數(shù)據(jù)上傳完成。因此,往往我們會想把服務(wù)做成讀寫分離的形式。然后通過一個 Flickr 的例子,介紹了他們的服務(wù)器分片式集群做法。
接下來講了冗余。數(shù)據(jù)的冗余異地備份(如 master-slave)、服務(wù)的多版本冗余、避免單點故障等。
隨后,在冗余的基礎(chǔ)上,講了多分區(qū)擴容,亦即橫向擴容。橫向擴容是在單機容量無法滿足需求的情況下不得不做的設(shè)計。但橫向擴容會帶來一個問題,即數(shù)據(jù)的局域性會變差。本來數(shù)據(jù)可以存在于同一臺服務(wù)器上,但現(xiàn)在數(shù)據(jù)不得不存在于不同服務(wù)器上,潛在地降低了系統(tǒng)的性能(主要是可能延長響應(yīng)時間)。另一個問題是多份數(shù)據(jù)的不一致性。
之后,本書開始深入講解數(shù)據(jù)訪問層面的設(shè)計。首先拋出一個大型數(shù)據(jù)(TB 級以上)的存儲問題。如果內(nèi)存都無法緩存該數(shù)據(jù)量,性能將大幅下降,那么就需要緩存數(shù)據(jù)。數(shù)據(jù)可以緩存在每個節(jié)點上。
但如果為所有節(jié)點使用負載均衡,那么分配到每個節(jié)點的請求將十分隨機,大大降低緩存命中率,從而導(dǎo)致低效的緩存。接下來考慮全局緩存的設(shè)計。再接下來考慮分布式緩存的設(shè)計。進一步,介紹了 Memcached,以及 Facebook 的緩存設(shè)計方案。
代理服務(wù)器則可以用于把多個重復(fù)請求合并成一個,對于公網(wǎng)上的公共服務(wù)來說,這樣做可以大大減少對數(shù)據(jù)層訪問的次數(shù)。Squid 和 Varnish 是兩個可用于生產(chǎn)的代理服務(wù)軟件。
當(dāng)知道所需要讀取的數(shù)據(jù)的元信息時,比如知道一張圖片的 URL,或者知道一個要全文搜索的單詞時,索引就可以幫助找到那幾臺存有該信息的服務(wù)器,并從它們那里獲取數(shù)據(jù)。文中擴展性地討論了本話題。
接下來談負載均衡器,以及一些典型的負載均衡拓撲。然后討論了對于用戶會話數(shù)據(jù)如何處理。比如,對于電子商務(wù)網(wǎng)站,用戶的購物車在沒有下單之前都必須保持有效。
一種辦法是讓用戶會話與服務(wù)器產(chǎn)生關(guān)聯(lián),但這樣做會較難實現(xiàn)自動故障轉(zhuǎn)移,如何做好是個問題。另外,何時該使用負載均衡是個問題。有時節(jié)點數(shù)量少的情況下,只要使用輪換式 DNS 即可。負載均衡也會讓在線性能問題的檢測變得更麻煩。
對于寫入的負載,可以用隊列的方式來減少對服務(wù)器的壓力,保證服務(wù)器的效率。消息隊列的開源實現(xiàn)有很多,如 RabbitMQ、ActiveMQ、BeanstalkD,但有些隊列方案也使用了如 Zookeeper,甚至是像 Redis 這樣的存儲服務(wù)。
本書主要講述了高性能互聯(lián)網(wǎng)分布式服務(wù)的架構(gòu)方案,并介紹了許多實用的工具。作者指出這是一個令人興奮的設(shè)計領(lǐng)域,雖然只講了一些皮毛,但這一領(lǐng)域不僅現(xiàn)在有很多創(chuàng)新,將來也會越來越多。
本書是蘇黎世聯(lián)邦理工學(xué)院的教材。它講述了多種分布式系統(tǒng)中會用到的算法。雖然分布式系統(tǒng)的不同場景會用到不同算法,但并不表示這些算法都會被用到。不過,對于學(xué)生來說,掌握了算法設(shè)計的精髓也就能舉一反三地設(shè)計出解決其他問題的算法,從而得到分布式系統(tǒng)架構(gòu)設(shè)計中所需的算法。
本書覆蓋的算法有:
頂點涂色算法(可用于解決互相沖突的任務(wù)分配問題)
分布式的樹算法(廣播算法、會聚算法、廣度優(yōu)先搜索樹算法、最小生成樹算法)
容錯以及 Paxos(Paxos 是最經(jīng)典的共識算法之一)
拜占庭協(xié)議(節(jié)點可能沒有完全宕機,而是輸出錯誤的信息)
全互聯(lián)網(wǎng)絡(luò)(服務(wù)器兩兩互聯(lián)的情況下算法的復(fù)雜度)
多核計算的工程實踐(事務(wù)性存儲、資源爭用管理)
主導(dǎo)集(又一個用隨機化算法打破對稱性的例子;這些算法可以用于路由器建立路由)
……
這些算法對你邁向更高級更廣闊的技術(shù)領(lǐng)域真的相當(dāng)有幫助的。
這本書的書名直譯過來是在有軟件錯誤的情況下,構(gòu)建可靠的分布式系統(tǒng),Erlang 之父喬·阿姆斯特朗(Joe Armstrong)的力作。書中撰寫的內(nèi)容是從 1981 年開始的一個研究項目的成果,這個項目是尋找更好的電信應(yīng)用編程方式。
當(dāng)時的電信應(yīng)用都是大型程序,雖然經(jīng)過了仔細的測試,但投入使用時程序中仍會存在大量的錯誤。作者及其同事假設(shè)這些程序中確實有錯誤,然后想法設(shè)法在這些錯誤存在的情況下構(gòu)建可靠的系統(tǒng)。他們測試了所有的編程語言,沒有一門語言擁有電信行業(yè)所需要的所有特性,所以促使一門全新的編程語言 Erlang 的開發(fā),以及隨之出現(xiàn)的構(gòu)建健壯系統(tǒng)(OTP)的設(shè)計方法論和庫集。
書中抽象了電信應(yīng)用的所有需求,定義了問題域,講述了系統(tǒng)構(gòu)建思路——模擬現(xiàn)實,簡單通用,并給出了指導(dǎo)規(guī)范。阿姆斯特朗認為,在存在軟件錯誤的情況下,構(gòu)建可靠系統(tǒng)的核心問題可以通過編程語言或者編程語言的標準庫來解決。所以本書有很大的篇幅來介紹 Erlang,以及如何運用其構(gòu)建具有容錯能力的電信應(yīng)用。
雖然書中的內(nèi)容是以構(gòu)建 20 世紀 80 年代的電信系統(tǒng)為背景,但是這種大規(guī)模分布式的系統(tǒng)開發(fā)思路,以及對系統(tǒng)容錯能力的核心需求,與互聯(lián)網(wǎng)時代的分布式系統(tǒng)架構(gòu)思路出奇一致。書中對問題的抽象、總結(jié),以及解決問題的思路和方案,有深刻的洞察和清晰的闡釋,所以此書對現(xiàn)在的項目開發(fā)和架構(gòu)有極強的指導(dǎo)和借鑒意義。
這是一本非常好的書。我們知道,在分布式的世界里,數(shù)據(jù)結(jié)點的擴展是一件非常麻煩的事。而這本書則深入淺出地用很多工程案例講解了如何讓數(shù)據(jù)結(jié)點做擴展。
作者馬丁·科勒普曼(Martin Kleppmann)在分布式數(shù)據(jù)系統(tǒng)領(lǐng)域有著很深的功底,并在這本書中完整地梳理各類紛繁復(fù)雜設(shè)計背后的技術(shù)邏輯,不同架構(gòu)之間的妥協(xié)與超越,很值得開發(fā)人員與架構(gòu)設(shè)計者閱讀。
這本書深入到 B-Tree、SSTables、LSM 這類數(shù)據(jù)存儲結(jié)構(gòu)中,并且從外部的視角來審視這些數(shù)據(jù)結(jié)構(gòu)對 NoSQL 和關(guān)系型數(shù)據(jù)庫所產(chǎn)生的影響。它可以讓你很清楚地了解到真正世界的大數(shù)據(jù)架構(gòu)中的數(shù)據(jù)分區(qū)、數(shù)據(jù)復(fù)制的一些坑,并提供了很好的解決方案。
最贊的是,作者將各種各樣的技術(shù)的本質(zhì)非常好地關(guān)聯(lián)在一起,幫你觸類旁通。而且抽絲剝繭,循循善誘,從“提出問題”,到“解決問題”,到“解決方案”,再到“優(yōu)化方案”和“對比不同的方案”,一點一點地把非常晦澀的技術(shù)和知識展開。
本書的引用相當(dāng)多,每章后面都有幾百個 Reference。通過這些 Reference,你可以看到更為廣闊更為精彩的世界。
這本書是 2017 年 3 月份出版的,目前還沒有中譯版,不過英文也不難讀。非常推薦。這里有這本書的 PPT,你可從這個 PPT 中管中窺豹一下。
在今天的文章中,我給出了一些分布式系統(tǒng)的基礎(chǔ)理論知識和幾本很不錯的圖書和資料,需要慢慢消化吸收。也許你看到這么龐大的書單和資料列表有點望而卻步,但是我真的希望你能夠花點時間來看看這些資料。相信你看完這些資料后,一定能上一個新的臺階。再加上一些在工程項目中的實踐,我保證你,一定能達到大多數(shù)人難以企及的技術(shù)境界。
自從 2002 年開始接觸分布式計算系統(tǒng)至今,我學(xué)習(xí)分布式系統(tǒng)已經(jīng)有 15 年了,發(fā)現(xiàn)還有很多東西還要繼續(xù)學(xué)習(xí)。是的,學(xué)無止境啊。如果你想成為一名很不錯的架構(gòu)師,你一定要好好學(xué)習(xí)這些知識。
左耳朵耗子的《分布式系統(tǒng)架構(gòu)的本質(zhì)》系列文章一共有九篇,目錄如下,繼續(xù)閱讀請掃碼訂閱專欄(支持微信支付)。一次訂閱,永久閱讀,還可以隨時在評論區(qū)與左耳朵耗子、資深編輯和同學(xué)們交流!
聯(lián)系客服