面試官問:ZooKeeper 有幾種節點型別?別再說 4 種啦!

削微寒發表於2021-05-27

本文作者:HelloGitHub-老荀

好久沒更新 ZK 的文章了,我想死你們啦。之前釋出的 HelloZooKeeper 系列文章完結後,專案收穫了將近 600 個 star。這遠遠超過了我自己的預期,在這裡感謝大家的支援~

後面會繼續 ZooKeeper 的話題,通過單篇的形式就某個 ZK 的話題繼續聊,今天我們先來看看 ZK 的節點型別。話不多說,我們進入今天的主題~

一、關於 ZK 的節點型別

大家如果刷過 ZK 相關面試題的話,就一定會刷到過 “ZK 有幾種節點型別?”,大家通常背書的答案的話是:4 種!但其實 ZK (3.6.2)服務端支援 7 種節點型別,分別是:

  • 持久
  • 持久順序
  • 臨時
  • 臨時順序
  • 容器
  • 持久 TTL
  • 持久順序 TTL

這 7 種型別之前的文章中也有提到過,但是並沒有展開講。這次更新的單篇想要把這 7 種型別的節點,認認真真的講一遍!Let's GO

二、簡單介紹

2.1 持久、臨時

持久不用我多說,是用的最多的一種型別,也是預設的節點型別,臨時節點相較於持久節點來說,就是它會隨著客戶端會話結束而被刪除,通常可以用在一些特定的場景,例如分散式鎖釋放,健康檢查等。

2.2 持久順序、臨時順序

這兩種我放在一起介紹,因為他們相對於上面兩種的特性就是 ZK 會自動在這兩種節點之後增加一個數字的字尾,而路徑 + 數字字尾是能保證唯一的,這數字字尾的應用場景可以實現諸如分散式佇列,分散式公平鎖等。

2.3 容器

容器節點是 3.5 以後新增的節點型別,只要在呼叫 create 方法時,指定 CreateModeCONTAINER 即可建立容器的節點型別,容器節點的表現形式和持久節點是一樣的,但是區別是 ZK 服務端啟動後,會有一個單獨的執行緒去掃描,所有的容器節點,當發現容器節點的子節點數量為 0 時,會自動刪除該節點,除此之外和持久節點沒有區別,官方註釋給出的使用場景是 Container nodes are special purpose nodes useful for recipes such as leader, lock, etc. 說可以用在 leader 或者鎖的場景中。

2.4 持久 TTL、持久順序 TTL

關於持久順序這兩個關鍵字,不用我再解釋了,這兩種型別的節點重點是後面的 TTLTTLtime to live 的縮寫,指帶有存活時間,簡單來說就是當該節點下面沒有子節點的話,超過了 TTL 指定時間後就會被自動刪除,特性跟上面的容器節點很像,只是容器節點沒有超時時間而已,但是 TTL 啟用是需要額外的配置(這個之前也有提過)配置是 zookeeper.extendedTypesEnabled 需要配置成 true,否則的話建立 TTL 時會收到 Unimplemented 的報錯

三、原理介紹

單純的持久臨時節點我就不介紹了,之前的系列文章有講

3.1 順序關鍵字

客戶端建立一個順序節點的時候,服務端得知當前節點是順序節點的時候會自動給路徑加上字尾,字尾就是父節點的 cversion,代表建立子節點的個數

if (createMode.isSequential()) {
  	path = path + String.format(Locale.ENGLISH, "%010d", parentCVersion);
}

就是這麼簡單~

3.2 容器、TTL 關鍵字

這兩種其實可以放在一起講,服務端在啟動的時候會額外啟動一個定時任務執行緒,會定期的掃描所有的容器TTL 的節點,逐一判斷子節點的數量以及一些相關配置,來決定是否刪除,首先整個邏輯是在 ContainerManager 中,定時任務是由 TimeTask 實現的,相關的配置有

配置項 預設值 說明
znode.container.checkIntervalMs 60000(毫秒) 定時任務檢查的間隔
znode.container.maxPerMinute 10000 和上面的引數聯合成為最小的檢查間隔,每個節點間隔必須差 (60000 / 10000)毫秒(預設 6 毫秒)以上
znode.container.maxNeverUsedIntervalMs 0 如果配置不為 0 的話,當容器TTL 節點最後一次更新的時間和當前時間戳的差超過這個值的話,也會被刪除

四、小結

  • 持久關鍵字:客戶端不主動刪除的話,節點資料會一直存在
  • 臨時關鍵字:客戶端連線斷開後,節點資料會被一起刪除
  • 順序關鍵字:服務端會自動為該節點加數字字尾
  • 容器:服務端會定期掃描這些節點,當該節點下面沒有子節點時(或其他條件時)服務端會自動刪除節點
  • TTL:需要額外配置才能啟用,基本和容器相同,當超過 TTL 時間節點下面都沒有再建立子節點時會被刪除,但是當建立子節點會重置該超時時間

ZKr~好久沒更了,這次先挑一個簡單的話題。後面大家想學哪些 ZK 的知識可以留言告訴我。


關注 HelloGitHub 公眾號 第一時間收到更新。

還有更多開源專案的介紹和寶藏專案等待你的發現。

相關文章