zookeeper基礎(chǔ)介紹課件_第1頁
zookeeper基礎(chǔ)介紹課件_第2頁
zookeeper基礎(chǔ)介紹課件_第3頁
zookeeper基礎(chǔ)介紹課件_第4頁
zookeeper基礎(chǔ)介紹課件_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

Zookeeper淘寶-技術(shù)研發(fā)部-市場產(chǎn)品技術(shù)-開發(fā)-社區(qū)SNS-王釗Zookeeper能幫我們做什么

Zookeeper是一個分布式的,開源的分布式應(yīng)用程序協(xié)調(diào)服務(wù),用它可以來現(xiàn)同步服務(wù),配置維護同步服務(wù):利用zookeeper可以使機器之間的同步如同concurrent包下的同步器同步線程一樣,舉兩個互斥同步的例子1.應(yīng)用系統(tǒng)部署在多臺機器上,需要啟動一個時間任務(wù),而這個時間任務(wù)只能在一臺機器上執(zhí)行,否則會出現(xiàn)臟讀臟寫,zookeeper可以實現(xiàn)。2.應(yīng)用系統(tǒng)部署在多臺機器上,需要暴露一個服務(wù),而這個服務(wù)同樣不是全部的機器都有暴露,例如MASTER,而暴露這個服務(wù)的機器宕機后,其它的機器能自動的接替暴露這個服務(wù),zookeeper可以實現(xiàn)。配置維護:服務(wù)集群需要使用一組配置,為了保證配置在集群中的一致性,以及對配置更改后的立即響應(yīng)要求,使用zookeeper可以實現(xiàn)。

Zookeeper應(yīng)用結(jié)構(gòu)Zookeeper應(yīng)用機器結(jié)構(gòu)Zookeeper數(shù)據(jù)組織形式

Zookeeper提供接口建立連接

需要指定Zookeeper集群的IP地址,SessionTimeout,默認的watcher數(shù)據(jù)操作1.create創(chuàng)建一個節(jié)點,并在這個節(jié)點處寫入數(shù)據(jù),創(chuàng)建節(jié)點有四種模式

PERSISTENT創(chuàng)建持久化節(jié)點,對應(yīng)機器關(guān)閉連接后節(jié)點/數(shù)據(jù)不會消失

PERSISTENT_SEQUENTIAL如果PATH是以’/’結(jié)尾則以這個PATH作為父節(jié)點,創(chuàng)

建一個子節(jié)點,其子節(jié)點名字是一個按先后順序排列的數(shù)值;否則創(chuàng)建一個名字是

‘/’后面字符加上先后順序排列的數(shù)值字符串的節(jié)點,同樣創(chuàng)建持久節(jié)點

EPHEMERAL創(chuàng)建瞬時節(jié)點,Zookeeper在感知連接機器宕機后會清除它創(chuàng)建的瞬

節(jié)點EPHEMERAL_SEQUENTIAL穿件瞬時順序節(jié)點,和PERSISTENT_SEQUENTIAL

一樣,區(qū)別在于它是瞬時的

pathPERSISTENTPERSISTENT_SEQUENTIAL/lock/error在/lock/下創(chuàng)建子節(jié)點:/lock/000001/lock創(chuàng)建/lock節(jié)點創(chuàng)建節(jié)點/lock000001Zookeeper提供接口數(shù)據(jù)操作2.delete刪除一個節(jié)點3.exists查看一個節(jié)點的狀況,如果沒有返回null,可注入watcher4.getData獲取一個節(jié)點的數(shù)據(jù),可注入watcher5.setData設(shè)置一個節(jié)點的數(shù)據(jù)6.getChildren獲取一個節(jié)點的子節(jié)點,可注入watcherZookeeper保證1.sequentialconsistencyforsingleclient2.atomicity–updateeithersuccessorfail3.singlesystemimage–aclientwillseethesameviewoftheserviceregardlessoftheserverthatitconnectsto4.reliability–onceanupdatehasbeenapplied,itwillpersistformthattimeforwarduntilaclientoverwritetheupdate

WatcherWatcher種類,Zookeeper全局管理Watcher1.Zookeeper實例化時注入的默認Watcher2.dataWatchers一個Map<stringSet<Watcher>>數(shù)據(jù)結(jié)構(gòu),保存調(diào)用getData時

注入的Watcher或者調(diào)用exist時path指定的節(jié)點存在3.existWatchers一個Map<stringSet<Watcher>>數(shù)據(jù)結(jié)構(gòu),保存調(diào)用exits時

對應(yīng)的path節(jié)點不存在條件下注入的Watcher4.childWatchers一個Map<stringSet<Watcher>>數(shù)據(jù)結(jié)構(gòu),保存調(diào)用getChildren

時注入的WatcherWatcher管理

1.當調(diào)用exists,getData,getChildren函數(shù)時會需要傳入一個Watcher,對應(yīng)的path上的數(shù)據(jù)發(fā)生改變時,zookeeper服務(wù)器會發(fā)送NOTIFY包給客戶端,

客戶端在收到NOTIFY包后根據(jù)包指明的path和事件類別回調(diào)有關(guān)Watcher

的process函數(shù)2.當調(diào)用getData時將注入的Watcher加入到dataWatchers.get(path)的SET里面,

