分散式系統學習筆記

風靈使發表於2019-04-05

一致性問題

在分散式系統中,一致性(Consistency,早期也叫 Agreement)是指對於系統中的多個服務節點,給定一系列操作,在協議(往往通過某種共識演算法) 保障下,試圖使得它們對處理結果達成某種程度的一致。

存在的挑戰

  • 節點之間的網路通訊是不可靠的,包括任意延遲和內容故障;
  • 節點的處理可能是錯誤的,甚至節點自身隨時可能當機;
  • 同步呼叫會讓系統變得不具備可擴充套件性。

一致性條件

  • 可終止性(Termination) :一致的結果在有限時間內能完成;
  • 共識性(Consensus) :不同節點最終完成決策的結果應該相同;
  • 合法性(Validity) :決策的結果必須是其它程式提出的提案。

CAP原理

  • 一致性(Consistency)
  • 可用性(Availability)
  • 分割槽容忍性(Partition tolerance)
    CAP原理指的是,這三個要素最多隻能同時實現兩點,不可能三者兼顧

最終一致性(eventually consistent)

對於一致性,可以分為從客戶端和服務端兩個不同的視角。從客戶端來看,一致性主要指的是多併發訪問時更新過的資料如何獲取的問題。從服務端來看,則是更新如何複製分佈到整個系統,以保證資料最終一致。

從客戶端角度,多程式併發訪問時,更新過的資料在不同程式如何獲取的不同策略,決定了不同的一致性。對於關係型資料庫,要求更新過的資料能被後續的訪問都能看到,這是強一致性 。如果能容忍後續的部分或者全部訪問不到,則是弱一致性 。 如果經過一段時間後要求能訪問到更新後的資料,則是最終一致性。

最終一致性總會存在一個時刻,系統達到一致的狀態

把故障(不響應) 的情況稱為“非拜占庭錯誤”,惡意響應的情況稱為“拜占庭錯
誤”(對應節點為拜占庭節點)

FLP不可能性原理

FLP 不可能原理:在網路可靠,存在節點失效(即便只有一個) 的最小化非同步模型系統中,不存在一個可以解決一致性問題的確定性演算法。


兩階段提交2PC

二階段提交(Two-phaseCommit)是指,在計算機網路以及資料庫領域內,為了使基於分散式系統架構下的所有節點在進行事務提交時保持一致性而設計的一種演算法(Algorithm)。通常,二階段提交也被稱為是一種協議(Protocol))。在分散式系統中,每個節點雖然可以知曉自己的操作時成功或者失敗,卻無法知道其他節點的操作的成功或失敗。當一個事務跨越多個節點時,為了保持事務的ACID特性,需要引入一個作為協調者的元件來統一掌控所有節點(稱作參與者)的操作結果並最終指示這些節點是否要把操作結果進行真正的提交(比如將更新後的資料寫入磁碟等等)。因此,二階段提交的演算法思路可以概括為:參與者將操作成敗通知協調者,再由協調者根據所有參與者的反饋情報決定各參與者是否要提交操作還是中止操作。

所謂的兩個階段是指:第一階段:準備階段(投票階段)和第二階段:提交階段(執行階段)。
兩階段提交和三階段提交

相關文章