分布式一致性問題。

2021-08-11 04:14:20 字數 2884 閱讀 4537

在電腦科學領域,分布式一致性問題是乙個相當重要,且被廣泛探索與論證的問題,通常存在於諸如分布式檔案系統、快取系統和資料庫等大型分布式儲存系統中。

什麼是分布式一致性?分布式一致性分為哪些型別?分布式系統達到一致性後將會是乙個什麼樣的狀態?如果失去了一致性約束,分布式系統是否還可以依賴?如果一味地追求一致性,對系統的整體架構和效能又有多大影響?這一系列的問題,似乎都沒有iyge嚴格意義上準確的定義和答案。

it技術的發展,讓我們受益無窮,從日常生活的超市收銀,到高階精細的火箭發射,現代社會中幾乎所有行業,都離不開計算機技術的支援。

儘管計算機工程師們創造出了很多高科技的計算機產品來解決我們日常碰到的問題,但使用者只會傾向於選擇一些易用、好用的產品,哪些難以使用的計算機產品最終都會被淘汰——這種易用性,其實就是使用者體驗的一部分。

計算機產品的使用者體驗,可以分為便捷性、安全性和穩定性等方面。我們來看一下計算機產品的終端使用者是誰,他們的需求又是什麼。

假如說我們的終端使用者是一位經常做火車的旅行家,通常他是去車站的售票處購買車票,然後拿著車票去檢票口,再坐著火車,開始一段美好的旅行——一切似乎都是那麼和諧。想象一下,如果他選擇的目的地是杭州,而某一趟開往杭州的火車只剩下最後一張車票了,可能在同一時刻,不同售票視窗的另一位乘客也購買了同一張車票。假如說售票系統沒有進行一致性保障,兩人都購票成功了。而在檢票口檢票的時候,其中一位乘客會被告知他的車票無效——當然,現代的中國鐵路售票系統已經很少出現這樣的問題了,但在這個例子中,我們可以看出,終端使用者對於我們的系統的需求非常簡單:

「請售票給我,如果沒有餘票了,請在售票的時候就告訴我票是無效票的。」

這就對購票系統提出了嚴格的一致性要求——系統的資料(在本例中指的就是那趟開往杭州的火車的餘票數),無論在哪個售票視窗,每時每刻都必須是準確無誤的!

假如說我們的終端使用者是一名剛畢業的大學生,通常在拿到第乙個月工資之後,都會選擇向家裡匯款。當他來到銀行櫃檯,完成轉賬操作後,銀行的櫃檯服務員會友善的提醒他:「您的轉賬將在n個工作日後到賬!」,此時這名畢業生有一些沮喪,會對那名櫃檯服務員叮囑:「好吧,多久沒關係,錢不要少就行了!」——這也成為了幾乎所有的使用者對於現代銀行系統最基本的需求。

假如說我們的終端使用者是一名網上購物狂,當他看到一件庫存量為5的心儀商品,會迅速地確認購買,寫下收貨位址,然後下單——然而,在下單的那個瞬間,系統可能會告知該使用者:「庫存量不足!」此時,絕大部分的消費者往往都會抱怨自己動作太慢,使得心愛的商品被其他人搶走了!

但其實有過網購系統開發經驗的工程師一定明白,在商品詳情頁面上顯示的那個庫存量,通常不是該商品的真實庫存量,只有在真正下單購買的時候,系統才會檢查該商品的真實庫存量。但是,誰在意呢?

在上面三個例子中,我們的終端使用者在使用不同的計算機產品時對於資料一致性的需求是不一樣的:

在計算機發展的早期階段,受到底層硬體技術的制約,同時也是由於人們對於計算機系統的實際使用需求比較簡單,因此很多上層的應用程式架構都是單執行緒模型的。以c語言為例,其誕生於上世紀70年代,當時幾乎所有使用c語言開發的應用程式都是單執行緒的。從現在來看,單執行緒應用程式雖然在執行效率上無法和後來的多執行緒應用程式相比,但是在程式設計模型上相對簡單,因此能夠避免多執行緒程式中出現的不少併發問題。

隨著計算機底層硬體技術和現代作業系統的不斷發展,多執行緒技術開始被越來越多的引入到計算機程式設計模型之中,並對現代計算機應用程式的整體架構起到了至關重要的作用。

