ZookeeperA. zookeeper 的由來
因爲大數據的發展,分佈式集羣之間的關係變得很是複雜
例如 NameNode 的 HA,咱們搭建 2 臺 NameNode 支持 HA,可是遇到問題 : 到底客戶端訪問哪一臺 NameNode
因而把 NameNode1 和 NameNode2 統稱爲 NameSpace
客戶端鏈接到 NameSpace ,NameSpace 的節點保存在 zookeeper 上
在 NameSpace 中只有 1 臺 NameNode 真正幹活node
zookeeper 就是分佈式的協調服務
B. zookeeper 概述
zookeeper 是一個開源的分佈式協調服務
ZooKeeper 是一個典型的分佈式數據一致性解決方案
分佈式應用程序能夠基於 ZooKeeper 實現
諸如數據發佈/訂閱、負載均衡、命名服務、分佈式協調/通知、集羣管理、Master 選舉、分佈式鎖和分佈式隊列等功能
Zookeeper 提供的服務功能有
數據註冊功能
數據查詢功能
數據監聽功能服務器
C. dubbo 框架介紹
Zookeeper 一個最經常使用的使用場景就是用於擔任服務生產者和服務消費者的註冊中心
服務生產者將本身提供的服務註冊到 Zookeeper 中心
服務的消費者在進行服務調用的時候先到 Zookeeper 中查找服務
獲取到服務生產者的詳細信息以後,再去調用服務生產者的內容與數據數據結構
D. zookeeper 基礎概念
zookeeper 在搭建的時候,建議使用奇數臺(避免浪費)
zookeeper 也是一個高可用的集羣(容許最多掛多少臺)
集羣中節點的數量只要存活的節點數量大於總節點數的半數就能夠運行架構
角色
部分描述
Client請求發起方
Server服務器,咱們的 ZooKeeper 整體中的一個節點,爲客戶端提供全部的服務
Leader服務器中某個節點,在服務啓動時被選舉。主要負責處理數據和更新等操做
Follower執行 leader 指令及選舉 leader 的服務器節點
zookeeper 爲了保證數據的一致性,在節點中選舉 leader 來進行數據的讀寫
follow 從 leader 中進行數據同步
follow 參與選舉 leader負載均衡
E. zookeeper 重要概念
ZooKeeper 自己就是一個分佈式程序
只要半數以上節點存活,ZooKeeper 就能正常服務
爲了保證高可用,最好是以集羣形態來部署 ZooKeeper
這樣只要集羣中大部分機器是可用的,那麼ZooKeeper 自己仍然是可用的
ZooKeeper 將數據保存在內存中,保證了高吞吐量和低延遲
可是內存限制了可以存儲的容量不太大,此限制也是保持 znode 中存儲的數據量較小的進一步緣由
ZooKeeper 是高性能的
在「讀」多於「寫」的應用程序中尤爲地高性能
由於「寫」會致使全部的服務器間同步狀態
Zookeeper 存儲數據以 key-value 形式存儲
可是 key 類型比較特殊,相似路徑的形式"/keyname/aa/bb", 咱們稱之爲 znode
value 值能夠是任意的二進制數據 byte[]框架
F. zookeeper 節點類型
ZNode 由兩部分組成
節點的名稱 : 路徑
節點的數據 : byte[] 數據
ZNode 節點類型
永久節點(persistent)
一旦節點被建立,就會一直存在
臨時節點(ephemeral)
建立節點的客戶端與 zookeeper server 失去鏈接,該節點就會消失
順序節點(sequential)
節點建立的時候會在節點的名稱上生成一個順序的編號
先建立的節點編號越小,後建立的節點編號越大分佈式
衍生類型
永久節點 + 順序節點
臨時節點 + 順序節點性能
ZNode 節點建立實戰
鏈接 zookeeper
[Shell] 純文本查看 複製代碼
?
1
bin/zkCli.sh -server host:port cmd args大數據
A. 建立節點
查看根節點下的 ZNode 節點
[Shell] 純文本查看 複製代碼
?
1
zk: ls /atom
建立 ZNode 節點類型
默認是永久節點
[Shell] 純文本查看 複製代碼
?
1
2
3
4
5
6
7
8
9
zk: create /doit 51do.cn
zk: create -s /doit/oldsheep laoyang
zk: create -e /doit/xiaohei heiheihei
B. 獲取節點數據
[Shell] 純文本查看 複製代碼
?
1
zk: get 節點路徑
C. 更改節點數據
[Shell] 純文本查看 複製代碼
?
1
zk: set 節點路徑 value
. ZNode 節點版本
zookeeper 爲每個 ZNode 節點維護着一個叫作 stat 的數據結構
在 stat 中維護了節點相關的 3 個版本
當前 ZNode 的版本 dataVersion
當前 ZNode 子節點的版本 cversion
當前 ZNode 的 ACL(Access Control List)版本 aclversion
E. 狀態信息
每一個 ZNode 除了存儲數據內容以外,還存儲了 ZNode 自己的一些狀態信息
用 get 命令能夠同時得到某個 ZNode 的內容和狀態信息
cZxid : 表示 Znode 被建立時的事務 ID
[Shell] 純文本查看 複製代碼
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
[zk: localhost:2181(CONNECTED) 1] get /brokers/ids/0
{"listener_security_protocol_map":{"PLAINTEXT":"PLAINTEXT"},"endpoints":["PLAINTEXT://10.172.50.11:9092"],"jmx_port":-1,"ho
st":"10.172.50.11","timestamp":"1539155719044","port":9092,"version":4}
cZxid = 0x600000159 // 表示 Znode 被建立時的事務 ID
ctime = Wed Oct 10 15:15:19 CST 2018 // Znode 被建立的時間
mZxid = 0x600000159 // 表示 Znode 最後一次被更新時的事務 ID
mtime = Wed Oct 10 15:15:19 CST 2018 // 表示改節點最後一次被更新的時間
pZxid = 0x600000159 // 表示該節點子節點列表最後一次被修改時的事務 ID.注意,只有子節點列表變動了纔會變動 pZxid
cversion = 0 // 子節點的版本號
dataVersion = 0 // 數據節點的版本號
aclVersion = 0 // ACL 版本號
ephemeralOwner = 0x10000032ae90001 //建立該節點的會話的 seddionID。若是該節點是持久節點,那麼這個屬性值爲 0
dataLength = 194 //數據內容的長度
numChildren = 0 //子節點的個數
F. 事務操做
在 zookeeper 中,能改變 zookeeper 服務器狀態的操做稱爲【事務操做】
通常包括數據節點建立與修改,數據內容更新和客戶端會話建立與失效等操做
對於客戶端的每個更新請求,zookeeper 都會分配一個全局惟一的遞增編號,這個編號反映了全部事務操做的前後順序
應用程序可使用 zookeeper 這個特性來實現更高層次的同步原話
這個編號也叫作時間戳——zxid【zookeeper transaction Id】
zxid 一般是一個64位的數字
這個數字分爲高32位和低32位
高32位是選舉leader的紀元編號
低32位是事務編號
F. watcher(事件監聽器)
Watcher 是 zookeeper 中的一個很重要的特性
zookeeper 容許用戶在指定節點上註冊一些 watcher
而且在一些特定時間觸發的時候,zookeeper 服務端會將事件同傳到感興趣的客戶端去
該機制是 zookeeper 實現分佈式協調服務的重要特性
zookeeper 的監聽分爲 2 種
節點數據變化的監聽
監聽的是當前節點的數據變化事件
節點下子節點變化的監聽
只能監控節點的兒子節點,不能監控其兒子節點以外的節點事件
G. ZAB協議
ZAB(zookeeper atomic broadcast 原子廣播)協議是爲分佈式協調服務 zookeeper 專門設計的一種支持崩潰恢復的原子廣播協議
在 zookeeper 中,主要依賴 ZAB 協議來實現分佈式數據一致性
基於該協議,zookeeper 實現了一種主備模式的系統架構來保持集羣中各個副本之間的數據一致性
ZAB 協議有兩種模式,閥門分別爲【恢復模式(選主)】和【廣播模式(同步)】
當服務啓動或者 leader 崩潰後,ZAB 就進入了恢復模式
當 leader 被選舉出來, 且大多數 server 完成了和 leader 的狀態同步之後,恢復模式就結束
狀態同步保證了 leader 和 server 具備相同的而系統狀態
zookeeper 的 ZAB 協議實現數據一致性具體表現形式就是經過 ZXID
H. zookeeper 如何保證數據的一致性
由於 zookeeper 中有事務,事務是由 zab 協議實現的
zab 協議體如今 zxid 上,zxid 是一個 64 位的數據
這個數字分爲高 32 位 和 低 32 位
高32位爲 選舉leader 的紀元編號
低32位位事務編號
更多技術資訊可關注:gzitcast