Hadoop深入淺出之Zookeeper介紹_第1頁(yè)
Hadoop深入淺出之Zookeeper介紹_第2頁(yè)
Hadoop深入淺出之Zookeeper介紹_第3頁(yè)
Hadoop深入淺出之Zookeeper介紹_第4頁(yè)
Hadoop深入淺出之Zookeeper介紹_第5頁(yè)
已閱讀5頁(yè),還剩45頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、,技術(shù)創(chuàng)新,變革未來(lái),Hadoop深入淺出之 Zookeeper介紹,Agenda,概述 安裝 結(jié)構(gòu)與原理 應(yīng)用,什么是Zookeeper?,Zookeeper 是 Google 的 Chubby一個(gè)開(kāi)源的實(shí)現(xiàn),是 Hadoop 的分布式協(xié)調(diào)服務(wù) 它包含一個(gè)簡(jiǎn)單的原語(yǔ)集,分布式應(yīng)用程序可以基于它實(shí)現(xiàn)同步服務(wù),配置維護(hù)和命名服務(wù)等,什么是Zookeeper?,為什么使用Zookeeper?,大部分分布式應(yīng)用需要一個(gè)主控、協(xié)調(diào)器或控制器來(lái)管理物理分布的子進(jìn)程(如資源、任務(wù)分配等) 目前,大部分應(yīng)用需要開(kāi)發(fā)私有的協(xié)調(diào)程序,缺乏一個(gè)通用的機(jī)制 協(xié)調(diào)程序的反復(fù)編寫(xiě)浪費(fèi),且難以形成通用、伸縮性好的協(xié)調(diào)器

2、ZooKeeper:提供通用的分布式鎖服務(wù),用以協(xié)調(diào)分布式應(yīng)用,Zookeeper能幫我們做什么?,Hadoop,使用Zookeeper的事件處理確保整個(gè)集群只有一個(gè)NameNode,存儲(chǔ)配置信息等. HBase,使用Zookeeper的事件處理確保整個(gè)集群只有一個(gè)HMaster,察覺(jué)HRegionServer聯(lián)機(jī)和宕機(jī),存儲(chǔ)訪問(wèn)控制列表等.,Zookeeper的特性,Zookeeper是簡(jiǎn)單的 Zookeeper是富有表現(xiàn)力的 Zookeeper具有高可用性 Zookeeper采用松耦合交互方式 Zookeeper是一個(gè)資源庫(kù),Zookeeper的安裝和配置(單機(jī)模式),下載ZooKeepe

3、r: 解壓:tar xzf zookeeper-3.4.3.tar.gz 在conf目錄下創(chuàng)建一個(gè)配置文件zoo.cfg,tickTime=2000dataDir=/Users/zdandljb/zookeeper/datadataLogDir=/Users/zdandljb/zookeeper/dataLog clientPort=2181 啟動(dòng)ZooKeeper的Server:sh bin/zkServer.sh start, 如果想要關(guān)閉,輸入:zkServer.sh stop,Zookeeper的安裝和配置(集群模式),創(chuàng)建myid文件,server1機(jī)器的內(nèi)容為:1,server2機(jī)

4、器的內(nèi)容為:2,server3機(jī)器的內(nèi)容為:3 在conf目錄下創(chuàng)建一個(gè)配置文件zoo.cfg,tickTime=2000dataDir=/Users/zdandljb/zookeeper/datadataLogDir=/Users/zdandljb/zookeeper/dataLog clientPort=2181 initLimit=5 syncLimit=2 server.1=server1:2888:3888 server.2=server2:2888:3888 server.3=server3:2888:3888,Zookeeper的安裝和配置(偽集群模式),建了3個(gè)文件夾,serv

