1. 程式人生 > 實用技巧 >CAP理論以及kafka當中的CAP機制

CAP理論以及kafka當中的CAP機制

CAP理論以及kafka當中的CAP機制

分散式系統當中的CAP理論

分散式系統(distributed system)正變得越來越重要,大型網站幾乎都是分散式的。
分散式系統的最大難點,就是各個節點的狀態如何同步。
為了解決各個節點之間的狀態同步問題,在1998年,由加州大學的電腦科學家 Eric Brewer 提出分散式系統的三個指標,分別是

  • Consistency:一致性
  • Availability:可用性
  • Partition tolerance:分割槽容錯性

Eric Brewer 說,這三個指標不可能同時做到。最多隻能同時滿足其中兩個條件,這個結論就叫做 CAP 定理
CAP理論是指,分散式系統中,一致性、可用性和分割槽容忍性最多隻能同時滿足兩個。

一致性:Consistency

• 通過某個節點的寫操作結果對後面通過其它節點的讀操作可見
• 如果更新資料後,併發訪問情況下後續讀操作可立即感知該更新,稱為強一致性
• 如果允許之後部分或者全部感知不到該更新,稱為弱一致性
• 若在之後的一段時間(通常該時間不固定)後,一定可以感知到該更新,稱為最終一致性

可用性:Availability

• 任何一個沒有發生故障的節點必須在有限的時間內返回合理的結果

分割槽容忍性:Partition tolerance

• 部分節點宕機或者無法與其它節點通訊時,各分割槽間還可保持分散式系統的功能
一般而言,都要求保證分割槽容忍性。所以在CAP理論下,更多的是需要在可用性和一致性之間做權衡。

在這裡插入圖片描述

Partition tolerance

先看 Partition tolerance,中文叫做"分割槽容錯"。
大多數分散式系統都分佈在多個子網路。每個子網路就叫做一個區(partition)。分割槽容錯的意思是,區間通訊可能失敗。比如,一臺伺服器放在中國,另一臺伺服器放在美國,這就是兩個區,它們之間可能無法通訊。

在這裡插入圖片描述
上圖中,G1 和 G2 是兩臺跨區的伺服器。G1 向 G2 傳送一條訊息,G2 可能無法收到。系統設計的時候,必須考慮到這種情況。
一般來說,分割槽容錯無法避免,因此可以認為 CAP 的 P 總是存在的。即永遠可能存在分割槽容錯這個問題

Consistency

Consistency 中文叫做"一致性"。意思是,寫操作之後的讀操作,必須返回該值。舉例來說,某條記錄是 v0,使用者向 G1 發起一個寫操作,將其改為 v1。
在這裡插入圖片描述
接下來,使用者的讀操作就會得到 v1。這就叫一致性。
在這裡插入圖片描述
問題是,使用者有可能向 G2 發起讀操作,由於 G2 的值沒有發生變化,因此返回的是 v0。G1 和 G2 讀操作的結果不一致,這就不滿足一致性了。
在這裡插入圖片描述
為了讓 G2 也能變為 v1,就要在 G1 寫操作的時候,讓 G1 向 G2 傳送一條訊息,要求 G2 也改成 v1。
在這裡插入圖片描述
這樣的話,使用者向 G2 發起讀操作,也能得到 v1。
在這裡插入圖片描述

Availability

Availability 中文叫做"可用性",意思是隻要收到使用者的請求,伺服器就必須給出迴應。
使用者可以選擇向 G1 或 G2 發起讀操作。不管是哪臺伺服器,只要收到請求,就必須告訴使用者,到底是 v0 還是 v1,否則就不滿足可用性。

kafka當中的CAP應用

kafka是一個分散式的訊息佇列系統,既然是一個分散式的系統,那麼就一定滿足CAP定律,那麼在kafka當中是如何遵循CAP定律的呢?kafka滿足CAP定律當中的哪兩個呢?
kafka滿足的是CAP定律當中的CA,其中Partition tolerance通過的是一定的機制儘量的保證分割槽容錯性。
其中C表示的是資料一致性。A表示資料可用性。

kafka首先將資料寫入到不同的分割槽裡面去,每個分割槽又可能有好多個副本,資料首先寫入到leader分割槽裡面去,讀寫的操作都是與leader分割槽進行通訊,保證了資料的一致性原則,也就是滿足了Consistency原則。然後kafka通過分割槽副本機制,來保證了kafka當中資料的可用性。但是也存在另外一個問題,就是副本分割槽當中的資料與leader當中的資料存在差別的問題如何解決,這個就是Partition tolerance的問題。

kafka為了解決Partition tolerance的問題,使用了ISR的同步策略,來盡最大可能減少
Partition tolerance的問題
每個leader會維護一個ISR(a set of in-sync replicas,基本同步)列表
ISR列表主要的作用就是決定哪些副本分割槽是可用的,也就是說可以將leader分割槽裡面的資料同步到副本分割槽裡面去,決定一個副本分割槽是否可用的條件有兩個
• replica.lag.time.max.ms=10000 副本分割槽與主分割槽心跳時間延遲
• replica.lag.max.messages=4000 副本分割槽與主分割槽訊息同步最大差
在這裡插入圖片描述
在這裡插入圖片描述