分散式系統基礎理論(一)
來自專欄一個後端工程師的獨白14 人贊了文章
Distributed systems theory for the distributed systems engineer,這是一篇博客,本文主要是概述作者的思想。
- 意圖
跟作者在同一公司的一個小伙在Twitter上發了一個問題,如下:
I need to improve my proficiency in distributed systems theory.Where do I start? Any recommended books?
這引發了他的思考:
- 他一開始想推薦一大堆的經典Paper給那位小伙,但是轉念一想,這些材料看一遍至少需要半年的時間(如果你聰明和勤奮的話);
- 這些Paper是很有深度的,不但需要閱讀者有一定的經驗,還需要認真的研究和琢磨(深有同感,更可怕的是,即使你沒有任何分散式理論基礎,看完後,你也以為你看懂了);
- 優秀的分散式系統理論資料也不多。
感想:第一次接觸分散式系統當屬openstack swift了,當時對分散式的理解幾乎為零。就知道一些名詞,什麼可用性、可靠性、可擴展性、CAP,最終一致性,強一致性呀。由於沒有中文資料,當時啃項目官網的資料都要啃吐了,那個ring到底是要幹啥呀?後來加上各種實驗慢慢知道它的工作原理了。當時以為自己懂了,過了一年後再來看dynamo論文,才知道原來背後隱藏著這麼多理論呀。可笑自己當時還敢說了解分散式系統。
於是他準備換一種思路,分散式系統工程師到底需要掌握哪些分散式系統理論(Distributed systems theory for the distributed systems engineer) ?這些理論知識一定是最基礎的分散式系統理論,這些知識不但可以滿足分散式系統工程師的日常工作,還可以據此設計新的分散式系統。於是他列出了一堆內容(其實量也不小)。大概是Fiest Step部分是分散式系統理論的基礎知識;後面的部分是這些基礎知識的詳細描述(是一堆堆的論文);最後是理論用於實踐,作者推薦了經典的分散式系統實踐論文。
強烈推薦下面這本材料,內容豐富又不失樂趣,共計68頁。
Distributed Systems for Fun and Profit這本書共計五部分。
1. Basic。作者深入淺出的介紹了分布系統中的重要術語和概念。包括,scalability,availability, performance,latency and fault tolerance,partition and replication。
2. Up and down the level of abstraction。分散式系統要想同時滿足上面的指標,難點在哪裡?作者介紹了兩大經典理論:FLP和CAP。設計者一般會做出一些權衡,比如,為了滿足一致性(consistency),假設網路是穩定且可靠地,這樣的系統很可能失去了可擴展性(scalability)。這些權衡和取捨,就稱為系統模型(System model)。
3. Time and order。我們知道,在分散式系統中數據傳輸是非同步的且不可靠的,且網路傳輸時延可以任意長。一個很好比喻兩個主機之間的通信:你通過天文望遠鏡在浩瀚的銀河系中觀察到了一個行星,當你看到時,這個行星可能已經發生了翻天覆地的變化,或者已經不存在了。每台機器看到的事件發生的時序都是偏序(partial order)而非全序(total order),每天機器只能確認各自機器上發生的事件的順序,但是無法將自己機器上的事件與其它機器上的事件比較時序。這是分散式系統困難面臨的最大問題之一(另一個是failure)。關於時序問題的解決方法,有兩篇重要論文:Lamport clocks和Vector clocks。
4. Replication:preventing divergence。因為高可靠,所以需要複製數據,又因為存在各種失敗,數據有可能會出現不一致。複製方式主要有兩種:同步複製和非同步複製。同步複製的演進過程:2PC-->3PC-->Paxos-->Raft,非同步複製的代表如Dynamo。
5. Replication:acceptin divergence。主要介紹了CRDT和CALM演算法。
接下來,逐一介紹每個章節。
我們知道TCP協議是可靠的,而且有重傳機製做保證,為什麼說分散式系統中網路傳輸是不可靠的?
當應用程序通過調用系統函數send發送一個TCP數據流時,函數返回成功,但是這僅僅意味著該消息被本機的網路協議棧所接收。即使數據被對端的網路協議棧所接收,並返回確認包,也僅僅以為這數據到達了對端的協議棧。不能假設對端上層應用已經接收並正確處理。所以,消息是可能丟失的。
當應用程序並發發送多個消息時,兩端的機器就建立了多條TCP連接,所以消息的發送順序與接收順序是可能存在不一致的。即,消息是可能亂序的。
推薦閱讀:
※架構師之路-分散式鎖
※服務發現的基本原理
※TiDB 源碼閱讀系列文章(十一)Index Lookup Join
※FastDFS分散式文件系統安裝與使用