1.? ZooKeeper 的學(xué)習(xí) 與應(yīng)用
?
1.1.? 概述
?
??? ZooKeeper 是 Apache 在非常多云計算項目中的一個,與 Hadoop 密切相關(guān),這樣的情況導(dǎo)致我一開始覺得 ZooKeeper 的搭建須要 Hadoop 項目作為支持,可是最后發(fā)現(xiàn)全然不須要,它是能夠單獨(dú)執(zhí)行的一個項目。
??? 在網(wǎng)上看到了一個非常不錯的關(guān)于 ZooKeeper 的介紹:?顧名思義動物園管理員,他是拿來管大象 (Hadoop)? 、?蜜蜂 (Hive)? 、?小豬 (Pig)?? 的管理員,? Apache?Hbase 和? Apache?Solr? 以及 LinkedIn?sensei?? 等項目中都採用到了? Zookeeper 。 ZooKeeper 是一個分布式的,開放源代碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù), ZooKeeper 是以 Fast?Paxos 算法為基礎(chǔ),實(shí)現(xiàn)同步服務(wù),配置維護(hù)和命名服務(wù)等分布式應(yīng)用。
??? 從介紹能夠看出, ZooKeeper 更傾向于對大型應(yīng)用的協(xié)同維護(hù)管理工作。 IBM 則給出了 IBM 對 ZooKeeper 的認(rèn)知:? Zookeeper? 分布式服務(wù)框架是? Apache?Hadoop? 的一個子項目,它主要是用來解決分布式應(yīng)用中常常遇到的一些數(shù)據(jù)管理問題,如:統(tǒng)一命名服務(wù)、狀態(tài)同步服務(wù)、集群管理、分布式應(yīng)用配置項的管理等。
??? 總之,我覺得它的核心詞就是一個單詞,協(xié)調(diào)。
?
1.2.? ZooKeeper 的特征
?
??? 在 Hadoop 權(quán)威指南中看到了關(guān)于 ZooKeeper 的一些核心特征,閱讀之后感覺總結(jié)的甚是精辟,在這里引用并總結(jié)。
?
1.2.1.? 簡易
??? ZooKeeper 的最重要核心就是一個精簡文件系統(tǒng),提供一些簡單的操作以及附加的抽象(比如排序和通知)。
?
1.2.2.? 易表達(dá)
??? ZooKeeper 的原型是一個豐富的集合,它們是一些已建好的塊,能夠用來構(gòu)建大型的協(xié)作數(shù)據(jù)結(jié)構(gòu)和協(xié)議,比如:分布式隊列、分布式鎖以及一組對等體的選舉。
?
1.2.3.? 高可用性
??? ZooKeeper 執(zhí)行在一些集群上,被設(shè)計成可用性較高的,因此應(yīng)用程序能夠依賴它。 ZooKeeper 能夠幫助你的系統(tǒng)避免單點(diǎn)故障,從而建立一個可靠的應(yīng)用程序。
?
1.2.4.? 松散耦合
??? ZooKeeper 的交互支持參與者之間并不了解對方。比如: ZooKeeper 能夠被當(dāng)做一種公共的機(jī)制,使得進(jìn)程彼此不知道對方的存在也能夠相互發(fā)現(xiàn)而且交互,對等方可能甚至不是同步的。
??? 這一特點(diǎn)我感覺最能體如今集群的部署啟動過程中。像 Hadoop 當(dāng)把配置文件寫好之后,然后執(zhí)行啟動腳本,則 251 , 241 , 242 中作為集群的虛擬機(jī)是同步啟動的,也就是 DataNode , NameNode , TaskTracker ,以及 JobTracker 的啟動并執(zhí)行時在一次啟動過程中啟動的,就是執(zhí)行一次啟動腳本文件,則都啟動起來。可是 ZooKeeper 的啟動過程卻不是這種。我在 251 , 241 , 242 部署了 ZooKeeper 集群,并進(jìn)行啟動,則啟動的過程是這種:首先 ssh 到 251 然后啟動,這時候 251 的集群節(jié)點(diǎn)啟動起來,可是控制臺一直報錯,大概的含義就是沒有檢測到其它兩個結(jié)點(diǎn)。接著分別 ssh 到 241 , 242 ,分別啟動集群中的剩下的結(jié)點(diǎn),當(dāng) 241 啟動起來時,回到 251 查看,發(fā)現(xiàn)報錯的信息降低,意思是僅僅差一個結(jié)點(diǎn)。當(dāng) 251 , 241 , 242 三臺server的結(jié)點(diǎn)所有啟動起來,則三臺的server的控制臺打印出正常的信息。
?
1.2.5.? ZooKeeper 是一個庫
??? ZooKeeper 提供了一個開源的、共享的運(yùn)行存儲,以及通用協(xié)作的方法,分擔(dān)了每一個程序猿寫通用協(xié)議的負(fù)擔(dān)。隨著時間的推移,人們能夠添加和改進(jìn)這個庫來滿足自己的需求。
?
1.3.? Zookeeper 基本知識
?
??? 在這一小結(jié),我介紹關(guān)于 ZooKeeper 的一些基本理論知識,以便對 ZooKeeper 有一個基本感性的認(rèn)識吧,因?yàn)閷W(xué)習(xí)的時間不長,有些的認(rèn)識可能是比較片面的,之后假設(shè)有了更深層次的認(rèn)識,會補(bǔ)充于之后的月總結(jié)中。
?
1.3.1.? 層次化的名字空間
??? ZooKeeper 的整個名字空間的結(jié)構(gòu)是層次化的,和一般的 Linux 文件系統(tǒng)結(jié)構(gòu)非常相似,一顆非常大的樹。這也就是 ZooKeeper 的數(shù)據(jù)結(jié)構(gòu)情況。名字空間的層次由斜杠 / 來進(jìn)行切割,在名稱空間里面的每個結(jié)點(diǎn)的名字空間唯一由這個結(jié)點(diǎn)的路徑來確定。
圖 3.1?ZooKeeper 的層次化名字空間
??? 每個節(jié)點(diǎn)擁有自身的一些信息,包含:數(shù)據(jù)、數(shù)據(jù)長度、創(chuàng)建時間、改動時間等等。從這樣一類既含有數(shù)據(jù),又作為路徑表標(biāo)示的節(jié)點(diǎn)的特點(diǎn)中,能夠看出, ZooKeeper 的節(jié)點(diǎn)既能夠被看做是一個文件,又能夠被看做是一個文件夾,它同一時候具有二者的特點(diǎn)。為了便于表達(dá),今后我們將使用 Znode 來表示所討論的 ZooKeeper 節(jié)點(diǎn)。
?
1.3.2.? Znode
??? Znode 維護(hù)著數(shù)據(jù)、 ACL ( access?control?list ,訪問控制列表)、時間戳等交換版本等數(shù)據(jù)結(jié)構(gòu),它通過對這些數(shù)據(jù)的管理來讓緩存生效而且令協(xié)調(diào)更新。每當(dāng) Znode 中的數(shù)據(jù)更新后它所維護(hù)的版本將添加,這很類似于數(shù)據(jù)庫中計數(shù)器時間戳的操作方式。
另外 Znode 還具有原子性操作的特點(diǎn):命名空間中,每個 Znode 的數(shù)據(jù)將被原子地讀寫。讀操作將讀取與 Znode 相關(guān)的全部數(shù)據(jù),寫操作將替換掉全部的數(shù)據(jù)。除此之外,每個節(jié)點(diǎn)都有一個訪問控制列表,這個訪問控制列表規(guī)定了用戶操作的權(quán)限。
??? ZooKeeper 中相同存在暫時節(jié)點(diǎn)。這些節(jié)點(diǎn)與 session 同一時候存在,當(dāng) session 生命周期結(jié)束,這些暫時節(jié)點(diǎn)也將被刪除。暫時節(jié)點(diǎn)在某些場合也發(fā)揮著很關(guān)鍵的數(shù)據(jù)。
1.3.3.? Watch 機(jī)制
??? Watch 機(jī)制就和單詞本身的意思一樣,看??词裁??詳細(xì)來講就是某一個或者一些 Znode 的變化。官方給出的定義:一個 Watch 事件是一個一次性的觸發(fā)器,當(dāng)被設(shè)置了 Watch 的數(shù)據(jù)發(fā)生了改變的時候,則server將這個改變發(fā)送給設(shè)置了 Watch 的client,以便通知它們。
Watch 機(jī)制主要有下面三個特點(diǎn):
1? 一次性的觸發(fā)器( one-time?trigger )
??? 當(dāng)數(shù)據(jù)改變的時候,那么一個 Watch 事件會產(chǎn)生而且被發(fā)送到client中??墒莄lient僅僅會收到一次這種通知,假設(shè)以后這個數(shù)據(jù)再次發(fā)生改變的時候,之前設(shè)置 Watch 的client將不會再次收到改變的通知,由于 Watch 機(jī)制規(guī)定了它是一個一次性的觸發(fā)器。
2? 發(fā)送給client
??? 這個表明了 Watch 的通知事件是從server發(fā)送給client的,是異步的,這就表明不同的client收到的 Watch 的時間可能不同,可是 ZooKeeper 有保證:當(dāng)一個client在看到 Watch 事件之前是不會看到結(jié)點(diǎn)數(shù)據(jù)的變化的。比如: A=3 ,此時在上面設(shè)置了一次 Watch ,假設(shè) A 突然變成 4 了,那么client會先收到 Watch 事件的通知,然后才會看到 A=4 。
3 被設(shè)置 Watch 的數(shù)據(jù)
??? 這表明了一個結(jié)點(diǎn)能夠變換的不同方式。一個 Znode 變化方式有兩種,結(jié)點(diǎn)本身數(shù)據(jù)的變化以及結(jié)點(diǎn)孩子的變化。因此 Watch 也能夠設(shè)置為這個 Znode 的結(jié)點(diǎn)數(shù)據(jù),當(dāng)然也能夠設(shè)置為 Znode 結(jié)點(diǎn)孩子。
?
1.3.4.? ACL 訪問控制列表
??? 這是另外一個和 Linux 操作系統(tǒng)很相似的地方, ZooKeeper 使用 ACL 來控制對旗下 Znode 結(jié)點(diǎn)們的訪問。 ACL 的實(shí)現(xiàn)和 Linux 文件系統(tǒng)的訪問權(quán)限十分類似:它通過設(shè)置權(quán)限為來表明是否同意對一個結(jié)點(diǎn)的相關(guān)內(nèi)容的改變。
??? 可是與傳統(tǒng) Linux 機(jī)制不太同樣,一個結(jié)點(diǎn)的數(shù)據(jù)沒有類似“擁有者,組用戶,其它用戶”的概念,在 ZooKeeper 中, ACL 通過設(shè)置 ID 以及與其關(guān)聯(lián)的權(quán)限來完畢訪問控制的。 ACL 的權(quán)限組成語法是:
(scheme:expression,?perms)
前者表明設(shè)置的 ID ,逗號后面表示的是 ID 相關(guān)的權(quán)限,比如:
? ( ip:172.16.16.1 ,?READ)
指明了 IP 地址為如上的用戶的權(quán)限為僅僅讀。
?
下面列舉下面 ACL 所具有的權(quán)限
CREATE :表明你能夠創(chuàng)建一個 Znode 的子結(jié)點(diǎn)。
READ :你能夠得到這個結(jié)點(diǎn)的數(shù)據(jù)以及列舉該結(jié)點(diǎn)的子結(jié)點(diǎn)情況。
WRITE :設(shè)置一個結(jié)點(diǎn)的數(shù)據(jù)。
DELETE :能夠刪除一個結(jié)點(diǎn)
ADMIN :對一個結(jié)點(diǎn)設(shè)置權(quán)限。
?
1.4.? ZooKeeper 的部署以及簡單使用
?
??? 要想使用 ZooKeeper ,首先就要把它部署在server上跑起來,就想 Apache , Tomcat , FtpServer 等server一樣。 ZooKeeper 的部署方式主要有三種,單機(jī)模式、偽集群模式、集群模式。事實(shí)上剩下的兩種模式都是集群模式的特殊情況。
?
1.4.1.? 主要的環(huán)境變量配置
??? Java 大型的項目中,環(huán)境變量的配置非常重要,假設(shè)沒有非常好的配置環(huán)境變量的話,甚至項目連啟動都是難事。
export?ZOOKEEPER_HOME=/ home /zookeeper-3.3. 3
export?PATH=$PATH:$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf
?
??? 1.4.2.? ZooKeeper 的單機(jī)模式部署
ZooKeeper 的單機(jī)模式一般是用來高速測試client應(yīng)用程序的,在實(shí)際過程中不可能是單機(jī)模式。單機(jī)模式的配置也比較簡單。
l? 編寫配置文件 zoo.cfg
??? zookeeper-3.3.3/conf 目錄以下就是要編寫配置文件的位置了。在目錄以下新建一個文件 zoo.cfg 。 ZooKeeper 的執(zhí)行默認(rèn)是讀取 zoo.cfg 文件中面的內(nèi)容的。以下是一個最簡單的配置文件的例子:
tickTime=2000
dataDir=/var/zookeeper
clientPort=2181
??? 在這個文件里,我們須要指定? dataDir? 的值,它指向了一個文件夾,這個文件夾在開始的時候須要為空。以下是每一個參數(shù)的含義:
tickTime? :基本事件單元,以毫秒為單位。這個時間是作為? Zookeeper? server之間或client與server之間維持心跳的時間間隔,也就是每一個? tickTime? 時間就會發(fā)送一個心跳。?
dataDir? :存儲內(nèi)存中數(shù)據(jù)庫快照的位置,顧名思義就是? Zookeeper? 保存數(shù)據(jù)的文件夾,默認(rèn)情況下, Zookeeper? 將寫數(shù)據(jù)的日志文件也保存在這個文件夾里。?
clientPort? :這個port就是client連接? Zookeeper? server的port, Zookeeper? 會監(jiān)聽這個port,接受client的訪問請求。
??? 使用單機(jī)模式時用戶須要注意:這樣的配置方式下沒有? ZooKeeper? 副本,所以假設(shè)? ZooKeeper? server出現(xiàn)問題,? ZooKeeper? 服務(wù)將會停止。
l? 執(zhí)行執(zhí)行腳本
??? 在 zookeeper-3.3.3/bin 目錄以下執(zhí)行 zkServer.sh 就可以,執(zhí)行完成之后則 ZooKeeper 服務(wù)變啟動起來。
./ zkServer.sh?start
??? 腳本默認(rèn)調(diào)用 zoo.cfg 里面的配置,因此程序正常啟動。
?
1.4.3.? ZooKeeper 的集群模式部署
??? ZooKeeper 的集群模式下,多個 Zookeeper server在工作前會選舉出一個 Leader ,在接下來的工作中這個被選舉出來的 Leader 死了,而剩下的 Zookeeper server會知道這個 Leader 死掉了,在活著的 Zookeeper 集群中會繼續(xù)選出一個 Leader ,選舉出 Leader 的目的是為了能夠在分布式的環(huán)境中保證數(shù)據(jù)的一致性。如圖所看到的:
圖 3.2?ZooKeeper 集群模式圖
l? 確認(rèn)集群server的數(shù)量
??? 因?yàn)? ZooKeeper 集群中,會有一個 Leader 負(fù)責(zé)管理和協(xié)調(diào)其它集群server,因此server的數(shù)量通常都是單數(shù),比如 3 , 5 , 7... 等,這樣 2n+1 的數(shù)量的server就能夠同意最多 n 臺server的失效。
l? 編寫配置文件
配置文件須要在每臺server中都要編寫,下面是一個配置文件的樣本:
#?Filename?zoo.cfg
tickTime=2000
dataDir=/var/zookeeper/
clientPort=2181
initLimit=5
syncLimit=2
server.1= 202.115.36.251 :2888:3888
server.2= 202.115.36.241 :2888:3888
server.3= 202.115.36.242 :2888:3888
??? initLimit :這個配置項是用來配置? Zookeeper? 接受client(這里所說的client不是用戶連接? Zookeeper? server的client,而是? Zookeeper? server集群中連接到? Leader? 的? Follower? server)初始化連接時最長能忍受多少個心跳時間間隔數(shù)。當(dāng)已經(jīng)超過? 10? 個心跳的時間(也就是? tickTime )長度后? Zookeeper? server還沒有收到client的返回信息,那么表明這個client連接失敗。總的時間長度就是? 5*2000=10? 秒 。
??? syncLimit :這個配置項標(biāo)識? Leader? 與? Follower? 之間發(fā)送消息,請求和應(yīng)答時間長度,最長不能超過多少個? tickTime? 的時間長度,總的時間長度就是? 2*2000=4? 秒?
??? server.A=B : C : D :當(dāng)中? A? 是一個數(shù)字,表示這個是第幾號server; B? 是這個server的? ip? 地址; C? 表示的是這個server與集群中的? Leader? server交換信息的port; D? 表示的是萬一集群中的? Leader? server掛了,須要一個port來又一次進(jìn)行選舉,選出一個新的? Leader ,而這個port就是用來運(yùn)行選舉時server相互通信的port。假設(shè)是偽集群的配置方式,因?yàn)? B? 都是一樣,所以不同的? Zookeeper? 實(shí)例通信port號不能一樣,所以要給它們分配不同的port號。
l? 創(chuàng)建 myid 文件
??? 除了改動? zoo.cfg? 配置文件,集群模式下還要配置一個文件? myid ,這個文件在? dataDir? 文件夾下,這個文件中面就僅僅有一個數(shù)據(jù)就是? A? 的值, Zookeeper? 啟動時會讀取這個文件,拿到里面的數(shù)據(jù)與? zoo.cfg? 里面的配置信息比較從而推斷究竟是那個? server 。
l? 執(zhí)行執(zhí)行腳本
??? 和單機(jī)模式下的執(zhí)行方式基本同樣,值得注意的地方就是要分別在不同server上執(zhí)行一次,比如分別在 251 , 241 , 242 上執(zhí)行:
./ zkServer.sh?start
這樣才干使得整個集群啟動起來。
?
1.4.4.? ZooKeeper 的集群偽分布
??? 事實(shí)上在企業(yè)中式不會存在的,另外為了測試一個client程序也沒有必要存在,僅僅有在物質(zhì)條件比較匱乏的條件下才會存在的模式。
集群偽分布模式就是在單機(jī)下模擬集群的 ZooKeeper 服務(wù),在一臺機(jī)器上面有多個 ZooKeeper 的 JVM 同一時候執(zhí)行。
l? 確認(rèn)集群偽server的數(shù)量
??? 2n+1 ,和之前的集群分布同樣。
l? 編寫配置文件
??? 在 /conf 目錄新建三個配置文件, zoo1.cfg , zoo2.cfg 以及 zoo3.cfg 。配置文件分別例如以下編寫:
Zoo1.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/root/hadoop-0.20.2/zookeeper-3.3.1/d_1
clientPort=2181
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889
Zoo2.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/root/hadoop-0.20.2/zookeeper-3.3.1/d_ 2
clientPort=218 2
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889
Zoo3.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/root/hadoop-0.20.2/zookeeper-3.3.1/d_ 3
clientPort=218 3
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889
??? 因?yàn)槿齻€服務(wù)都在同一臺電腦上,因此這里要保證地址的唯一性,因此要特別注意 IP 地址和port號不要互相沖突,以免影響程序的正確運(yùn)行。
l? 創(chuàng)建 myid 文件
??? 這個同集群模式部署,在各自的目錄以下創(chuàng)建。
l? 執(zhí)行執(zhí)行腳本
??? 因?yàn)槿康呐渲梦募荚? /conf 目錄以下,因此要運(yùn)行三次,并且要加文件名稱的參數(shù),不然會默認(rèn)運(yùn)行 zoo.cfg 這個文件,例如以下:
./ zkServer.sh?start?zoo1.cfg
./ zkServer.sh?start?zoo2.cfg
./ zkServer.sh?start?zoo3.cfg
運(yùn)行完畢后,將完畢 ZooKeeper 的集群偽分布的啟動。
?
1.4.5.? 通過 ZooKeeper 命令行工具訪問 ZooKeeper
??? ZooKeeper 命令行工具類似于 Linux 的 shell 環(huán)境,只是功能肯定不及 shell 啦,可是使用它我們能夠簡單的對 ZooKeeper 進(jìn)行訪問,數(shù)據(jù)創(chuàng)建,數(shù)據(jù)改動等操作。
當(dāng)啟動? ZooKeeper? 服務(wù)成功之后,輸入下述命令,連接到? ZooKeeper? 服務(wù):
zkCli.sh?–server? 202.115.36.251 :2181
連接成功后,系統(tǒng)會輸出? ZooKeeper? 的相關(guān)環(huán)境以及配置信息,并在屏幕輸出“? Welcome?to?ZooKeeper? ”等信息。
命令行工具的一些簡單操作例如以下:
1? )使用? ls? 命令來查看當(dāng)前? ZooKeeper? 中所包括的內(nèi)容:
[zk:?202.115.36.251:2181(CONNECTED)?1]?ls?/
2? )創(chuàng)建一個新的? znode? ,使用? create?/zk?myData? 。這個命令創(chuàng)建了一個新的? znode? 節(jié)點(diǎn)“? zk? ”以及與它關(guān)聯(lián)的字符串:
[zk:?202.115.36.251:2181(CONNECTED)?2]?create?/zk?"myData"
3? )我們執(zhí)行? get? 命令來確認(rèn)? znode? 是否包括我們所創(chuàng)建的字符串:
[zk:?202.115.36.251:2181(CONNECTED)?3]?get?/zk
4? )以下我們通過? set? 命令來對? zk? 所關(guān)聯(lián)的字符串進(jìn)行設(shè)置:
[zk:?202.115.36.251:2181(CONNECTED)?4]?set?/zk?"zsl"
5? )以下我們將剛才創(chuàng)建的? znode? 刪除:
[zk:?202.115.36.251:2181(CONNECTED)?5]?delete?/zk
?
1.4.6.? 使用 API 來訪問 ZooKeeper
??? API 訪問 ZooKeeper 才是client基本的使用手段,通過在client編寫豐富多彩的程序,來達(dá)到對 ZooKeeper 的利用。這里給出一個簡單的樣例:(深入的還沒能力給出啊,樣例是從網(wǎng)上找的非常清晰明了)
1.?import?java.io.IOException;
2.
3.?import?org.apache.zookeeper.CreateMode;
4.?import?org.apache.zookeeper.KeeperException;
5.?import?org.apache.zookeeper.Watcher;
6.?import?org.apache.zookeeper.ZooDefs.Ids;
7.?import?org.apache.zookeeper.ZooKeeper;
8.
9.?public?class?demo?{
10.?????//? 會話超時時間,設(shè)置為與系統(tǒng)默認(rèn)時間一致
11.?????private?static?final?int?SESSION_TIMEOUT=30000;
12.????
13.?????//? 創(chuàng)建? ZooKeeper? 實(shí)例
14.?????ZooKeeper?zk;
15.????
16.?????//? 創(chuàng)建? Watcher? 實(shí)例
17.?????Watcher?wh=new?Watcher(){
18.????????????public?void?process(org.apache.zookeeper.WatchedEvent?event)
19.????????????{
20.????????????????????System.out.println(event.toString());
21.????????????}
22.?????};
23.????
24.?????//? 初始化? ZooKeeper? 實(shí)例
25.?????private?void?createZKInstance()?throws?IOException
26.?????{?????????????
27.????????????zk=new?ZooKeeper("localhost:2181",demo.SESSION_TIMEOUT,this.wh);
28.???????????
29.?????}
30.????
31.?????private?void?ZKOperations()?throws?IOException,InterruptedException,KeeperException
32.?????{
33.????????????System.out.println("\n1.? 創(chuàng)建? ZooKeeper? 節(jié)點(diǎn)? (znode? :? zoo2,? 數(shù)據(jù):? myData2? ,權(quán)限:? OPEN_ACL_UNSAFE? ,節(jié)點(diǎn)類型:? Persistent");
34.????????????zk.create("/zoo2","myData2".getBytes(),?Ids.OPEN_ACL_UNSAFE,?CreateMode.PERSISTENT);
35.???????????
36.????????????System.out.println("\n2.? 查看是否創(chuàng)建成功:? ");
37.????????????System.out.println(new?String(zk.getData("/zoo2",false,null)));
38.???????????????????????????
39.????????????System.out.println("\n3.? 改動節(jié)點(diǎn)數(shù)據(jù)? ");
40.????????????zk.setData("/zoo2",?"shenlan211314".getBytes(),?-1);
41.???????????
42.????????????System.out.println("\n4.? 查看是否改動成功:? ");
43.????????????System.out.println(new?String(zk.getData("/zoo2",?false,?null)));
44.???????????????????????????
45.????????????System.out.println("\n5.? 刪除節(jié)點(diǎn)? ");
46.????????????zk.delete("/zoo2",?-1);
47.???????????
48.????????????System.out.println("\n6.? 查看節(jié)點(diǎn)是否被刪除:? ");
49.????????????System.out.println("? 節(jié)點(diǎn)狀態(tài):? ["+zk.exists("/zoo2",?false)+"]");
50.?????}
51.????
52.?????private?void?ZKClose()?throws??InterruptedException
53.?????{
54.????????????zk.close();
55.?????}
56.????
57.?????public?static?void?main(String[]?args)?throws?IOException,InterruptedException,KeeperException?{
58.????????????demo?dm=new?demo();
59.????????????dm.createZKInstance(?);
60.????????????dm.ZKOperations();
61.????????????dm.ZKClose();
62.?????}
63.}
??? 此類包括兩個基本的 ?ZooKeeper? 函數(shù),分別為 ?createZKInstance? ()和 ?ZKOperations? ()。當(dāng)中 ?createZKInstance? ()函數(shù)負(fù)責(zé)對 ?ZooKeeper? 實(shí)例 ?zk? 進(jìn)行初始化。 ?ZooKeeper? 類有兩個構(gòu)造函數(shù),我們這里使用 ? “ ?ZooKeeper? ( ?String?connectString,? , ?int?sessionTimeout,? , ?Watcher?watcher? ) ” 對其進(jìn)行初始化。因此,我們須要提供初始化所需的,連接字符串信息,會話超時時間,以及一個 ?watcher? 實(shí)例。 ?17? 行到 ?23? 行代碼,是程序所構(gòu)造的一個 ?watcher? 實(shí)例,它可以輸出所發(fā)生的事件。
??? ZKOperations? ()函數(shù)是我們所定義的對節(jié)點(diǎn)的一系列操作。它包含:創(chuàng)建 ?ZooKeeper? 節(jié)點(diǎn)( ?33? 行到 ?34? 行代碼)、查看節(jié)點(diǎn)( ?36? 行到 ?37? 行代碼)、改動節(jié)點(diǎn)數(shù)據(jù)( ?39? 行到 ?40? 行代碼)、查看改動后節(jié)點(diǎn)數(shù)據(jù)( ?42? 行到 ?43? 行代碼)、刪除節(jié)點(diǎn)( ?45? 行到 ?46? 行代碼)、查看節(jié)點(diǎn)是否存在( ?48? 行到 ?49? 行代碼)。另外,須要注意的是:在創(chuàng)建節(jié)點(diǎn)的時候,須要提供節(jié)點(diǎn)的名稱、數(shù)據(jù)、權(quán)限以及節(jié)點(diǎn)類型。此外,使用 ?exists? 函數(shù)時,假設(shè)節(jié)點(diǎn)不存在將返回一
個 ?null? 值。
?
1.5.? 小結(jié)
??? 對于 ZooKeeper 的認(rèn)識眼下處在比較淺顯的狀態(tài),了解到了主要的服務(wù)的部署以及大概 ZooKeeper 的工作原理。非常多東西都是僅僅懂得皮毛,如今可以深深地感受到“僅僅有結(jié)合詳細(xì)的應(yīng)用才干使你對一個東西有較深的了解”這句話的深刻含義了。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
