這篇文章主要講解了“zookeeper高級(jí)特性有哪些”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“zookeeper高級(jí)特性有哪些”吧!
成都創(chuàng)新互聯(lián)公司專注于仙桃網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供仙桃營(yíng)銷型網(wǎng)站建設(shè),仙桃網(wǎng)站制作、仙桃網(wǎng)頁(yè)設(shè)計(jì)、仙桃網(wǎng)站官網(wǎng)定制、成都微信小程序服務(wù),打造仙桃網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供仙桃網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
一、三個(gè)概念
1.CreateMode
在create的時(shí)候可以設(shè)置znode的類型
主要有四種:
PERSISTENT (持續(xù)的,相對(duì)于EPHEMERAL,不會(huì)隨著client的斷開而消失)
PERSISTENT_SEQUENTIAL(持久的且?guī)ы樞虻模?/p>
EPHEMERAL (短暫的,生命周期依賴于client session)
EPHEMERAL_SEQUENTIAL (短暫的,帶順序的)
2.Watcher
Watcher是一種反向推送機(jī)制,即zonde(包括他的child)有改變的時(shí)候會(huì)通知客戶端。
可以自定義Watcher,注冊(cè)給zonde。
watcher分為兩大類:data watches和child watches。前者監(jiān)聽數(shù)據(jù)的變動(dòng),后者監(jiān)聽子node的變動(dòng)。
Watcher是一次性的!一旦被調(diào)用,則需要重新注冊(cè)。
3.ACL
acl即access control。zookeeper通過(guò)ACL機(jī)制來(lái)控制權(quán)限。創(chuàng)建znode的時(shí)候可以指定。前邊我們講過(guò),一套zookeeper會(huì)被多個(gè)程序使用。就像linux支持多用戶一樣。所以需要有一套權(quán)限控制:不然自己創(chuàng)建的節(jié)點(diǎn),被別的應(yīng)用程序無(wú)緣無(wú)故刪了,那找誰(shuí)去?
Zookeeper的權(quán)限級(jí)別:
READ: 允許獲取該節(jié)點(diǎn)的值和列出子節(jié)點(diǎn)。
WRITE: 允許設(shè)置該節(jié)點(diǎn)的值。
CREATE: 允許創(chuàng)建子節(jié)點(diǎn)。
DELETE: 可以刪除子節(jié)點(diǎn)。
ADMIN: 超級(jí)權(quán)限。相當(dāng)于root
從上到下遞次增強(qiáng),后面的權(quán)限包含前面的權(quán)限。
zookeeper的很多高級(jí)特性,都是基于以上三個(gè)概念來(lái)實(shí)現(xiàn)的。特別是CreateMode和Watcher
二、java客戶端
zookeeper官方提供了java客戶端。提供的接口也比較基礎(chǔ)。比前一篇測(cè)試用到的telnet客戶端唯一強(qiáng)的一點(diǎn)就是:我們可以在代碼里實(shí)現(xiàn)Watcher接口實(shí)現(xiàn)擴(kuò)展的業(yè)務(wù)!在命令行可是做不到這點(diǎn)的。。
maven依賴:
org.apache.zookeeper zookeeper 3.4.6
下面是一些重要的接口列表。
接口都很直觀,描述也很詳細(xì)。就不做額外的說(shuō)明了。
三、一些高級(jí)特性實(shí)現(xiàn)原理。
1.Name Service:有點(diǎn)類似JNDI,樹形目錄天生的就有全局唯一名稱。這功能實(shí)踐中也沒(méi)什么用,而且替代方案也很多。略。
2.配置推送:比如某個(gè)前端網(wǎng)站有100臺(tái)機(jī)器,我們要做的是在每臺(tái)機(jī)器上都有一個(gè)main程序連zookeeper,注冊(cè)好Watcher。在本地連zookeeper把配置寫入,zookeeper就會(huì)通過(guò)Watcher,自動(dòng)把配置推送到這些機(jī)器上。而不需要去手動(dòng)去更新。(相當(dāng)于運(yùn)維的腳本。)
3.集群管理:
每個(gè)Server起來(lái)之后都在 Zookeeper 上創(chuàng)建一個(gè) EPHEMERAL 類型的znode,假設(shè)他們都有一個(gè)共同的父GroupMembers!我們?cè)诿總€(gè)Server上調(diào)用getChildren(GroupMembers)方法,并注冊(cè)一個(gè) Child Watcher。由于是 EPHEMERAL 的znode,當(dāng)創(chuàng)建它的 Server 死去,這個(gè)znode也隨之被刪除,所以 Children 將會(huì)變化,這時(shí) getChildren上的 Watcher 將會(huì)被調(diào)用,所以其它 Server 就知道已經(jīng)有某臺(tái) Server 死去了。新增 Server 也是同樣的原理。
4.Leader選舉
和集群管理的設(shè)計(jì)基本一樣,不同的地方是,這次創(chuàng)建的znone類型是EPHEMERAL_SEQUENTIAL ,不僅僅隨著member的同生同滅,而且是有順序的。我們只要把編號(hào)最小的member認(rèn)為是Master,就可以做到Leader的動(dòng)態(tài)選舉!
5.全局鎖
zookeeper可以利用他優(yōu)秀的數(shù)據(jù)一致性算法來(lái)提供可靠的全局鎖服務(wù)。
獲得鎖是一個(gè)遞歸的過(guò)程
1.創(chuàng)建znode "/distributed_lock"
2.在distributed_lock下新建子節(jié)點(diǎn)"/distributed_lock/xxxxxx",EPHEMERAL_SEQUENTIAL 模式,當(dāng)前序號(hào)假如是i。
3.對(duì)distributed_lock調(diào)用getChildren(),如果i是children列表里最小的,則獲得鎖;否則進(jìn)入第4步
4.等待children列表里緊跟在i后邊的那個(gè)節(jié)點(diǎn)被刪除的通知(exists()方法)。記為j。而j又依賴于僅比j小的節(jié)點(diǎn)k。一直遞歸等待最小的znode的被刪除。。
注:雖然EPHEMERAL_SEQUENTIAL是遞增的,但仍然不能粗暴的認(rèn)為緊跟在i后邊的節(jié)點(diǎn)j=i-1。這是因?yàn)獒尫沛i的順序并不是完全按照節(jié)點(diǎn)順序!
釋放鎖:
刪除自己創(chuàng)建的子節(jié)點(diǎn)即可
6.分布式隊(duì)列
類似于上邊全局鎖的設(shè)計(jì)。只要確保每次消費(fèi)的時(shí)候編號(hào)都是最小的。就能做到先進(jìn)先出。
7 。。。略 根據(jù)zookeeper創(chuàng)建節(jié)點(diǎn)類型的不同,再結(jié)合Watcher特性。還可以提供其他很多的功能。比如各種類型queue,各種類型的Lock(上面僅僅介紹了write鎖),barriers,信號(hào)量Semaphore 原子類型AtomicInteger等等。。。
所有的這些都是分布式的,高可靠的。
更多更全的功能在netflix 公司開源的 zookeeper客戶端Curator中有實(shí)現(xiàn)。作為普通開發(fā)者,直接使用Curator是最高效的!
感謝各位的閱讀,以上就是“zookeeper高級(jí)特性有哪些”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)zookeeper高級(jí)特性有哪些這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!