Zookeeper是一款開源的分佈式存儲系統。node
ZooKeeper主要是用來解決分佈式應用中常常遇到的一些數據管理問題,如:統一命名服務、狀態同步服務、集羣管理、分佈式應用配置項的管理等。git
Zookeeper分紅客戶端和服務端兩部分,服務端一般運行於集羣模式,統一爲客戶端提供分佈式數據一致性管理服務,集羣可提供水平擴展能力,以及避免單點故障。github
ZooKeeper讓分佈式進程可經過共享的、與標準文件系統相似的分層名字空間相互協調。名字空間由znode組成,znode是和文件目錄相似的樹形結構。有子節點,而且ZooKeeper爲znode提供了常駐內存服務,提升性能。apache
Zookeeper還提供了數據動態監測機制, 客戶端註冊監聽它關心的目錄節點,當znode發生變化(數據改變、被刪除、子目錄節點增長刪除)時,客戶端會觸發註冊事件。 服務器
ZooKeeper的實現很重視高性能、高可用性,以及嚴格的順序訪問。高性能意味着可將ZooKeeper用於大的分佈式系統。可靠性使之可避免單點失敗。嚴格的順序訪問使得客戶端能夠實現複雜的同步原語。分佈式
服務端一般有多臺服務器,這些服務器都經過QuorumPeer進程維持分佈式系統間的數據交換,選舉領導者(Leader)和追隨者(Follower),動態監控集羣,一旦發生節點故障則從新啓動選舉流程,選出新的Leader。每一個服務器維護相同的一份全局數據,經過QuorumPeer維持數據之間的同步,這樣提供高可靠性和橫向擴展性。性能
源碼地址:https://github.com/apache/zookeeperui
文件目錄結構,爲了方便解析整個ZooKeeper的源碼結構,這裏只是列出主要的目錄和文件:命令行
/:根目錄下主要是ZooKeeper客戶端相關的文件日誌
/cli:命令行方式的Java類
/server:ZooKeeperServer相關,爲ZooKeeper客戶端提供服務
/server/command:服務端命令
/server/admin:ZooKeeper服務端Web管理,基於Jetty實現
/server/persistence:事務日誌和快照的持久化
/server/quorum:集羣間狀態維護和切換,實現分佈式事務
客戶端提供的操做包括啓動、關閉、建立節點、設置節點數據、刪除節點、獲取節點、獲取節點數據等。這裏只是取其中的幾個命令作爲示例。
主要客戶端命令表:
ls:獲取子路徑列表
create:建立路徑和數據
delele:刪除路徑
get:獲取路徑的數據
set:設置路徑的數據
connect:鏈接服務端
close:關閉與服務端鏈接
quit:退出客戶端
setacl:設置znode路徑的Acl
getacl:獲取znode路徑的Acl
1)啓動客戶端
zkCli.sh
2)鏈接服務端
Connect 10.10.27.21
3)建立路徑節點
建立一個新的 znode ,使用 create /test 「hello」 。這個命令在根目錄下建立了一個新的 znode 節點「 test 」以及與它關聯的字符串:
4)獲取目錄
使用 ls 命令來查看當前 ZooKeeper 中所包含的內容,這裏顯示/目錄下有test、zookeeper兩個子節點。
5)獲取節點數據
運行 get 命令來確認第二步中所建立的 znode ,顯示znode的數據、建立時間等狀態信息。
示例數據:
6)設置節點數據
經過 set 命令來對 zk 所關聯的字符串進行設置,設置/test路徑的數據爲「welcome!」。
7)刪除節點
delete /test
這篇就先了解一下zookeeper的應用場景和基本操做,還有Watch功能是監聽zookeeper目錄結構的變化的,發生變化時全部鏈接到zookeeper的客戶端都會實時收到事件,代表zookeeper的哪一個目錄內容發生了變化,變化先後的數據分別是什麼。經過watch功能,全部zookeeper客戶端實現了分佈式一致性存儲和及時更新。