1. 程式人生 > >[分散式系統學習]閱讀筆記 Distributed systems for fun and profit 之一 基本概念

[分散式系統學習]閱讀筆記 Distributed systems for fun and profit 之一 基本概念

因為工作的原因,最近打算看一些分散式學習的資料。其中這個http://book.mixu.net/distsys/就是一篇非常適合分散式入門的介紹。

這個短小的材料有下面5個小的章節,圖文並茂,也沒有太難的概念,非常推薦。

  1. 基礎知識。主要是一些基本概念,例如可擴充套件性(scalability),可用性(availability)(馬上就要寫成bilibili了),效能(performance),容錯(fault tolerance)。
  2. 上下層的抽象。CAP,敲黑板,這個是個很入門和重要的理論。
  3. 時間和順序。強調了這兩者在分散式系統裡,對一致的重要性。
  4. Replication 副本(不是遊戲裡面的):防止divergence。這個divergence是一致性的死對頭。divergence是什麼,大概是set(k, v)以後,get(k) = v1, v2, ... vn 了吧。
  5. Replication 副本:容忍divergence。如果系統旨在實現weak consistence,那麼可以接受一定程度的divergence。
  6. 最後作者專業地列出了所有引用的論文。真是好人。

現在我從第一章做個筆記。(年齡大了,這年頭不做筆記不行啊。。。)

我比較喜歡作者的風格,每次開篇或者強調的地方都用鮮豔的顏色和醒目字號標記出來。比如第一章的導言:

Distributed programming is the art of solving the same problem that you can solve on a single computer using multiple computers.

為什麼要能用一臺電腦完成的事情,我們有時候需要用多臺電腦來做呢?

因為一臺電腦的資源往往有限。隨著問題規模增加,我們升級單臺電腦的硬體都可能無法完成任務。那麼為什麼需要分散式系統呢?

我們的目標:可擴充套件性

數一數房間裡面有多少人很簡單,但是要計算全國的人口就非常困難了。作者給可擴充套件性下了下面的定義。

可擴充套件性就是某系統,網路或者程序利索能力地處理不斷增長的工作量的能力,或者自身擴大以處理這種增長的能力。

效能(performace)/延時(latency) 不解釋了大家都懂。不過作者這裡給了個比喻蠻有趣:

延時就是存在但未發生。比如你被某空氣傳染的喪屍病毒感染了。延時就是你被感染的時間和你變成喪屍的時間差。又比如,延時可以是一個寫操作發生到被讀者看到的時間。

可用性(availability)/容錯(fault tolerance)

這是分散式系統的第二個特點。可用性表示,有多少時間某系統是能正常工作的。分散式系統能夠通過把很多不可靠的元件合在一起,在之上構建一個可靠的系統。

可用性也可以表示成:

Availability = uptime / (uptime + downtime)

那啥是容錯呢?系統在發生錯誤的情況下正常工作的能力。容錯主要的問題就是,定義你能想到的錯誤,然後進行系統or演算法設計來容忍它們。高可用性和容錯是分散式系統的對使用者的承諾。

在分散式系統中,是什麼導致我們沒法達成上面的目標?

  • 單個節點的數量
  • 節點之間的距離

抽象和模型

抽象讓我們忽略一些真實世界的繁雜,從而把注意力集中在本質問題上。模型則是抽象的產物,描述分散式系統的關鍵屬性。這個入門教程將要介紹下嗎幾個分散式模型的型別:

  • 系統模型(非同步/同步)
  • 容錯模型(crash-fail, paritions, 拜占庭)
  • 一致性模型(強/弱一致性)

其實這些抽象和模型的建立,就是一個目標,讓分散式系統表現得像“一個單節點的系統”。內部分佈和表現集中,這是一個此消彼長的矛盾,給我們實現一個分散式系統造成了很多困難。如果一個系統並不做強烈地“表現得像單個系統”(高可用性和容錯)

這樣的承諾,那麼效能會變得很好。 

設計技巧:劃分(Partition)和副本(Replicate)

我們的資料怎麼分佈在不同節點上,這是個問題。要讓計算進行,我們需要定位資料並對他們進行操作。資料的操作有兩種方式:

  • Partition
  • Replicate

Partition就是把我們的資料集打撒成不同幾份,分開儲存。而replicate則是把資料複製多份,分開儲存。如下圖(再次喜歡這個畫風)

這個在儲存裡面的應用就是RAID0/1了,我們叫Stripe和Mirror。

Replication 允許我們實現可擴充套件性,效能和容錯。不過這也是許多問題的源泉,因為我們面臨的是多個獨立的資料拷貝,他們需要在多臺機器上保持同步。這就是說要實現某種一致性模型。

一致性模型的實現蠻重要。好的一致性模型對程式設計師(這裡應該指的是Client,分散式系統的呼叫者)來說語義清楚,容易理解,同時也滿足業務和設計的目標,例如高可用性或者強一致性。

僅有強一致模型允許你像使用單節點系統一樣。其他一致性模型或多或少暴露了一些內部的實現。不過弱一致系統可以提高低延時和更高的可用性,並不一定難以理解,各有秋色罷了。

Summary

 這章除了講解一些概念,反覆強調的一個問題就是如果解決在多臺機器上實現一臺機器的事務的矛盾。如果你暴露更多細節,表現得很”分佈“,那麼你效能就更好,但是理解起來可能會比較難。