5、er1 server2 server3,然后每個(gè)文件夾里面解壓一個(gè)zookeeper的下載包 進(jìn)入data目錄,創(chuàng)建一個(gè)myid的文件,里面寫(xiě)入一個(gè)數(shù)字,server1,就寫(xiě)一個(gè)1,server2對(duì)應(yīng)myid文件就寫(xiě)入2,server3對(duì)應(yīng)myid文件就寫(xiě)個(gè)3,Zookeeper的安裝和配置(偽集群模式),在conf目錄下創(chuàng)建一個(gè)配置文件zoo.cfg,tickTime=2000dataDir=/Users/zdandljb/zookeeper/datadataLogDir=xxx/zookeeper/server1/ clientPort=2181 initLimit=5 syncLimit

6、=2 server.1=server1:2888:3888 server.2=server2:2888:3888 server.3=server3:2888:3888,Zookeeper的數(shù)據(jù)模型,層次化的目錄結(jié)構(gòu),命名符合常規(guī)文件系統(tǒng)規(guī)范 每個(gè)節(jié)點(diǎn)在zookeeper中叫做znode,并且其有一個(gè)唯一的路徑標(biāo)識(shí) 節(jié)點(diǎn)Znode可以包含數(shù)據(jù)和子節(jié)點(diǎn),但是EPHEMERAL類型的節(jié)點(diǎn)不能有子節(jié)點(diǎn) Znode中的數(shù)據(jù)可以有多個(gè)版本,比如某一個(gè)路徑下存有多個(gè)數(shù)據(jù)版本,那么查詢這個(gè)路徑下的數(shù)據(jù)就需要帶上版本 客戶端應(yīng)用可以在節(jié)點(diǎn)上設(shè)置監(jiān)視器 節(jié)點(diǎn)不支持部分讀寫(xiě),而是一次性完整讀寫(xiě),Zookeeper的

7、節(jié)點(diǎn),Znode有兩種類型,短暫的(ephemeral)和持久的(persistent) Znode的類型在創(chuàng)建時(shí)確定并且之后不能再修改 短暫znode的客戶端會(huì)話結(jié)束時(shí),zookeeper會(huì)將該短暫znode刪除,短暫znode不可以有子節(jié)點(diǎn) 持久znode不依賴于客戶端會(huì)話,只有當(dāng)客戶端明確要?jiǎng)h除該持久znode時(shí)才會(huì)被刪除 Znode有四種形式的目錄節(jié)點(diǎn),PERSISTENT、PERSISTENT_SEQUENTIAL、EPHEMERAL、EPHEMERAL_SEQUENTIAL,Zookeeper的角色,領(lǐng)導(dǎo)者(leader),負(fù)責(zé)進(jìn)行投票的發(fā)起和決議,更新系統(tǒng)狀態(tài) 學(xué)習(xí)者(learn

8、er),包括跟隨者(follower)和觀察者(observer),follower用于接受客戶端請(qǐng)求并想客戶端返回結(jié)果,在選主過(guò)程中參與投票 Observer可以接受客戶端連接,將寫(xiě)請(qǐng)求轉(zhuǎn)發(fā)給leader,但observer不參加投票過(guò)程,只同步leader的狀態(tài),observer的目的是為了擴(kuò)展系統(tǒng),提高讀取速度 客戶端(client),請(qǐng)求發(fā)起方,Zookeeper的角色,Zookeeper的順序號(hào),創(chuàng)建znode時(shí)設(shè)置順序標(biāo)識(shí),znode名稱后會(huì)附加一個(gè)值 順序號(hào)是一個(gè)單調(diào)遞增的計(jì)數(shù)器,由父節(jié)點(diǎn)維護(hù) 在分布式系統(tǒng)中,順序號(hào)可以被用于為所有的事件進(jìn)行全局排序,這樣客戶端可以通過(guò)順序號(hào)推斷

