Zookeeper介紹
ZK是一個開放源代碼的分佈式協調服務,設計目標是將哪些複雜且容易出錯的分佈式一致性服務封裝起來,構成一個高效可靠的原語集,並以一系列簡單易用的接口提供給用戶使用。
ZK是什麼
是一個典型的分佈式數據一致性的解決方案,分佈式應用程序可以基於它實現諸如數據發佈/訂閱、負載均衡、命名服務、分佈式協調/通知、集羣管理、Master選舉、分佈式鎖和分佈式隊列的呢過功能。
ZK可以保證如下分佈式一致性特性
順序一致性
從同一個客戶端發起的事務請求,最終會嚴格的按照其發起順序被應用到ZK中去
原子性
所有事務請求的處理結果在整個集羣中所有機器上的應用情況是一致的,也就是說,妖魔整個集羣中的所有機器都成功應用了某一個事務,要麼都沒有應用,一定不會出現集羣中部分機器應用了該事務,而另外一部分沒有應用的情況。
單一視圖
無論客戶端連接的是哪個ZK服務器,其看到的服務端數據模型都是一致的。
可靠性
一旦服務端成功地應用可一個事務,並完成對客戶端的響應,那麼該事務所引起的服務端狀態變更將會被一致保留下來,除非有另一個事務又對其進行了變更。
實時性
通常人們看到實時性的第一反應是,一旦一個事務被成功應用,那麼客戶端能夠立即從服務端上讀取到這個事務變更後的最新數據狀態。這裏需要注意的是,ZK僅僅保證在一段時間內,客戶端最終一定能夠從服務端上讀取到最新的數據狀態。
Zookeeper的特點
-
Zookeeper是一個樹狀結構(Znode樹)
-
樹狀結構(Znode)的根節點爲/
-
Zookeeper的每一個節點稱之爲是znode節點
-
所有znode節點都是從根節點開始計算的
-
每一個znode節點都必須存儲數據
-
每一個持久的znode節點都可以掛載子節點
-
每一個znode節點都可以掛載子節點
-
znode樹是維繫在內存中的,即每一個znode節點中的數據也是維繫在內存中,這樣做的目的是方便快速查找
-
不能利用Zookeeper存儲海量數據,原因:
1、Znode樹維繫在內存中,並且多個Zookeeper存儲的是相同的數據造成內存浪費;
2、Zookeeper是做分佈式的協調服務而不是做存儲服務的 -
Zookeeper提供了持久化機制,持久化的目錄由zoo.cfg中的dataDir屬性來決定
-
Zookeeper會爲每一次的事務(增加、刪除、更新)提供一個全局的遞增事務id
Zookeeper中常用的命令
服務端指令
sh zkServer.sh start 啓動服務器端
sh zkServer.sh stop 停止服務器端
sh zkServer.sh restart 重啓服務器端
sh zkServer.sh status 查看服務器端的狀態
sh zkCli.sh 啓動客戶端
客戶端指令
節點信息
Zookeeper的集羣角色
在Zk中,引入了Leader、Follower和Observer三種角色。
Leader:Zk集羣中的所有機器通過一個Leader選舉過程來選定一臺被稱爲"Leader"的機器,Leader服務器爲客戶端提供讀和寫服務。是整個Zk集羣工作機制中的核心,其主要工作有:
- 事務請求的唯一調度和矗立着,保證集羣事務處理的順序性
- 集羣內部各個服務器的調度者
**Follower:**是Zk集羣狀態的跟隨者,其主要工作有以下三個
- 處理客戶端非事務請求,轉發事務請求給Leader服務器
- 參與事務請求Proposal的投票
- 參與Leader選舉投票
**Observer:**是Zookeeper自3.3.0版本開始引入的一個全新的服務器角色,從字面意思看該服務器充當了一個觀察者的角色—其觀察Zk集羣的最新狀態變化並將這些狀態變更同步過來,Observer服務器在工作原理和Follower基本是一致的,對於非事務請求都可以進行獨立的處理,對於事務請求,則轉發給Leader服務器進行處理,和Follower唯一的區別在於,Observer不參與任何形式的投票,包括事務請求建議Proposal的投票和Leader選舉投票。Observer服務器只提供非事務服務,通常用於在不影響集羣事務處理能力的前提下提升集羣的非事務處理能力