從分佈式環境的特點、問題到CAP、BASE理論詳解

分佈式的特點:

定義:

分佈式系統是一個硬件或者軟件組件分佈在不同的網絡計算機上,彼此之間僅僅通過網絡進行通信和協調的系統。

特點:

同一個分佈式系統中的計算機在空間部署上可以是任意分佈的,這些計算機可能被放在不同的機櫃上、也可能在不同的機房中,甚至可能在不同的城市,無論如何,一個標準的分佈式系統沒有特定業務邏輯約束的情況下,都會有如下幾個特徵:

分佈性:分佈性系統的多臺計算機都會在空間上隨意分佈,同時,機器的分佈情況也會隨時變動。

對等性:分佈式系統中的計算機沒有主/從之分,既沒有控制整個系統的主機,也沒有被控制的從機。組成分佈式系統的所有計算機節點都是對等的。副本是分佈式系統最常見的概念之一,指的是分佈式系統對數據和服務提供的一種冗餘方式。在常見的分佈式系統中,爲了對外提高高可用的服務,我們往往會對數據和服務進行副本處理。數據副本指的是在不同節點上持久化同一份數據,當某個節點上存儲的數據丟失時。可以從副本上獲取到該數據。這是分佈式系統解決數據丟失問題最爲有效的手段。服務副本是指多個節點提供同樣的服務,每個節點都有能力接收外部的請求並進行處理。

併發性:同一分佈式系統的多個節點,可能會併發的操作一些共享資源,比如數據庫,分佈式存儲等等,如何準確高效解決分佈性併發操作也成爲了分分佈式系統架構設計的最大挑戰之一。

無序性:一個典型的分佈式系統是由一系列的在空間上任意分佈的多個進程組成,具有明顯的分佈性。這些進程之間通過交換消息來進行相互通信,協調。因此,在分佈式系統中,很難定義兩個事件誰先誰後,原因是缺乏一個全局時鐘序列控制。

故障總是發生,組成分佈式系統的任何節點,都有可能發生任何形式的故障,比如硬件損壞,火災,網絡故障等等。

分佈式環境的問題
通信異常

從集中式到分佈式的演變過程中,必然引入了網絡的因素。但是網絡本身是不可靠的。可能會發生網絡故障,網絡延時太大等等問題。

網絡分區

當網絡由於發生異常,導致分佈式系統中的部分節點之間網絡延時不斷增大,最終導致組成分佈式系統的所有節點中,只有部分節點能夠正常通信。而另外一部分節點不能正常通信。這種現象稱爲網絡分區,也叫腦裂。當網絡分區出現時,分佈式系統會出現局部小集羣。

在這裏插入圖片描述
這是一個分佈式系統中某個服務的集羣,由於網絡原因,slave節點5、6、7與其他節點的通信超時,此時他們會認爲其他節點不可用,而重新選舉出一個新的master。如圖下:
在這裏插入圖片描述
slave節點5成爲了master節點,並且有slave節點6、7作爲從節點,此時原本的一個集羣變成了兩個集羣,集羣間無法通信,分別對外服務,數據、事務的同步只會在各自的集羣節點中進行,因此這樣會導致分佈式系統數據一致性造成很大影響。

三態

三態是:成功、失敗、超時。
在傳統的單機系統中,應用程序調用了一個函數後,都能得到一個非常明確的響應,成功或者失敗。而在分佈式系統中,網絡是不可靠的,在網絡出現異常的情況下,就可能會出現超時現象。通常有以下兩種情況:

  • 由於網絡原因,請求沒有被成功地發送到接收方,而是在發送過程中請求消息就發生了丟失的現象。
  • 該請求成功發送到接收方,並且進行了處理,並且向請求方進行了響應,但是在響應發送回給請求方的過程中消息發生了丟失的現象。

當出現這樣的情況時,請求方無法判斷是成功還是失敗。

節點故障

指的是分佈性系統中的服務器節點出現宕機或者僵死的現象。

分佈式事務

單機環境下,我們很容易能夠實現一套滿足ACID特性的事務處理系統,比如java的話使用spring的聲明式事務就可以解決單機系統的事務處理。但是在分佈式數據庫中,數據分散在不同的機器,如何對這些數據進行事務處理具有非常大的挑戰。

分佈式事務是指事務參與者、支持事務的服務器,資源服務器,事務管理器分別位於分佈式系統的不同節點上。通常一個分佈式事務中會涉及涉及對多個數據源或者業務系統的操作。

經典場景:一個跨銀行轉賬場景,在A銀行進行取款存到B銀行中,兩個銀行的服務系統沒有關聯,相互獨立。共同構成了一個分佈式事務,如果A銀行取款成功,但是B銀行存款失敗的話,那就必須回滾到取款前的狀態。否則用戶的錢就莫得了。

一個分佈式事務可以看作是多個分佈式操作組成。例如存款和取款像個操作。通常可以把一系列分佈式操作稱爲子事務。

CAP理論

CAP理論是加州大學伯克利分校的Eric Brewer教授2000年提出來的猜想,後來被證實可行性。從此,CAP理論正式在學術上成爲分佈式計算領域的公認定理,並深深影響分佈式計算髮展。

