1. 分散式原理
分散式系統是硬體和軟體分佈在不同網路計算機上,彼此間通過訊息傳遞進行通訊和協調的系統。
1.1 分散式環境存在的問題
- 通訊異常:分散式環境存在訊息丟失和訊息延遲的情況。
- 網路分割區:在組成分散式系統的所有節點中只有部分節點能進行正常通訊,另一些則不能,形成網路分割區孤島,也稱為腦裂。
- 三態:分散式環境請求有3種狀態,成功、失敗、超時。
- 節點故障:分散式環境中每個節點都有可能出現故障。
1.2 分散式系統特性
- 分佈性:服務分佈在網路的不同的機器上,可能會變動。
- 副本:
- 資料副本:多節點持久化同一份資料,當某個節點宕機或儲存的資料丟失,可從副本讀取到資料,解決分散式系統資料丟失的問題。
- 服務副本:多節點提供同樣的服務,每個節點都能接收外部的請求並進行相應的處理。
- 並行性:並行情況較單點系統更為複雜,對於共用資源的存取需要準確和高效地協調。
- 故障:分散式系統中每個節點都有可能發生故障,設計時應該充分考慮可能發生的故障和備案。
1.3 CAP和BASE理論
1.3.1 分散式系統的幾個基本要求
- 一致性:在分散式環境中,多個資料副本之間是否能夠保持一致的特性。如果對一個資料項更新後,所有使用者在叢集其他節點都能讀到更新後的值,那麼認為系統具備強一致性(嚴格一致性)。
- 可用性:對於使用者的每一個請求,系統可以在有限的時間內返回結果。有限的時間隨系統型別不同而不同,是滿足使用者預期的時間。返回結果是指系統應該返回正確的響應,而不是使用者無法理解的結果,比如OutOfMemory。
- 分割區容錯性:分散式系統在遇到任何網路分割區故障時,仍需要保證對外提供一致性和可用性的服務,除非是整個網路發生故障。
1.3.2 CAP理論
CAP理論:一個系統不可能同時滿足一致性(C:Consistency)、可用性(A:Avaliability)和分割區容錯性(P:Partition Tolerance)這三個基本需求,最多隻能滿足其中的兩項。
那麼為什麼會這樣呢?以下2個地方講的都挺好的:
- https://www.zhihu.com/question/54105974
- https://blog.csdn.net/yeyazhishang/article/details/80758354
通過以上2個地方的講解,概括下自己的理解:
分割區容錯性是分散式系統的基礎,放棄則表示失去了系統的擴充套件性,違背了分散式系統設計的初衷。所以通常提到CAP的取捨,是在CA之間的取捨。
- 保證分割區容錯性:需要用到上文中提到的資料副本,即同一份資料分佈到不同的節點上,在網路發生故障時,仍需要保證對外提供一致性和可用性的服務,除非是整個網路發生故障。
- 保證一致性:此時為滿足分割區容錯性的需求,設定了多個資料副本(副本越多,分割區容錯性越強),分散式系統需要承擔資料同步的工作。如果要保證強一致性,那麼部分節點需要犧牲可用性,等待資料同步完成後再提供服務。極端情況下,當網路出現故障形成網路孤島的時候,孤島內的節點為保證強一致性,需要徹底停止服務,等待網路恢復,同步最新的資料保證強一致性。
- 保證可用性:同樣是多個資料副本的場景,保證強可用性的一個方法即是犧牲一致性,在資料同步的同時提供服務,此時可能各個節點對同一個資料返回的值不同(還未完成資料同步),出現資料不一致的情況。
這樣看來,不管單純地犧牲一致性,還是可用性,都是不太可取的,所以會有BASE理論。
1.3.3 BASE理論
BASE理論:基本可用、軟狀態、最終一致性
- 基本可用:分散式系統在遇到問題時,允許損失部分可用性。響應時間上的延長、功能降級。
- 軟狀態:和強一致性相比,軟狀態允許系統中的資料存在中間狀態,允許系統在不同節點的資料副本之間進行資料同步的延遲。
- 最終一致性:系統中的所有資料副本,在經過一段時間的同步後,最終能夠達到一個一致的狀態。
這樣看來,還是可以在一致性和可用性之間做一定的權衡,來達到一個相對滿意的狀態。