多執行緒的引入,為因夠用程式帶來效能上的卓越提公升,同時也帶來了乙個最大的***,那就是併發。《深入理解計算機系統》一書對併發進行了如下定義:如果邏輯控制流在時間上重疊,那麼他們就是併發的。這裡提到的邏輯控制流,通俗地講,就是一次程式操作,比如讀取或更新記憶體中變數的值。

在分布式系統中另乙個需要解決的重要問題就是資料的複製。在我們日常的開發經驗中,相信很多開發人員都碰到過這樣的問題:假設客戶端c1將系統中的乙個值k由v1更新為v2,但客戶端c2無法立即讀取到k的最新值,需要在一段時間之後才能讀取到。讀者可能也已經猜到了,上面這個例子就是常見的資料庫之間複製的延時問題。

分布式系統對於資料的複製需求一般都來自於以下兩個原因。

資料複製在可用性和效能方面給分布式系統帶來的巨大好處是不言而喻的,然而資料複製所帶來的一致性挑戰,也是每乙個系統研發人員不得不面對的。

所謂的分布式一致性問題,是指在分布式環境中引入資料複製機制後,不同資料節點間可能出現的,並無法依靠計算機應用程式自身解決的資料不一致情況。簡單的講,資料一致性就是指在對乙個副本資料進行更新的同時,必須確保也能夠更新其他的副本,否則不同副本之間的資料將不再一致。

那怎麼來解決這個問題呢?順著上面提到的複製延時問題,很快就有人想到了一種解決辦法,那就是:

「既然是由於延時引起的問題,那我可以將寫入的動作阻塞,直到資料複製完成後,才完成寫入工作。」

沒錯,這似乎能解決問題,而且有一些系統的架構也確實直接使用了這個思路。但這個思路在解決一致性問題的同時,又帶來了新的問題:寫入的效能。如果你的應用場景有非常多的寫請求,那麼使用這個思路之後,後續的寫請求都將會阻塞在前乙個請求的寫操作上,導致系統整理效能急劇下降。

總的來講,我們無法找到一種能夠滿足分布式系統所有系統屬性的分布式一致性解決方案。因此,如何既保證資料的一致性,同時又不影響系統執行的效能,是每個分布式系統都需要重點考慮和權衡的。於是,一致性級別由此誕生。

這種一致性級別是最符合使用者直覺的,他要求系統寫入什麼,讀出來的也會是什麼,使用者體驗好,但實現起來往往對系統的效能影響比較大。

這種一致性級別約束了系統在寫入成功後,不承諾立即可以讀到寫入的值,也不具體承諾多久之後資料能夠達到一致,但會盡可能地保證到某個時間級別(比如秒級別)後,資料能夠達到一致狀態。弱一致性還可以再進行細分:

最終一致性是弱一致性的乙個特例,系統會保證在一定時間內,能夠達到乙個資料一致的狀態。這裡之所以將最終一致性單獨提出來,是因為他是弱一致性中非常重要的一種一致性模型,也是業界在大型分布式系統的資料一致性上比較推崇的模型。

分布式一致性問題

典型情況 三個副本構成乙個group 1.強一致性 所有的副本更新成功才返回。同時,p向s1 s2同步的過程,可以進行優化,借鑑gfs的流水線複製方式 p s1 s1 s2 以便充分利用每個node的頻寬資源。2.最終一致性 在經過乙個不一致視窗後,副本最終處於一致的狀態。如上圖是一種簡單的最終一致...

分布式一致性問題

分布式一致性包括 強一致性 保證副本都一致 可用性 在使用者容忍時間範圍內返回使用者預期結果 分割槽容錯性 出現網路分割槽時仍能對外提供可用服務。主要方法兩階段提交協議,三階段提交協議 分為協調者master參與者segment 第一階段 投票階段 協調者像參與者分發任務,參與者執行並記錄日誌,但不...

分布式系統中一致性問題

區塊鏈系統,首先是乙個分布式系統,一致性問題是分布式領域最為基礎也是最重要的問題。一致性 consistency 是指對於分布式系統中的多個服務節點,給定一系列操作,在約定協議的保障下,試圖使得它們對處理結果達成 某種程度 的認同。分布式計算機集群系統中容易出現以下幾個問題 節點之間的網路通訊是不可...