Zookeeper:一個為分佈式應用而設計的分佈式協調服務
zookeeper在分佈式技術領域是極其常見的一箇中間件,也經常與其它的分佈式中間件搭配使用:早期版本的karfka使用zookeeper作為集羣元數據存儲組件;在分佈式服務框架spring-cloud/dubbo中可以作為服務註冊中心、配置管理中心等;在分佈式集羣環境下作為分佈式鎖的解決方案...
ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services.
根據zookeeper官網的介紹,zookeeper是一個用於管理配置信息、命名、提供分佈式鎖或者集羣服務的集中式服務。它是Apache軟件基金會下的項目,是一個開源的、分佈式的、用於分佈式應用的高性能協調服務。
我們看看Zookeeper到底具有哪些內容和特性用以支持這些服務的實現。
Zookeeper數據結構-樹形層次目錄
Zookeeper一切功能特性都是基於它的樹形目錄數據結構,樹中的每個節點稱為Znode,每個節點的名稱path是一串以/分割的路徑。跟文件目錄類似,它可以包含子節點,但不同的是每個Znode都可以存儲少量的數據。Znode具有不同的節點類型。
1. 節點類型
- persistent,即持久化節點,除非手動刪除,否則將持久化存在。創建命令是 "create /app1/p_1"。
- ephemeral,它在一次會話生命週期中存在,在會話結束後被刪除。創建命令是"create -e /app1/p_1"。
- persistent_sequential,持久化有序節點。創建命令是"create -s /app1/p_1"。
- ephemeral_sequential,臨時有序節點。創建命令是"create -es /app1/p_1"。
有序節點:創建一個有序節點時,以"create -es /app1/p_1"為例,其生成的節點的名稱是"/app1/p_1"後面跟上一個10位的序列號,例如"/app1/p_10000000001",序列號由zookeeper採用自增的方式自動生成。
2. 節點數據
Znode可以存儲少量數據,通過create {path} {data_value}完成數據初始賦值,通過set {path}{data_value}可以對數據值進行更新。
3. 節點屬性
通過ls -s {path}可以查看路徑節點相關的屬性值。
- cZxid: 創建節點的Zxid。
- ctime:CreateTime即節點創建時間。
- mZxid:最新修改節點的Zxid。
- mtime:最新修改節點的時間。
- pZxid:最後更新的子節點的zxid。
- cversion:子節點的變化版本號,即子節點被修改的次數,-1表示未被修改過。
- dataVersion: 當前節點的變化號,0表示未被修改過。
- aclVersion: 訪問控制列表的變化號,access control list。
- ephemeralOwner: 如果是臨時節點,表示當前節點的擁有者的sessionId。
- dataLength:數據長度。
- numChildren:子節點的數量。
Zxid: Zookeeper事務ID,以0x即十六進制表示,ZooKeeper每次更新操作/事務操作分配一個全局唯一的id。這個ID包含64位,其中低 32位是一個簡單的單調遞增的計數器,針對客户端每一個事 務請求,計數器加 1;而高 32 位則代表 Leader 週期 epoch 的編號,其設計邏輯與Zookeeper集羣Leader選舉有關,後面再續。
Zookeeper Watch監聽機制
Zookeeper支持Watch的概念,允許客户端在Znode上設置監聽。當一個watch被觸發時,客户端將受到一個packet被告知Znode發生了變化。
監聽類型
-
Zookeeper應用-分佈式鎖
Zoo
To be Continued...