9、事件的順序,Zookeeper的讀寫(xiě)機(jī)制,Zookeeper是一個(gè)由多個(gè)server組成的集群 一個(gè)leader,多個(gè)follower 每個(gè)server保存一份數(shù)據(jù)副本 全局?jǐn)?shù)據(jù)一致 分布式讀寫(xiě) 更新請(qǐng)求轉(zhuǎn)發(fā),由leader實(shí)施,Zookeeper的保證,更新請(qǐng)求順序進(jìn)行,來(lái)自同一個(gè)client的更新請(qǐng)求按其發(fā)送順序依次執(zhí)行 數(shù)據(jù)更新原子性,一次數(shù)據(jù)更新要么成功,要么失敗 全局唯一數(shù)據(jù)視圖,client無(wú)論連接到哪個(gè)server,數(shù)據(jù)視圖都是一致的 實(shí)時(shí)性,在一定事件范圍內(nèi),client能讀到最新數(shù)據(jù),Zookeeper的API接口,String create(Stringpath, byte

10、data, Listacl, CreateModecreateMode) Stat exists(Stringpath, booleanwatch) void delete(Stringpath, intversion) List getChildren(Stringpath, booleanwatch) List getChildren(Stringpath, booleanwatch),Zookeeper的API接口,Stat setData(Stringpath, bytedata, intversion) byte getData(Stringpath, booleanwatch, S

11、tatstat) void addAuthInfo(Stringscheme, byteauth) Stat setACL(Stringpath, Listacl, intversion) List getACL(Stringpath, Statstat),觀察(watcher),Watcher 在 ZooKeeper 是一個(gè)核心功能,Watcher 可以監(jiān)控目錄節(jié)點(diǎn)的數(shù)據(jù)變化以及子目錄的變化,一旦這些狀態(tài)發(fā)生變化,服務(wù)器就會(huì)通知所有設(shè)置在這個(gè)目錄節(jié)點(diǎn)上的 Watcher,從而每個(gè)客戶端都很快知道它所關(guān)注的目錄節(jié)點(diǎn)的狀態(tài)發(fā)生變化,而做出相應(yīng)的反應(yīng) 可以設(shè)置觀察的操作:exists,getChi

