特性
- 類似于Raft系統(tǒng),zookeeper也有 log 和 狀態(tài)機的概念,zk中的狀態(tài)機是一棵內存樹。
- zk寫的順序是 先寫到日志中保存命令,再運用到內存樹中,再返回客戶端
- zk的讀操作不需要轉發(fā)到leader,每個Node都可以直接返回本地內存樹中的數(shù)據(jù)
一致性、容錯性
zk的讀取是弱一致性+最終一致性的,任何Node(Follower、leader、observer)都可以直接處理客戶端的Query請求,而不需要去leader那confirm自己的數(shù)據(jù)是最新的。這種機制提升了讀取的性能,但是可能NodeA的數(shù)據(jù)不是最新的,客戶端讀取到的數(shù)據(jù)可能是過時的。
ZK集群的容錯性要考慮到observer的情況,因為observer節(jié)點并不參與事務請求的confirm和投票選舉,所以說observer的宕機并不會影響集群的可用性。所以不能一概而論的說,zk集群半數(shù)節(jié)點不可用則集群不可用,要看掛掉的節(jié)點的角色是不是observer。
ZK集群在新版本中支持配置:readonlymode.enable屬性,默認是false,如果開啟的話,節(jié)點處于異常狀態(tài),集群仍然可用,但是只能執(zhí)行讀的請求,不能寫。