C(Consistency)一致性:在分佈式環境下,一致性指的是數據在多個副本之間是否能夠保持一致的特性。當一個系統的數據處於一致的狀態下執行更新操作之後,應該保證系統的數據仍然處於一致的狀態。
一個系統具有多個數據副本節點,對其中一個節點進行數據的更新操作,沒有同步到其他節點上,於是讀取其他節點時,獲取的是老數據(髒數據)。這就是典型的分佈式數據不一致狀情況。
在分佈式系統中,如果能夠對一個數據項進行了更新操作後,所有的用戶都能讀取到最小的數據,那麼該系統就是具有強一致性的系統。

A(Availability)可用性:可用性是指系統提供的服務必須一直處於可用狀態,對於用戶的每一個請求總是在有限時間內返回結果

有限的時間是指對於一個用戶請求操作,系統必須在指定的時間內返回對應的處理結果。如果超出了這個範圍,那麼系統會被認爲不可用。 比如淘寶商品搜索需要在5秒內響應結果,超過5秒就認爲系統不可用。又或者調用redis服務請求時設置超時時間爲3秒,3秒沒有響應結果就拋出異常,這裏的有限時間是3秒。

返回結果是可用性的另外一個重要指標,它要求系統在完成對用戶請求處理後,返回一個正確的響應結果。正常的響應應該是能夠正確地反應出處理的結果,成功或者失敗,而不是一個讓用戶感到困惑的結果。比如OutOfMemory,NullPointException等結果。

P(Partition tolerance)分區容錯性:約束了一個分佈式系統在遇到任何網絡分區故障的請求下,仍然能夠提供對外滿足一致性和可用性的服務,除非整個網絡環境都發生了故障。

取捨:
放棄P:如果我們不接受分區容錯性(放棄分區容錯性),也就是不允許出現網絡分區的現象,那就只能把數據放在同一個節點上存儲,不使用副本。但是這樣就意味着放棄系統的擴展性,這已經不是所謂的分佈式系統了,因爲分佈式系統的組件必然是部署在不同的節點上。所以分區是分佈式系統必然會存在的問題,放棄了就不是所謂的分佈式系統了,所以分區容錯性是一個分佈式系統必然要解決的一個問題,所以不能放棄P。

放棄C:這裏所說的放棄一致性,並不是完全不需要數據一致性,如果完全放棄數據一致性的話,那麼系統就沒有意義了。這裏放棄C指的是放棄數據的強一致性。保留數據的最終一致性。這樣的系統無法保證數據實時的一致性。但是能夠承諾保證數據的最終一致性。就是系統中的數據會在一定時間內最終達到一致性狀態。

放棄A:指的是允許系統在一定的時間內不可用。

C和A的衝突性:
C強一致性和A可用性是衝突的,因爲如果系統具有強一致性的話,當請求對節點進行數據更新的話,就必須把其他副本和該節點的讀操作和寫操作進行鎖定,等待數據更新再其他副本中進行同步之後才能再次對外服務。在數據同步過程中系統處於不可用狀態。所以選擇C就意味着放棄了A。

所以一個分佈式系統只能保證CP或者AP。根據實際業務情況在CP跟AP中進行取捨。

BASE理論

BASE(basically Available)\(Soft State)、(Eventually Consistency)。

basically Available:基本可用,指的是分佈式系統在出現不可預知故障時,允許損失部分可用性,這絕不等價與系統不可用。
例子:
響應時間上的損失:比如淘寶商品搜索需要在5秒內響應用戶,但是由於出現故障,比如部分機房斷電斷網等,查詢結果延時了幾秒。結果在8秒裏響應用戶。

功能上的損失:淘寶雙十一,在一定時間點下單量暴增,爲了保證系統穩定性。部分消費者的下單請求會被引導到一個降級頁面。

Soft State:軟狀態,允許系統擁有中間狀態,並認爲該狀態不會影響系統的整體可用性,即允許系統不同節點之間數據副本數據同步過程中存在延時。

Eventually Consistency:最終一致性,最終一致性強調的是系統中所有的數據副本,在經過一段時間同步後,最終能達到一個一致的狀態。因此最終一致性的本質是需要系統最終數據能夠達到一致,而不用保證系統的實時強一致性。

最終一致性的五個變種:

因果一致性:進程A對某數據更新之後通知了進程B,那麼進程B之後對該數據的訪問都應該能夠獲取到進程A更新後的最新值。並且如果進程B要更新該數據的話,務必基於進程A更新後的最新值的基礎上進行更新。與此同時,與進程A無因果關係的進程C沒有此限制。

讀己之所寫:進程A更新了一個數據後,它自己總能訪問該數據被它更新後的最新值,而不會看到舊值。

會話一致性:會話一致性將系統數據的訪問過程框定在一個會話內,系統保證在同一個會話中實現“讀己之所寫一致性”,也就是說,在同一會話內,對某數據進行更新,該會話能夠讀取到更新後的最新值。上面的己是同一進程A,這裏的己是同一會話。

單調讀一致性:指的是一個進程從系統中讀取一個數據項後,那麼該系統對於該進程之後的該數據訪問都不應該返回更舊的值。

單調寫一致性:一個系統需要保證來自同一個進程的寫操作被順序執行。

總結:BASE理論是面向分佈式系統,和傳統的事務的ACID是相反的,他完全不同於ACID的強一致性模型。而是提出犧牲強一致性來獲取可用性。並且允許數據在一段時間內不一致,但最終會達到一致性。在實際的分佈式場景中,不同業務單元組件對一致性的要求不一樣,有些必須強一致,有些允許最終一致性。所以ACID與BASE理論往往又會結合在一起使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章