天天看點

Hyperledger實戰之——分布式系統(1)第三章 分布式系統

——本文是作者自己原創編寫的電子書中的部分章節,在此分享給各位CSDN的讀者。

第三章 分布式系統

上一章中把Blockchain和Distributed Ledger,分布式系統未必是區塊鍊的技術本質,單純的分布式實作不會是區塊鍊技術的終點,未來一定會有更高效、更合理的、也很可能會更複雜的方案來實作區塊鍊以達到更理想的效果。

但另一方面,也必須說明分布式至少是區塊鍊技術棧中很重要的部分,而且至少在現階段是适合大規模推廣的區塊鍊技術的必然選擇(在很多場景中可能會呈現一定程度的相對中心化)。盡管用上萬個 full time 運作的計算機節點來替代一份報紙的一個小小的廣告欄,意味着系統運作的成本上漲了數億倍甚至更多,但也正是這一點點差異就決定了 Surety 是一個半數字化的系統,而bit–coin是一個完全數字化、完全線上運作的系統。也正是用天價成本換來的這一點點差異,導緻了後者具備了無限的想象空間而被資本拿來炒作,其影響甚至觸及了全球最偏遠的角落。也正是這一點點差别,最終導緻 Surety(相對的)默默無聞,而bit–coin卻聲名遠播。

Hyperledger實戰之——分布式系統(1)第三章 分布式系統

是以從這個角度來講,現階段把區塊鍊定義成「分布式記賬技術」而不是「塊鍊式記賬技術」也是情理之中的。

由于分布式系統的知識體系極其龐雜,本章隻能簡要介紹學習區塊鍊需要了解的一些分布式系統的基礎知識,幫助讀者了解區塊鍊關于分布式的一些基本特性。如果要更清晰的了解分布式系統發展曆程,可以參展本節相關的參考文獻部分的論文和文章。如果要更深入、系統的學習分布式系統的話,就需要閱讀分布式領域的一些專著了。

3.1 Why 分布式系統

區塊鍊采用分布式的實作是有很多原因的,首當其沖的是去中心化的賬本可以提供更進階别的信用。前面講到了簡化的區塊鍊技術實際有兩大塊:

  • 資料完整性技術;
  • 分布式技術。

雖然通過 Hash、Merkle 樹、單連結清單這樣一套精巧的資料結構可以保證區塊資料的完整性,但并不等于區塊資料就安全了。如果這樣的完整資料隻有一個備份的話,雖然篡改起來确實比較困難,但是要破壞/删掉它還是相對容易的。要解決區塊的資料安全問題,一個途徑當然是加強對資料伺服器的保護,另一個就是備援備份了。

首先仍然用現實世界的交易合同來類比解釋分布式對于區塊鍊的意義。前面講到現實世界雙方合同,一式兩份 一旦遇到假合同就難辨真假,需要簽署三方合同才可以做到基本的安全。bit–coin采用分布式也起到了類似的效果:搞出遍布全球的一萬多個節點,每一個節點都可以作為三方合同中的第三方來證明交易的真實性。

雖然bit–coin網絡上也會出現惡意節點、資料過期的節點等問題,但隻要還有大量有效的節點,bit–coin系統就會繼續運作。除非惡意節點達到一定門檻值才會對整個系統造成威脅,也就是著名的 51 % 51\% 51%攻擊。而目前bit–coin在全球大約有10000個全節點,想搞出一個 51 % 51\% 51%攻擊的話,雖然理論上是可行的,但是成本會比較高。而要搞出 51 % 51\% 51%攻擊而不被發現,就幾乎是不可能的了。

Hyperledger實戰之——分布式系統(1)第三章 分布式系統

這個遍布全球的10000個節點就是分布式系統。

下面我們來看一下分布式系統的工作原理。

3.2 分布式系統的工作原理

分布式系統是一個很寬泛的話題,其中有很多繁瑣的概念和理念,本章無法覆寫太多的知識點,下面隻是簡單枚舉一下學習區塊鍊需要了解的幾個基本概念。

分布式系統包括分布式存儲和分布式計算,而區塊鍊涉及的重點是分布式計算的範疇,是以接下來我們重點讨論分布式計算部分。

首先澄清一下分布式計算和并行計算的關系。

從學科上來講,分布式計算和并行計算根本就沒關系。并行計算屬于計算機體系結構的範疇,主要是通過 CPU 性能優化、指令集優化、多 CPU、多核、協處理器等設計來實作更高的計算能力。而分布式計算是建構在計算機網絡之上、由一組獨立的節點組成的、為完成某個任務耦合在一起的系統。這顯然不是計算機體系結構的範疇,看上去有點像計算機網絡的一個分支。但實際分布式計算是和計算機網絡并列的一個單獨的學科。

