Zookeeper學習——基礎框架

Hiway發表於2019-04-15

其他更多java基礎文章:
java基礎學習(目錄)


概述

Zookeeper是一個開源的分散式的,為分散式應用提供協調服務的Apache專案。

Zookeeper從設計模式角度來理解:是一個基於觀察者模式設計的分散式服務管理框架,它負責儲存和管理大家都關心的資料,然後接受觀察者的註冊,一旦這些資料的狀態發生變化,Zookeeper就將負責通知已經在Zookeeper上註冊的那些觀察者做出相應的反應,從而實現叢集中類似Master/Slave管理模式

Zookeeper=檔案系統+通知機制

基礎

資料結構

ZooKeeper資料模型的結構與Unix檔案系統很類似,zookeeper叢集自身維護了一套資料結構。這個儲存結構是一個樹形結構,其上的每一個節點,我們稱之為"znode",每一個znode預設能夠儲存1MB的資料,每個ZNode都可以通過其路徑唯一標識。

Zookeeper學習——基礎框架

節點型別

  • Znode有兩種型別:

    • 短暫(ephemeral):客戶端和伺服器端斷開連線後,建立的節點自己刪除
    • 持久(persistent):客戶端和伺服器端斷開連線後,建立的節點不刪除
  • Znode有四種形式的目錄節點(預設是persistent )

    1. 持久化目錄節點(PERSISTENT)
      客戶端與zookeeper斷開連線後,該節點依舊存在
    2. 持久化順序編號目錄節點(PERSISTENT_SEQUENTIAL)
      客戶端與zookeeper斷開連線後,該節點依舊存在,只是Zookeeper給該節點名稱進行順序編號
    3. 臨時目錄節點(EPHEMERAL)
      客戶端與zookeeper斷開連線後,該節點被刪除
    4. 臨時順序編號目錄節點(EPHEMERAL_SEQUENTIAL)
      客戶端與zookeeper斷開連線後,該節點被刪除,只是Zookeeper給該節點名稱進行順序編號
  • 建立znode時設定順序標識,znode名稱後會附加一個值,順序號是一個單調遞增的計數器,由父節點維護

  • 在分散式系統中,順序號可以被用於為所有的事件進行全域性排序,這樣客戶端可以通過順序號推斷事件的順序

特點

  1. Zookeeper:一個領導者(leader),多個跟隨者(follower)組成的叢集。
  2. Leader負責進行投票的發起和決議,更新系統狀態
  3. Follower用於接收客戶請求並向客戶端返回結果,在選舉Leader過程中參與投票
  4. 叢集中只要有半數以上節點存活,Zookeeper叢集就能正常服務。
  5. 全域性資料一致:每個server儲存一份相同的資料副本,client無論連線到哪個server,資料都是一致的。
  6. 更新請求順序進行,來自同一個client的更新請求按其傳送順序依次執行。
  7. 資料更新原子性,一次資料更新要麼成功,要麼失敗。
  8. 實時性,在一定時間範圍內,client能讀到最新資料。

stat結構體

  1. czxid- 引起這個znode建立的zxid,建立節點的事務的zxid(ZooKeeper Transaction Id) 每次修改ZooKeeper狀態都會收到一個zxid形式的時間戳,也就是ZooKeeper事務ID。 事務ID是ZooKeeper中所有修改總的次序。每個修改都有唯一的zxid,如果zxid1小於zxid2,那麼zxid1在zxid2之前發生。
  2. ctime - znode被建立的毫秒數(從1970年開始)
  3. mzxid - znode最後更新的zxid
  4. mtime - znode最後修改的毫秒數(從1970年開始)
  5. pZxid-znode最後更新的子節點zxid
  6. cversion - znode子節點變化號,znode子節點修改次數
  7. dataversion - znode資料變化號
  8. aclVersion - znode訪問控制列表的變化號
  9. ephemeralOwner- 如果是臨時節點,這個是znode擁有者的session id。如果不是臨時節點則是0。
  10. dataLength- znode的資料長度
  11. numChildren - znode子節點數量

客戶端命令列操作

命令基本語法 功能描述
help 顯示所有操作命令
ls path [watch] 使用 ls 命令來檢視當前znode中所包含的內容
ls2 path [watch] 檢視當前節點資料並能看到更新次數等資料
create 普通建立
-s 含有序列
-e 臨時(重啟或者超時消失)
get path [watch] 獲得節點的值
set 設定節點的具體值
stat 檢視節點狀態
delete 刪除節點
rmr 遞迴刪除節點