調(diào)用childWatchers時一樣3.當調(diào)用exists時,如果path不存在則加入到existWatchers.get(path)的SET里面,

否則加入到dataWatchers.get(path)的SET里面

Zookeeper事件Zookeeper事件由服務(wù)器發(fā)過來的NOTIFY包和客戶端自己感知的連接斷開,連接建立,SESSION失效事件Zookeeper服務(wù)器NOTIFY事件(path+事件類型)

a.NodeDataChanged&NodeCreated

回調(diào)dataWatchers.get(path)&existWatchers.get(path)得到的Watcher集合

同時會將path這一MAP映射從dataWatchers&existWatchers里面清除

b.NodeChildrenChanged

回調(diào)childWatchers.get(path得到的Watcher集合

同時會將path這一MAP映射從childWatchers.get里面清除

c.NodeDeleted回調(diào)dataWatchers.get(path)&childWatchers.get(path)得到的Watcher集合

同時會將path這一MAP映射從dataWatchers&childWatchers里面清除

同時會將path這一MAP映射從existWatchers里面清除

Zookeeper事件連接斷開事件-Disconnected主要是發(fā)生網(wǎng)絡(luò)IO錯誤,zookeeper客戶端會自動的重新建立連接,同時會通知WatcherSESSION失效事件-Expired這個事件表示服務(wù)器認為先前建立的連接已經(jīng)失效了,整個zookeeper對象已經(jīng)不會再運轉(zhuǎn)了,其創(chuàng)建的

瞬間節(jié)點也被清空了,先前注入的Watchers也隨著zookeeper對象不運轉(zhuǎn)而失效,此時需要重新創(chuàng)建一個新的zookeeper對象連接建立事件-SyncConnected實例化zookeeper

對象時和服務(wù)器建立連接成功后才會zookeeper客戶端會觸發(fā)這個事件Zookeeper事件實現(xiàn)Watcher時注意點:1.publicclassXXimplementsWatcher{publicvoidprocess(WatchedEventevent){//不要進入死循環(huán),因為調(diào)度事件回調(diào)是一個單線程,阻塞在這里后其//他的Watcher就執(zhí)行不了}}2.注入Watcher后,因為什么事件Watcher被觸發(fā),此Watcher會從zookeeper管理的watcher里移除,當對應(yīng)的path再發(fā)生什么事件就不會再觸發(fā)這個Watcher了,如果需要繼續(xù)監(jiān)聽則再注入Watcher一個簡單的應(yīng)用-分布式互斥鎖首先抽象出鎖的接口

publicabstractclassLockFactory{publicabstractLockgetLock(Stringname);}

publicinterfaceLock{

publicbooleantryLock();

?publicvoidunLock();

publicvoidregisterListener(CallBackcall,Objectcontext);}getLock(Stringpath)--根據(jù)path實例化一個Lock對象,如果path不存在則創(chuàng)建這個路徑,獲取鎖主要是在path下創(chuàng)建一個path/owner的瞬間節(jié)點,在節(jié)點上寫入自己的IP,這樣機器每次獲取鎖時就看path/owner是否存在,如果不存在則創(chuàng)建節(jié)點寫入IP,如果存在在看IP是不是自己的IP,釋放鎖則是如果IP是自己的IP則刪除這個瞬間節(jié)點?一個簡單的應(yīng)用-分布式互斥鎖tryLock()–嘗試獲取鎖資源

首先會判斷path/owner這個節(jié)點存在不,如果不存在則創(chuàng)建這個節(jié)點,并往這個節(jié)點寫入自己的IP,由于機器是并發(fā)執(zhí)行,可能有很多機器執(zhí)行這個創(chuàng)建操作,zookeeper保證更新操作的原子性,只有一個會操作成功,其他會拋出節(jié)點已經(jīng)存在異常。如果節(jié)點存在則看其其上的數(shù)據(jù)是不是自己IP來作為是不是自己拿到鎖資源的依據(jù)。unLock()–釋放鎖資源

如果節(jié)點存在,而且節(jié)點上的數(shù)據(jù)是自己的IP,則刪除這個節(jié)點registerListener(…)--監(jiān)聽鎖資源的使用狀況

1.執(zhí)行exists函數(shù),注入Watcher監(jiān)聽這個path,當這個節(jié)點被創(chuàng)建,被刪除,被更新都會回調(diào)這個Watcher

2.由于這個Watcher在被觸發(fā)后會被zookeeper的Watcher管理者移除,如果需要繼續(xù)監(jiān)聽則要再調(diào)用exists函數(shù)注入Watcher監(jiān)聽一些細節(jié)sequentialconsistencyforsingleclient對于一個客戶端來說zookeeper保證執(zhí)行順應(yīng)跟調(diào)用順序一致

在網(wǎng)絡(luò)IO層,會有一個鏈表保持所有需要處理的數(shù)據(jù)包,F(xiàn)IFO這樣客戶端的順序一致性就保證了同步調(diào)用和異步調(diào)用

exists(finalStringpath,Watcherwatcher)exists(finalStringpath,Watcherwatcher,StatCallbackcb,Objectctx)

前者是同步調(diào)用,后再是異步調(diào)用。同步調(diào)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論