既然沒有關系,那也就不存在互斥關系,實際上在很多時候兩類技術會同時使用來解決一些性能問題。早期的分布式計算和并行計算一樣,都是為了實作更高的處理能力。隻不過并行計算是聚焦在體系結構層面的優化,性能的提升主要表現在單機上面; 而分布式計算是利用多機協作來實作性能提升的。相比之下,當單機的性能在現有體系結構下接近極限的時候,分布式計算仍然有很大的提升空間。

但随着計算機技術的發展,現在的分布式計算已經成了目前計算機領域的基礎技術。尤其是在大型系統中,高并發、高可用這些需求的背後幾乎随處可見分布式計算的身影,随着大資料技術的發展,分布式資料庫技術對于很多業務來說也成了強需求,而這些都屬于分布式計算研究的範疇。

前面說到高并發、高可用,其中用到的一個典型的技術方案是「叢集」。叢集的概念和分布式糾結在一起的話又會很迷惑,是以也要簡單澄清一下。

  • 多台機器運作同一份代碼的多個執行個體,這是叢集;
  • 多台機器互相協作執行同一個任務,這是分布式。

傳統的背景 Service 部署多個執行個體,這屬于叢集的範疇。而一個服務拆成多個子產品運作在很多機器上 – 也就是微服務 – 屬于分布式的範疇。但二者同樣也不是互斥的關系,在微服務的實際部署中也往往離不開叢集的應用。就像區塊鍊作為分布式系統,在部署中也會用到 kafka/zookeeper 叢集。

那扯這麼多概念,對于了解分布式計算有什麼幫助嗎?首先簡化一下計算機背景技術的發展曆程:

  • 早期的單機系統:這一階段主要依靠體系結構(包含前面提到的并行計算)領域的研究來提升機器的性能,同時通過硬體設計來提高伺服器的穩定性,比如 IBM 伺服器;
  • 叢集:當單機性能怎麼都滿足不了需求的時候,可以通過增加機器來提高系統的服務能力。通過多執行個體部署,服務的并發性和可用性都得到了很大的提升;
  • 當叢集規模達到一定程度,單純依靠增加機器是不能無上限地提升叢集的性能的,這時候分布式的優勢就出現了。到了這個階段,計算系統的性能又上了一個台階。

那是什麼原因讓分布式計算技術可以這麼厲害的呢?

下面來看一些分布式計算的基本概念,讀了這些你可能會很失望,覺得很枯燥。但實際上就是這些看上去很枯燥的東西,賦予了分布式計算強大的生命力。

3.2.1 去中心化

分布式系統是由多個節點組成的,其中所有節點都是對等的,當某個節點出現故障時,網絡中的其他節點仍然可以提供系統服務,不會出現某一個節點當機導緻網絡崩潰的問題,即 – 去中心化(見圖\ref{fig:ds_003})。

Hyperledger實戰之——分布式系統(1)第三章 分布式系統

3.2.2 資料一緻性

既然分布式系統中的各節點是對等的,就要求所有節點的資料對外呈現的狀态是一緻的,這樣的分布式網絡才是可用的(見圖\ref{fig:ds_004})。這件事聽起來很簡單,卻是分布式系統的核心問題,實際解決起來并不簡單。也正是因為問題之複雜,bit–coin采用 PoW 的設計也堪稱神來之筆。

Hyperledger實戰之——分布式系統(1)第三章 分布式系統

資料一緻性可以分為很多不同的級别,包括嚴格一緻性、強一緻性、線行一緻性、順序一緻性、單調一緻性、弱一緻性、串行一緻性、會話一緻性…這麼多概念堆在一起簡直看的眼花缭亂,實際上這些一緻性是從不同領域衍生出來的,認真去研究的話會發現它們定義的次元都不太一樣,直接堆砌在一起的話當然會看不懂。如果簡單劃分分布式系統的資料一緻性的話,可以簡單分成:

  • 強一緻性:任何時刻、任何使用者都可以讀到最近一次成功更新的資料;
  • 單調一緻性:任何時刻,任何使用者一旦讀到某個資料在某次更新後的值(不會再讀到更舊的值);
  • 弱一緻性:使用者無法在确定時間内讀到最新更新的值;
  • 會話一緻性:任何使用者在某次會話中,一旦讀到某個資料在某次更新後的值,那麼在本次會話中就不會再讀到更舊的值;
  • 最終一緻性:使用者能讀到某次更新後的值(但不一定是最新的值,也不一定是比上一次讀到的更新的值),但系統保證資料将最終達到完全一緻的狀态,隻是所需時間不能保障。

這些名詞隻是給出了資料可用的标準:隻有滿足特定的一緻性條件的系統才是可用的。但是怎樣達成資料的一緻性,這不是一緻性的定義能解決的問題,而是需要設計一些專門的機制和算法,它們通用的稱謂是「一緻性協定」。可以想像,一緻性協定是分布式系統領域非常核心的一個問題,其中有一個比較重要的子問題随着區塊鍊的大熱而聲名鵲起,那就是「共識」。

待續……

繼續閱讀