1. 程式人生 > >淺談分散式領域的CAP理論

淺談分散式領域的CAP理論

一、前言

CAP是分散式系統的重要理論,在大型分散式系統中一致性(Consistency),高可用性(High-Availability),分割槽可容忍性(Partition-tolerance)是設計者都希望能同時達到的,但是根據CAP理論一個系統最多能實現3中其2。本文不去探討CAP理論的結論的正確性,而是去試圖概述這三個特性是什麼。

二、 一致性

一個完全一致性的系統可以保證一旦你修改了系統中儲存的一個狀態,那麼在下次顯示修改改狀態值之前所有訪問這個狀態值的操作獲取的狀態值都是一樣的。

[example1]例如一個單點MySQL資料庫例項天然會保證狀態的一致性,這是因為只有一個節點來保持這個狀態。

[exmaple2]例如有兩個MySQL資料庫例項,並且資料是使用分片的方式將所有的資料分散到兩個資料庫例項上面,也就是兩個資料庫裡面存放的為整體資料的一部分,那麼這個情況下系統仍然天然具有完整一致性。

[exmaple3]假如現在資料庫設定為主-主備份系統,其中一個數據庫接受到插入資料請求時候,必須將該請求資訊提交給另外一個數據庫後,當前資料庫的插入請求才被認為完成。那麼為了保證100%的一致性,主-主備份資料庫節點之間需要進行通訊,並且隨著備份節點的增多,系統整體效能會下降。

三、高可用性

在上面3個例子中[exmaple1]和[exmaple2]不是高可用性的,其中[exmaple1]如果資料庫例項出現故障,那麼100%的資料將會丟失,[exmaple2]中如果有一個節點發送故障,那麼將會有50%的資料丟失。[exmaple3]是保證高可用的一個解決方法,一個簡單的MySQL伺服器備份(多主模式)可以提供100%的可用性,增加資料副本節點的數量將會直接增加系統的可用性,使用副本不僅保證了硬體故障時候的可用性,還有助於負載平衡和併發操作,特別是讀取操作, “Slave”MySQL例項就是這種“複製”的完美例子。

四、分割槽可容忍性

假設[exmaple3]中兩個MYSQL伺服器處於兩個不同的資料中心,並且兩個伺服器之間的網路失去了連線(比如其中一個節點掛了),那麼當前系統處於了分割槽狀態,由於網路原因,資料庫之間就無法進行資料同步,那麼兩個資料庫就處於不一致性的狀態了。當系統處於分割槽狀態時候就需要衡量A和C直接那個更重要了,如果銀行覺的一致性是非常重要的,並且在停機期間禁用寫操作,則兩個分行的所有銀行賬戶現在將被凍結,直到網路恢復,然後這則將失去叢集的“可用性”,如果銀行覺得可用性比較重要,則沒有掛的一個系統繼續進行提供單點的服務,而這是犧牲了一致性。

五、總結

本文用了三個例子來闡述CAP,其中example1和example2上都能保證強一致性,但不能保證可用性。example3這個例子,由於存在分割槽,就需要在一致性與可用性之間進行選擇。對應複製的策略很多場景下不需要保證強一致性,但是有時候需要保證C。比如銀行交易需要保證C則要保證本地庫和異地庫同時進行更新才算成功。但是有些情況下需要保證高可用性,當一個數據庫發生故障後自動切換到備庫寫,以便繼續對外提供服務.