共識總結
一致性往往指分布式系統中多個副本對外呈現的資料的狀態。共識則描述了分布式系統中多個節點之間,彼此對某個狀態達成一致結果的過程。因此,一致性描述的是結果狀態,共識則是一種手段。
在分布式系統中,我們常說的一致性問題就是:對於同乙個資料的多個副本之間,如何保持其對外表現的資料一致性。例如,研究客戶端b怎樣能讀取到客戶端a做的修改,然後兩者之間的資料可以達成一致。
在實踐中,要保障系統滿足不同程度的一致性,核心過程往往需要通過共識演算法來達成。共識演算法解決的是對某個提案大家達成一致意見的過程。
分布式系統中的一致性按照對一致性要求的不同,主要分為,嚴格一致性,強一致性(線性一致性),順序一致性,弱一致性、最終一致性。
假如有人說他設計了乙個滿足嚴格一致性的分布式系統,那麼這個系統的外部表現就應該完全等價於一台計算機。這意味著,對於這個系統中任意資料項x的任何讀操作將返回最近一次對x進行的寫操作的結果所對應的值。對於所有的程序來說,所有寫操作都是瞬間可見的,系統維持著乙個絕對的全域性時間順序。
事實上,嚴格一致性要求系統不發生任何故障,而且所有節點之間的通訊無需任何時間這種理想的條件下,才能達到。因此現實世界中,這樣的分布式系統是不存在的。
在講強一致性之前,首先要講一下順序一致性,它雖然不滿足強一致性,但是又優於弱一致性,是一種過渡狀態。
leslie lamport 在2023年提出了順序一致性,對系統提出了兩條訪問共享物件時的約束:
更通俗的解釋,順序一致性要滿足兩個條件:
順序一致性的關鍵在於找到乙個滿足現實情況的全域性執行順序,使其同時又能符合每個單獨程序內部的操作順序。
以上中(a)為順序一致性,(b)不為順序一致性。
對於(a),由於要保持程序內部的操作順序不能變,所以p3和p4中都是先讀取x=b再讀到x=a,所有兩者感知到的寫順序是相同的,感知到的整體操作順序為w(x)b -> r(x)b -> w(x)a -> r(x)a。
對於(b),p3和p4感知到的寫操作順序不同,導致無法找到乙個符合順序一致性的整體操作順序。
順序一致性中沒有全域性時鐘的限制,多個程序的操作可以任意調整順序,以找到符合每個單獨程序內部的操作順序的全域性操作順序。所以如果每個程序中感知到的寫操作順序是相同的,那麼一定可以通過調整讀操作的順序來獲得符合要求的全域性操作順序,那麼一定是順序一致性的。
當乙個資料副本的更新操作完成之後,任何多個後續節點對這個資料的任意副本的訪問都會返回最新的更新過的值。強一致性和嚴格一致性的區別在於強一致性中寫操作是耗時的,對系統可用性的影響較大,只要上次的操作沒有處理完,就不能讓使用者讀取資料。
線性一致性,是一種強一致性,在順序一致性前提下加強了程序間的操作排序,形成唯一的全域性順序。線性一致性假設操作具有乙個全域性有效時鐘的時間戳,要求時間戳在前的程序先執行,從而確定唯一的全域性操作順序,即所有的操作按照全域性時鐘的順序被所有程序感知。
兩者都要求所有程序感知到整體操作順序是相同的。所有的寫操作都以相同的順序被每個程序感知。
圖(a)滿足順序一致性,但是不滿足線性一致性的。原因在於,從全域性時鐘的觀點來看,p2程序對變數x的讀操作在p1程序對變數x的寫操作之後,然而讀出來的卻是髒資料。但是確實符合順序一致性的,因為p1和p2感知到相同的寫操作順序: write(y,2) ,write(x,4)(雖然這並未從圖上顯示出來)。所以p1和p2可以感知到相同的整體操作順序:write(y,2) , read(x,0) , write(x,4), read(y,2)。每個程序內部的讀寫順序都是合理的,但是這個順序與全域性時鐘下看到的順序並不一樣。
圖(b)滿足強一致性,因為每個讀操作都讀到了該變數的最新寫的結果,同時兩個程序看到的操作順序與全域性時鐘的順序一樣,都是write(y,2) , write(x,4), read(x,4) ,read(y,2)。
一句話總結:順序一致性要求所有程序感知到相同的操作順序(本質上只需要保證感知到相同的寫操作順序),只要求單程序中操作順序不變,整體順序可以不遵循全域性時鐘。線性一致性要求所有程序感知到相同的按照全域性時鐘確定的整體操作順序。
弱一致性是指系統並不保證後續程序或執行緒的訪問都會返回最新的更新的值。系統在資料成功吸入之後,不承諾立即可以讀到最新寫入的值,也不會具體承諾多久讀到。但是會盡可能保證在某個時間級別(秒級)之後。可以讓資料達到一致性狀態。
最終一致性是弱一致性的一種特例。某個程序更新了副本的資料,如果沒有其他程序更新這個副本的資料,系統最終一定能夠保證後續程序能夠讀取到寫進的最新值。
最終一致性根據更新資料後各程序訪問到資料的時間和方式的不同,又可以區分為:
為了達到共識,每個程序都提出自己的提議(propose),最終通過共識演算法,所有正確執行的程序決定(decide)相同的值。
根據解決的是非拜占庭的普通共識問題還是拜占庭共識問題(是否允許系統內節點作惡,以及對完備性的不同要求),共識演算法可以分為crash fault tolerance(cft)類演算法和byzantine fault tolerance(bft)類演算法。
針對常見的非拜占庭錯誤的情況,已經存在一些經典的解決演算法,包括paxos、raft及其變種等。這類容錯演算法往往效能比較好,處理較快,容忍不超過一半的故障節點。對於要能容忍拜占庭錯誤的情況,一般包括pbft(practical byzantine fault tolerance)為代表的確定性系列演算法、pow為代表的概率演算法等。
對於確定性演算法,一旦達成對某個結果的共識就不可逆轉,即共識是最終結果;而對於概率類演算法,共識結果則是臨時的,隨著時間推移或某種強化,共識結果被推翻的概率越來越小,成為事實上的最終結果。拜占庭類容錯演算法往往效能較差,容忍不超過1/3的故障節點。
一致性往往指分布式系統中多個副本對外呈現的資料的狀態。如前面提到的順序一致性、線性一致性,描述了多個節點對資料狀態的維護能力。
共識則描述了分布式系統中多個節點之間,彼此對某個提案達成一致結果的過程。因此,一致性描述的是結果,共識則是一種手段。
共識方法可以用來實現強一致性。
參考部落格:
分布式系統 一致性模型
分布式系統中乙個重要的問題就是資料複製,資料複製一般是為了增強系統的可用性或提高效能。而實現資料複製的乙個主要難題就是保持各個副本的一致性。本文首先討論資料複製的場景中一致性模型如此重要的原因,然後討論一致性模型的含義,最後分析常用的一致性模型。資料複製主要的目的有兩個 可用性和效能。首先資料複製可...
分布式系統 一致性模型
原創 阿里云云棲社群 2019 03 13 13 00 00 分布式系統中乙個重要的問題就是資料複製,資料複製一般是為了增強系統的可用性或提高效能。而實現資料複製的乙個主要難題就是保持各個副本的一致性。本文首先討論資料複製的場景中一致性模型如此重要的原因,然後討論一致性模型的含義,最後分析常用的一致...
分布式系統一致性分類
找到了一篇比較詳細的介紹。詳細連線 大概內容 一致性的角度 以資料為中心的一致性模型 以客戶為中心的一致性模型 保證最低的序列化,以達到最好的效率。以資料為中心的一致性模型 一致性模型 嚴格一致性 因果一致性 順序一致性 fifo一致性 fifo 保證單程序的寫順序 同步變數的一致性 弱一致性 釋放...