1、從集中式到分布式
1.1:集中式的特點
所謂集中式系統就是指由一台或多台主計算機組成中心節點,數據集中存儲在這個中心節點中,並且整個系統的所有業務單元都集中部署在這個中心節點上,系統所有功能均有其集中處理。在集中式系統中,每個終端或客戶端機器僅僅負責數據的錄入和輸出,而數據存儲與控制處理完全由主機來完成。
集中式系統最大特點就是部署結構簡單,集中式系統往往基於底層性能卓越的大型主機,因此無需考慮如何對服務進行多個節點的部署,也就不用考慮多個節點之間的分布式協作問題。
1.2:分布式的特點
分布式系統定義:一個硬件或軟件組件分布在不同的網絡計算機上,彼此之間僅僅通過消息傳遞進行通信和協調的系統。
一個標准的分布式系統在沒有任何特定業務邏輯約束的情況下,都會有如下幾個特征有:
1、分布性:
分布式系統中的多台計算機都會在空間上隨意分布,同時,機器的分布情況也會隨時變動。
2、對等性:
分布式系統中計算機沒有主/從之分,組成分布式系統的所有計算機節點都是對等的。
副本(Replica)是分布式系統對數據和服務提供的一種冗余方式。在常見的分布式系統中,為了對外提供高可用的服務,我們往往會對數據和服務進行副本處理。即數據副本和服務副本。
數據副本:指在不同節點上持久化同一份數據,當某一節點上存儲的數據丟失時,可以從副本上讀取到該數據。這是解決分布式系統數據丟失問題最為有效的手段。
服務副本:指多個節點提供同樣的服務,每個節點都有能力接收來自外部的請求並進行相應處理。
3、並發性:
在一個計算機網絡中,程序運行過程中的並發性操作是非常常見的。例如同一個分布式系統的多個節點,可能並發地操作一些共享資源,諸如數據庫或分布式存儲等。如何准確並高效地協調分布式並發操作是分布式架構中的最大的挑戰之一
4、缺乏全局時鍾:
典型的分布式系統由一系列在空間上隨意分布的多個進程組成,進程之間通過交換消息來相互通信。在分布式系統中,很難定義兩個事件的先后順序,原因是分布式系統缺乏一個全局的時鍾序列控制。
5、故障的發送:
組成分布式系統中所有計算機,都可能發送任何形式的故障。
1.3:分布式環境的各種問題
通信異常:
分布式系統需要在各個節點之間進行網絡通信,這必然會伴隨網絡不可用的風險。其次在分布式系統中,節點通信的延時遠大於單機操作,因此消息丟失和消息延遲變得非常普遍。
網絡分區:
當網絡異常時,分布式系統中部分節點之間的網絡延時不斷增加,最終導致組成分布式系統的所有節點中,只有部分節點之間能夠進行正常通行,而另一些節點不能。這種現象我們稱為網絡分區,俗稱"腦裂"。當網絡分區出現時,可能導致局部小集群獨立原本要整個系統才能完成的功能,包括對數據的事務處理。這便極大的影響了分布式一致性。
三態:
我們已經了解到分布式環境下,網絡可能出現的問題。因此分布式系統的每一次請求與響應,存在特有的“三態”概念。即:成功、失敗與超時。
超時情況的分類:
由於網絡原因,請求沒有被成功發送到接收方。在發送過程中出現消息丟失
請求成功被接收方接收並處理,但在響應給發送方過程中,出現消息丟失。
節點故障:
組成分布式系統的服務器節點出現宕機或“僵死”。
2、從ACID到CAP/BASE
我們了解了集中式系統和分布式系統的特點,也看到了從集中式向分布式系統變遷過程中會碰到的問題。接下來我們看看在分布式系統中,事務處理與數據一致性的問題。
ACID:
事務(Transaction)是由一系列對系統中數據進行訪問與更新的操作所組成的一個程序執行邏輯單元,狹義上的事務特指數據庫事務。一方面,事務為多個應用程序並發訪問數據庫提供一個隔離方法,防止彼此的操作互相干擾。另一方面,事務為數據庫操作序列提供了一個從失敗中恢復到正常狀態的方法,同時提供了數據庫即使在異常狀態下仍能保持數據一致性的辦法。
事務的四個特征:
原子性(Atomicity):事務必須是一個原子的操作序列單元,一次執行中要么全部成功執行,要么全部不執行。
一致性(Consistency):一個事務在執行之前和執行之后,數據庫都必須處於一致性狀態。
隔離性(Isolation):並發的事務相互隔離,一個事務的執行不能被其他事務干擾。
在標准的SQL規范中,定義了4個事務隔離級別:
讀未提交(Read Uncommited):允許讀取到其他事務未提交的數據,其事務隔離級別最低。
讀已提交(Read Commited):允許讀取到其他事務已提交的數據。
可重復讀(Repeatable Read):事務處理過程中,多次讀取同一個數據,其值都和事務開始時刻是一致的。
串行化(Serializable):最嚴格的事務隔離級別,要求所有事務被串行執行,即事務只能按順序一個接一個地處理,不能並發執行。
隔離級別 | 臟 讀 | 不可重復讀 | 幻 讀 |
讀未提交 | 允許 | 允許 | 允許 |
讀已提交 | 不允許 | 允許 | 允許 |
可重復讀 | 不允許 | 不允許 | 允許 |
串行化 | 不允許 | 不允許 | 不允許 |
持久性(Durability):事務一旦提交,它對數據庫中對應數據的狀態變更就應該是永久性的。
分布式事務:
單機環境下很容易實現ACID特性的事務處理系統,但分布式數據庫中,數據分散在不同的機器上,對數據進行分布式處理具有非常大的挑戰性。通常一個分布式事務會涉及對多個數據源或業務系統的操作。設想一個典型的分布式事務場景:跨行轉賬涉及調用兩個異地的銀行服務,其中是一個本地銀行的取款服務,另一個是目標銀行提供的存款服務。兩個服務本身是無狀態並且是相互獨立的,共同構成一個完整的分布式事務。通過這個例子我們了解到一個分布式事務可以看作多個分布式操作序列組成。如上述的取款和存款服務,通常把這一系列分布式操作序列稱為子事務。由於分布式事務中,子事務的執行是分布式的,因此要實現能保證ACID特性的分布式事務處理系統就顯得格外復雜。
CAP和BASE理論
CAP理論告訴我們,一個分布式系統不可能同時滿足一致性(Consistency)、可用性(Availability)和分區容錯性(Partition tolerance)這三個基本需求。最多同時滿足其中兩項。
一致性(C):在分布式環境中,一致性是指數據在多個副本之間是否能保持一致的特性。在分布式系統中,如果能做到針對一個數據項的更新操作執行完成后,所有的用戶都可以讀取到其最新的值,那么這樣的系統就被認為具有強一致性(或嚴格的一致性)。
可用性(A):指系統提供的服務必須一直處於可以的狀態,對於用戶的每一個操作請求總是能夠在有限的時間內返回結果。有限時間指對於用戶的一個請求,系統必須在指定時間(即響應時間)內返回對應的處理結果,如果超過這個時間規范,那么系統就被認為不可以用。
分區容錯性(P):分布式系統在遇到任何網絡分區故障的時候,仍然需要能夠保證對外提供滿足一致性和可以性的服務,除非是整個網絡環境都發送了故障。
CAP定理應用
放棄CAP定理 | 說 明 |
放棄P | 如果希望避免系統出現分區容錯性問題,一種較為簡單的做法就是將所有數據都放在一個分布式節點上。這樣的做法不能100%保證系統不出錯,但至少不會碰到由於網絡分區帶來的負面影響。同時放棄P也意味着放棄了系統的可擴展性 |
放棄A | 相對於放棄P來說,放棄可用性正好相反。其做法是一旦系統遇到網絡分區或其他故障時,受影響的服務需要等待一定的時間,因此在等待期間系統無法對外提供正常服務,即不可用 |
放棄C | 放棄一致性,並不是完全不需要數據一致性,如果是這樣的話,那么系統的數據都是無意義的。事實上,放棄一致性指放棄數據的強一致性,保留數據的最終一致性。這樣的系統無法保證數據保持實時的一致性,但能夠保證數據最終會達到一個一致的狀態。這就引入了一個時間窗口的概念,具體多久能達到數據一致性取決於系統的設計。主要包括數據副本在不同節點之間的復制時間長短。 |
從CAP定理我們可以看出,一個分布式系統不可能同時滿足一致性、可用性和分區容錯性。但對於一個分布式系統而言,分區容錯性可以說是最基本的要求。因為分布式系統中,組件必然要被部署到不同節點,否則就無所謂分布式。對於分布式系統,網絡問題是一個必定會出現的異常情況,因此分區容錯性也就成為了一個分布式系統必然需要面對和解決的問題。BASE是對CAP中一致性和可用性權衡的結果,核心思想是即使無法做到強一致性(Strong consistency),但每個應用都可以根據自身業務特點,采用適當的方式使系統達到最終一致性(Eventual consistency)。
BASE三要素
基本可用:指分布式系統在出現不可預知故障時,允許損失部分可用性。不等價於系統不可用。
典型例子:
1、響應時間上的損失:由於故障導致某功能,如查詢結果的響應時間增加到1-2秒。
2、功能上的損失:正常情況下,在電商網站購物,消費者幾乎能夠順利完成每一筆訂單,當購物高峰時,由於消費者購物行為激增,為保護購物系統的穩定性,部分消費者可能會被引導到一個降級頁面。
弱狀態:也稱軟狀態,和硬狀態相對、指允許系統中數據存在中間狀態,並認為該中間狀態的存在不影響系統的整體可用性。即允許系統在不同節點的數據副本之間進行數據同步的過程中存在延時。
最終一致性:強調系統中所有數據副本,在經過一段時間的同步后,最終能夠達到一個一致的狀態。並不需要實時保證系統數據的強一致性。