一、CAP理論概述
分布式領域中存在CAP理論,且該理論已被證明:任何分布式系統只可同時滿足兩點,無法三者兼顧。
①C:Consistency,一致性,數據一致更新,所有數據變動都是同步的。
②A:Availability,可用性,系統具有好的響應性能。
③P:Partition tolerance,分區容錯性。
因此,將精力浪費在思考如何設計能滿足三者的完美系統上是愚鈍的,應該根據應用場景進行適當取舍。
(1)一致性
一致性是指從系統外部讀取系統內部的數據時,在一定約束條件下相同,即數據變動在系統內部各節點應該是同步的。根據一致性的強弱程度不同,可以將一致性級別分為如下幾種:
①強一致性(strong consistency)。任何時刻,任何用戶都能讀取到最近一次成功更新的數據。
②單調一致性(monotonic consistency)。任何時刻,任何用戶一旦讀到某個數據在某次更新后的值,那么就不會再讀到比這個值更舊的值。也就是說,可 獲取的數據順序必是單調遞增的。
③會話一致性(session consistency)。任何用戶在某次會話中,一旦讀到某個數據在某次更新后的值,那么在本次會話中就不會再讀到比這值更舊的值 會話一致性是在單調一致性的基礎上進一步放松約束,只保證單個用戶單個會話內的單調性,在不同用戶或同一用戶不同會話間則沒有保障。示例case:php的 session概念。
④ 最終一致性(eventual consistency)。用戶只能讀到某次更新后的值,但系統保證數據將最終達到完全一致的狀態,只是所需時間不能保障。
⑥弱一致性(weak consistency)。用戶無法在確定時間內讀到最新更新的值。
二、ZooKeeper提供的一致性服務
很多文章和博客里提到,zookeeper是一種提供強一致性的服務,在分區容錯性和可用性上做了一定折中,這和CAP理論是吻合的。但實際上zookeeper提供的只是單調一致性。
原因:
1. 假設有2n+1個server,在同步流程中,leader向follower同步數據,當同步完成的follower數量大於 n+1時同步流程結束,系統可接受client的連接請求。如果client連接的並非同步完成的follower,那么得到的並非最新數據,但可以保證單調性。
2. follower接收寫請求后,轉發給leader處理;leader完成兩階段提交的機制。向所有server發起提案,當提案獲得超過半數(n+1)的server認同后,將對整個集群進行同步,超過半數(n+1)的server同步完成后,該寫請求完成。如果client連接的並非同步完成follower,那么得到的並非最新數據,但可以保證單調性。
用分布式系統的CAP原則來分析Zookeeper:
(1)C: Zookeeper保證了最終一致性,在十幾秒可以Sync到各個節點.
(2)A: Zookeeper保證了可用性,數據總是可用的,沒有鎖.並且有一大半的節點所擁有的數據是最新的,實時的. 如果想保證取得是數據一定是最新的,需要手工調用Sync()
(2)P: 有2點需要分析的.
① 節點多了會導致寫數據延時非常大,因為需要多個節點同步.
② 節點多了Leader選舉非常耗時, 就會放大網絡的問題. 可以通過引入 observer節點緩解這個問題.