12、ldren,getData 可以觸發(fā)觀察的操作:create,delete,setData,寫(xiě)操作與zookeeper內(nèi)部事件的對(duì)應(yīng)關(guān)系,zookeeper內(nèi)部事件與watcher的對(duì)應(yīng)關(guān)系,寫(xiě)操作與watcher的對(duì)應(yīng)關(guān)系,ACL,每個(gè)znode被創(chuàng)建時(shí)都會(huì)帶有一個(gè)ACL列表,用于決定誰(shuí)可以對(duì)它執(zhí)行何種操作,ACL,身份驗(yàn)證模式有三種: digest:用戶名,密碼 host:通過(guò)客戶端的主機(jī)名來(lái)識(shí)別客戶端 ip:通過(guò)客戶端的ip來(lái)識(shí)別客戶端 new ACL(Perms.READ,new Id(host,); 這個(gè)ACL對(duì)應(yīng)的身份驗(yàn)證模式是host,符合該模式的 身份是,權(quán)限的組合是:READ

13、,Znode的節(jié)點(diǎn)狀態(tài),Zookeeper工作原理,Zookeeper的核心是原子廣播,這個(gè)機(jī)制保證了各個(gè)server之間的同步。實(shí)現(xiàn)這個(gè)機(jī)制的協(xié)議叫做Zab協(xié)議。Zab協(xié)議有兩種模式,它們分別是恢復(fù)模式和廣播模式。當(dāng)服務(wù)啟動(dòng)或者在領(lǐng)導(dǎo)者崩潰后,Zab就進(jìn)入了恢復(fù)模式,當(dāng)領(lǐng)導(dǎo)者被選舉出來(lái),且大多數(shù)server的完成了和leader的狀態(tài)同步以后,恢復(fù)模式就結(jié)束了。狀態(tài)同步保證了leader和server具有相同的系統(tǒng)狀態(tài)。,Zookeeper工作原理,一旦leader已經(jīng)和多數(shù)的follower進(jìn)行了狀態(tài)同步后,他就可以開(kāi)始廣播消息了,即進(jìn)入廣播狀態(tài)。這時(shí)候當(dāng)一個(gè)server加入zookeep

14、er服務(wù)中,它會(huì)在恢復(fù)模式下啟動(dòng),發(fā)現(xiàn)leader,并和leader進(jìn)行狀態(tài)同步。待到同步結(jié)束,它也參與消息廣播。Zookeeper服務(wù)一直維持在Broadcast狀態(tài),直到leader崩潰了或者leader失去了大部分的followers支持。,Zookeeper工作原理,廣播模式需要保證proposal被按順序處理,因此zk采用了遞增的事務(wù)id號(hào)(zxid)來(lái)保證。所有的提議(proposal)都在被提出的時(shí)候加上了zxid。實(shí)現(xiàn)中zxid是一個(gè)64為的數(shù)字,它高32位是epoch用來(lái)標(biāo)識(shí)leader關(guān)系是否改變,每次一個(gè)leader被選出來(lái),它都會(huì)有一個(gè)新的epoch。低32位是個(gè)遞增計(jì)

15、數(shù)。 當(dāng)leader崩潰或者leader失去大多數(shù)的follower,這時(shí)候zk進(jìn)入恢復(fù)模式,恢復(fù)模式需要重新選舉出一個(gè)新的leader,讓所有的server都恢復(fù)到一個(gè)正確的狀態(tài)。,Leader選舉,每個(gè)Server啟動(dòng)以后都詢問(wèn)其它的Server它要投票給誰(shuí)。 對(duì)于其他server的詢問(wèn),server每次根據(jù)自己的狀態(tài)都回復(fù)自己推薦的leader的id和上一次處理事務(wù)的zxid(系統(tǒng)啟動(dòng)時(shí)每個(gè)server都會(huì)推薦自己) 收到所有Server回復(fù)以后,就計(jì)算出zxid最大的哪個(gè)Server,并將這個(gè)Server相關(guān)信息設(shè)置成下一次要投票的Server。 計(jì)算這過(guò)程中獲得票數(shù)最多的的sever

16、為獲勝者,如果獲勝者的票數(shù)超過(guò)半數(shù),則改server被選為leader。否則,繼續(xù)這個(gè)過(guò)程,直到leader被選舉出來(lái)。,Leader選舉,leader就會(huì)開(kāi)始等待server連接 Follower連接leader,將最大的zxid發(fā)送給leader Leader根據(jù)follower的zxid確定同步點(diǎn) 完成同步后通知follower 已經(jīng)成為uptodate狀態(tài) Follower收到uptodate消息后,又可以重新接受client的請(qǐng)求進(jìn)行服務(wù)了,Leader選舉,Leader選舉,Zookeeper示例代碼,Zookeeper示例代碼,Zookeeper示例代碼,輸出的結(jié)果如下: 已經(jīng)觸

17、發(fā)了 None 事件! testRootDatatestChildPathOne 目錄節(jié)點(diǎn)狀態(tài):5,5,1281804532336,1281804532336,0,1,0,0,12,1,6 已經(jīng)觸發(fā)了 NodeChildrenChanged 事件! testChildDataTwo 已經(jīng)觸發(fā)了 NodeDeleted 事件! 已經(jīng)觸發(fā)了 NodeDeleted 事件!,應(yīng)用場(chǎng)景1統(tǒng)一命名服務(wù),分布式應(yīng)用中,通常需要有一套完整的命名規(guī)則,既能夠產(chǎn)生唯一的名稱又便于人識(shí)別和記住,通常情況下用樹(shù)形的名稱結(jié)構(gòu)是一個(gè)理想的選擇,樹(shù)形的名稱結(jié)構(gòu)是一個(gè)有層次的目錄結(jié)構(gòu),既對(duì)人友好又不會(huì)重復(fù)。 Name Se

18、rvice 是 Zookeeper 內(nèi)置的功能,只要調(diào)用 Zookeeper 的 API 就能實(shí)現(xiàn),應(yīng)用場(chǎng)景2配置管理,配置的管理在分布式應(yīng)用環(huán)境中很常見(jiàn),例如同一個(gè)應(yīng)用系統(tǒng)需要多臺(tái) PC Server 運(yùn)行,但是它們運(yùn)行的應(yīng)用系統(tǒng)的某些配置項(xiàng)是相同的,如果要修改這些相同的配置項(xiàng),那么就必須同時(shí)修改每臺(tái)運(yùn)行這個(gè)應(yīng)用系統(tǒng)的 PC Server,這樣非常麻煩而且容易出錯(cuò)。 將配置信息保存在 Zookeeper 的某個(gè)目錄節(jié)點(diǎn)中,然后將所有需要修改的應(yīng)用機(jī)器監(jiān)控配置信息的狀態(tài),一旦配置信息發(fā)生變化,每臺(tái)應(yīng)用機(jī)器就會(huì)收到 Zookeeper 的通知,然后從 Zookeeper 獲取新的配置信息應(yīng)用到系

19、統(tǒng)中。,應(yīng)用場(chǎng)景2配置管理,應(yīng)用場(chǎng)景3集群管理,Zookeeper 能夠很容易的實(shí)現(xiàn)集群管理的功能,如有多臺(tái) Server 組成一個(gè)服務(wù)集群,那么必須要一個(gè)“總管”知道當(dāng)前集群中每臺(tái)機(jī)器的服務(wù)狀態(tài),一旦有機(jī)器不能提供服務(wù),集群中其它集群必須知道,從而做出調(diào)整重新分配服務(wù)策略。同樣當(dāng)增加集群的服務(wù)能力時(shí),就會(huì)增加一臺(tái)或多臺(tái) Server,同樣也必須讓“總管”知道。 Zookeeper 不僅能夠維護(hù)當(dāng)前的集群中機(jī)器的服務(wù)狀態(tài),而且能夠選出一個(gè)“總管”,讓這個(gè)總管來(lái)管理集群,這就是 Zookeeper 的另一個(gè)功能 Leader Election。,應(yīng)用場(chǎng)景3集群管理,應(yīng)用場(chǎng)景3集群管理,zk.cr

20、eate(/testRootPath/testChildPath1,1.getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL); zk.create(“/testRootPath/testChildPath2”,“2”.getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL); zk.create(/testRootPath/testChildPath3,3.getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPH

21、EMERAL_SEQUENTIAL);,應(yīng)用場(chǎng)景3集群管理,zk.create(/testRootPath/testChildPath4,4.getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL); System.out.println(zk.getChildren(/testRootPath, false); 打印結(jié)果:testChildPath10000000000, testChildPath20000000001, testChildPath40000000003, testChildPath3000000000

22、2,應(yīng)用場(chǎng)景3集群管理,規(guī)定編號(hào)最小的為master,所以當(dāng)我們對(duì)SERVERS節(jié)點(diǎn)做監(jiān)控的時(shí)候,得到服務(wù)器列表,只要所有集群機(jī)器邏輯認(rèn)為最小編號(hào)節(jié)點(diǎn)為master,那么master就被選出,而這個(gè)master宕機(jī)的時(shí)候,相應(yīng)的znode會(huì)消失,然后新的服務(wù)器列表就被推送到客戶端,然后每個(gè)節(jié)點(diǎn)邏輯認(rèn)為最小編號(hào)節(jié)點(diǎn)為master,這樣就做到動(dòng)態(tài)master選舉。,應(yīng)用場(chǎng)景4共享鎖,共享鎖在同一個(gè)進(jìn)程中很容易實(shí)現(xiàn),但是在跨進(jìn)程或者在不同 Server 之間就不好實(shí)現(xiàn)了。Zookeeper 卻很容易實(shí)現(xiàn)這個(gè)功能,實(shí)現(xiàn)方式也是需要獲得鎖的 Server 創(chuàng)建一個(gè) EPHEMERAL_SEQUENTIAL 目錄節(jié)點(diǎn),然后調(diào)用 getChildren方法獲取當(dāng)前的目錄節(jié)點(diǎn)列表中最小的目錄節(jié)點(diǎn)是不是就是自己創(chuàng)建的目錄節(jié)點(diǎn),

溫馨提示

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

評(píng)論

0/150

提交評(píng)論