Zookeeper不論是在實際項目中,還是在各種分布式開源項目中都得到了廣泛應用佑稠,從本篇博客開始骚勘,將為大家?guī)砦覍ookeeper的認識刀森。這個系列將會涵蓋Zookeeper的介紹、環(huán)境搭建隅要、配置說明蝴罪、Java操作Zookeeper(原生API方式)、zkclient操作Zookeeper方式步清、Zookeeper的典型應用場景分析以及Curator框架等洲炊。
Hello,Zookeeper
Zookeeper是一個高可用的分布式管理與協(xié)調(diào)框架,基于ZAB算法(原子消息廣播協(xié)議)實現(xiàn)尼啡。ZK能夠很好的保證分布式環(huán)境下的數(shù)據(jù)一致性暂衡,這一特性使得ZK是處理分布式一致性問題的利器!這個利器有哪些特性呢崖瞭,看看下面你就了解了狂巢。
可靠性:一旦Zookeeper成功的應用了一個事務,并完成對client的響應书聚,那么Zookeeper內(nèi)部集群的所有服務器的狀態(tài)都會是一致的保留下來唧领。
單一視圖:由于上面可靠性的保證,使得無論client連接的是ZK集群中的哪個服務器雌续,所看到的數(shù)據(jù)都是一致的斩个。
順序一致性:從一個client發(fā)起的請求,最終會嚴格的按照發(fā)起的順序被應用到Zookeeper中去驯杜∈苌叮【實質(zhì)上,ZK會對每一個client的每一個請求鸽心,進行編號滚局,說白了,就是分配一個全局唯一的遞增編號顽频,這個編號反映了所有事務操作的先后順序藤肢。】
實時性:通常意義下的實時性是指一旦事務被成功應用糯景,那么client會立刻從服務器端獲取到變更后的新數(shù)據(jù)嘁圈。ZK僅僅能夠保證在一定時間內(nèi)省骂,client最終一定會能從服務器上獲取到最新的數(shù)據(jù)。
高可用:在ZK集群內(nèi)部最住,會有一個Leader冀宴,多個Follower。一旦Leader掛掉温学,那么ZK會通過Paxos算法選舉出新的Leader略贮,只要ZK集群內(nèi)部的服務器有一半以上正常工作,那么ZK就能對外正常提供服務仗岖!
簡單的數(shù)據(jù)結(jié)構(gòu):類似于Linux文件系統(tǒng)的樹形結(jié)構(gòu)逃延,簡單,實用T簟(樹形層次空間)
高性能:性能有多高呢揽祥,舉個栗子,比如我們經(jīng)常通過創(chuàng)建臨時節(jié)點來處理分布式鎖檩电,要知道臨時節(jié)點是存儲在內(nèi)存中的拄丰,在讀場景壓力測試下,QPS高達10W+俐末!也就是說ZK在讀場景下料按,性能非常突出!
初步認識Zookeeper的數(shù)據(jù)模型
每一個節(jié)點被稱為znode卓箫,znode可以有子節(jié)點目錄载矿,并且每個znode可以存儲數(shù)據(jù)(特別需要注意的是臨時節(jié)點不可以有子節(jié)點)
znode如果是臨時節(jié)點,意味著創(chuàng)建這個znode的client一旦與ZK集群失去聯(lián)系烹卒,這個臨時的znode將被自動刪除闷盔。(事實上,client與ZK通信是采用長連接方式旅急,并通過心跳的方式保持連接逢勾,這種狀態(tài)就是session,一旦session失效藐吮,就是連接斷開溺拱,臨時節(jié)點會被刪除掉)
znode是可以被監(jiān)控的,不論是znode本身的數(shù)據(jù)變化炎码,還是該znode下的子節(jié)點的變化盟迟,都可以進行監(jiān)控秋泳,這也是ZK的核心特性潦闲。(很多應用場景就是基于這個特性,后續(xù)進行詳細介紹)
初步認識Zookeeper的角色組成
這里迫皱,我們先了解下ZK Server的身份特性:
Leader:負責客戶端的write類型的請求
Follower:負責客戶端的read類型請求歉闰,并可以參與Leader的選舉
watcher:后文介紹辖众。
install Zookeeper
這里以zookeeper-3.4.5版本為例,搭建一個ZK集群(至少要求3個節(jié)點和敬,并且各個ZK SERVER之間系統(tǒng)時間保持一致)凹炸。使用的機器列表是:192.168.99.121、192.168.99.122昼弟、192.168.99.123啤它。
以192.168.99.121為例進行說明:
配置說明:
tickTime:ZK集群與客戶端、ZK集群內(nèi)部SERVER之間的心跳間隔舱痘,默認2S变骡。
initLimit:在客戶端連接ZK集群時,可以忍受多少個心跳次數(shù)芭逝。上述的配置表明塌碌,如果client初始連接ZK集群,在10*2S=20S內(nèi)ZK集群沒有返回連接成功旬盯,即意味著連接失敗台妆。
syncLimit:表示ZK集群內(nèi)部Leader和Follower之間請求應答可以忍受多少個心跳次數(shù)。
dataDir:ZK保存數(shù)據(jù)以及日志的目錄胖翰。
clientPort:ZK集群對外暴露的接口接剩,即client訪問ZK集群的端口(2181)。
server.x = IP:port-a:port-b?
X表示是第幾號服務器萨咳,從0開始編號搂漠,并和dataDir下的myid文件對應。
port-a表示Leader和Follower進行信息通信的端口(2888)某弦。
port-b表示Follower進行選舉的端口(3888)桐汤。
基本的ZK命令
通過zkCli.sh進入客戶端進行操作:
查找ls、創(chuàng)建znode節(jié)點create(注意每個節(jié)點都是有值的)靶壮、獲取get怔毛、設(shè)置set。
我們觀察下下面幾個屬性:
ctime和cZxid是一對腾降,表示創(chuàng)建ZNODE的時間和事件編號拣度;
mtime和mZxid是一對,表示修改ZNODE數(shù)據(jù)內(nèi)容的時間和事件編號螃壤;(通過set指令會改變這2個屬性抗果,但是該節(jié)點的子節(jié)點的變化不會影響該節(jié)點)
dataVersion:表示ZNODE數(shù)據(jù)的版本,注意利用JAVA 原生API進行delete ZNODE時奸晴,需要提供version才可以刪除ZNODE冤馏。(當然我們可以提供-1來跳過版本檢查機制)
dataLength、numChildren都好理解寄啼。
另外逮光,注意rmr指令可以遞歸刪除ZNODE代箭;而delete只可以刪除指定ZNODE。
ZooInspector工具及IntelliJ IDEA與ZK集成
ZooInspector是一個可運行的JAR涕刚,運行后直接連接ZK集群中的任何一個SERVER即可嗡综。
OK,到這里杜漠,一切準備工作就緒了极景,晚安吧~
咱們下期來看JAVA操作ZK(基于Zookeeper的原生API)、分布式鎖場景驾茴、Watch特性等~