Zookeeper深度解析(概念、原理機制、應(yīng)用場景)_第1頁
Zookeeper深度解析(概念、原理機制、應(yīng)用場景)_第2頁
Zookeeper深度解析(概念、原理機制、應(yīng)用場景)_第3頁
Zookeeper深度解析(概念、原理機制、應(yīng)用場景)_第4頁
Zookeeper深度解析(概念、原理機制、應(yīng)用場景)_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、Zookeeper深度解析(概念、原理機制、應(yīng)用場景)、什么是Zookeeper?Zookeeper是一個高效的分布式一致性協(xié)調(diào)服務(wù),可以提供配置信息管理、命名、分布式同步、集群管理、數(shù)據(jù)庫切換等服務(wù)。它不適合用來存儲大量信息,可以用來存儲一些配置、發(fā)布與訂閱等少量信息(Zookeeper作為Hadoop項目中的一個子項目,是Hadoop集群管理的一個必不可少的模塊,它主要用來控制集群中的數(shù)據(jù),如它管理Hadoop集群中的NameNode,還有Hbase中MasterElection、Server之間狀態(tài)同步等。)二、Zookeeper設(shè)計目的最終一致性:client不論連接到哪個Server

2、,展示給它都是同一個視圖,這是zookeeper最重要的性能??煽啃裕壕哂泻唵?、健壯、良好的性能,如果消息m被到一臺服務(wù)器接受,那么它將被所有的服務(wù)器接受。實時性:Zookeeper保證客戶端將在一個時間間隔范圍內(nèi)獲得服務(wù)器的更新信息,或者服務(wù)器失效的信息。但由于網(wǎng)絡(luò)延時等原因,Zookeeper不能保證兩個客戶端能同時得到剛更新的數(shù)據(jù),如果需要最新數(shù)據(jù),應(yīng)該在讀數(shù)據(jù)之前調(diào)用sync()接口。等待無關(guān)(wait-free):慢的或者失效的client不得干預(yù)快速的client的請求,使得每個client都能有效的等待。原子性:更新只能成功或者失敗,沒有中間狀態(tài)。6順序性:包括全局有序和偏序兩種

3、:全局有序是指如果在一臺服務(wù)器上消息a在消息b前發(fā)布,則在所有Server上消息a都將在消息b前被發(fā)布;偏序是指如果一個消息b在消息a后被同一個發(fā)送者發(fā)布,a必將排在b前面。三、Zookeeper的安裝前置環(huán)境:已安裝好jdk下載zookeeper的安裝包:,下載和解壓到/usr/locaI中創(chuàng)建數(shù)據(jù)、日志文件夾:mkdir/usr/local/zookeeper/datamkdir/usr/local/zookeeper/log設(shè)置核心配置文件:#打開核心配置mv/usr/local/zookeeper/conf/zoo_sample.cfg/usr/local/zookeeper/conf

4、/zoo.cfg#設(shè)置核心配置文件vim/usr/local/zookeeper/conf/zoo.cfg#填入如下配置dataDir=/usr/local/zookeeper/datadataLogDir=/usr/local/zookeeper/log啟動zookeepercd/usr/local/zookeeper/bin#啟動zookeeper./zkServer.shstart三、Zookeeper的文件系統(tǒng)文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)zookeeper是用一個樹形結(jié)構(gòu)來進行數(shù)據(jù)存儲管理的。它不適合用來存儲大量信息,可以用來存儲一些配置、發(fā)布與訂閱等少量信息。如下圖所示:文件系統(tǒng)的節(jié)點(zno

5、de)/Sut-Apfil什么是znode?每個子目錄項如NameService都被稱作為znode,和文件系統(tǒng)一樣,我們能夠自由的增加、刪除znode,在一個znode下增加、刪除子znode,每個znode都是可以存儲數(shù)據(jù)的。znode的分類persistent-持久化目錄節(jié)點:持久節(jié)點就是節(jié)點被創(chuàng)建后會一直存在服務(wù)器,直到刪除操作主動清除,這種節(jié)點也是最常見的類型。persistent_sequential-持久化順序編號目錄節(jié)點:持久順序節(jié)點就是有順序的持久節(jié)點,節(jié)點特性和持久節(jié)點是一樣的,只是額外特性表現(xiàn)在順序上。順序特性實質(zhì)是在創(chuàng)建節(jié)點的時候,會在節(jié)點名后面加上一個數(shù)字后綴,來表示

6、其順序。ephemeral-臨時目錄節(jié)點:臨時節(jié)點就是會被自動清理掉的節(jié)點,它的生命周期和客戶端會話綁在一起,客戶端會話結(jié)束,節(jié)點會被刪除掉。與持久性節(jié)點不同的是,臨時節(jié)點不能創(chuàng)建子節(jié)點。ephemeral_sequential-臨時順序編號目錄節(jié)點:臨時順序節(jié)點就是有順序的臨時節(jié)點,和持久順序節(jié)點相同,在其創(chuàng)建的時候會在名字后面加上數(shù)字后綴。文件系統(tǒng)的操作命令運行zkCli.sh-server進入命令行工具,注意連接信息應(yīng)該為zoo.cfg中配置的主機名或者ipIspath命令命令來查看當前znode下所包含的子節(jié)點create-s-epathdataacl命令創(chuàng)建節(jié)點命令,-s順序節(jié)點,-

7、e臨時性節(jié)點,path路徑,data數(shù)據(jù)內(nèi)容,acl權(quán)限例收如create-s-e/newnodelmydatagetpath命令獲取znode信息例如:get/appl整個ZNode節(jié)點內(nèi)容包括兩部分:節(jié)點數(shù)據(jù)內(nèi)容和節(jié)點狀態(tài)信息。cZxid就是CreateZXID,表示節(jié)點被創(chuàng)建時的事務(wù)ID。mZxid就是ModifiedZXID,表示節(jié)點最后一次被修改時的事務(wù)ID。ctime就是CreateTime,表示節(jié)點創(chuàng)建時間。mtime就是ModifiedTime,表示節(jié)點最后一次被修改的時間。pZxid表示該節(jié)點的子節(jié)點列表最后一次被修改時的事務(wù)ID。只有子節(jié)點列表變更才會更新pZxid,子節(jié)點

8、內(nèi)容變更不會更新。eversion表示子節(jié)點的版本號。dataVersion表示內(nèi)容版本號。dataLength表示數(shù)據(jù)長度。numChildren表示子節(jié)點數(shù)。ephemeralOwner表示創(chuàng)建該臨時節(jié)點時的會話sessionID,如果是持久性節(jié)點那么值為0。setpathdataversion命令修改節(jié)點數(shù)據(jù)path是路徑data是數(shù)據(jù)內(nèi)容version是版本號,我們可以通過set/applnewappl來更新節(jié)點/app1的內(nèi)容,也可以自己設(shè)置版本號例如:set/newnode1updatedatadeletepathversion命令刪除節(jié)點。Java程序調(diào)用zookeeper的AP

9、I操作節(jié)點springboot整合zookeeper博客()zookeeper簡便工具ZKclient的使用()引入依賴org.apache.zookeeperzookeeper3.4.10連接zookeeperStringhostPort=192.168.137.88:2181;StringrootPath=/;ZooKeeperzooKeeper=newZooKeeper(hostPort,1000,null);創(chuàng)建節(jié)點/創(chuàng)建一個目錄節(jié)點zookeeper.create(/mynode,world.getBytes(),Ids.OPEN_ACL_UNSAFE,CreateMode.PERS

10、ISTENT);獲取節(jié)點狀態(tài)信息Statfalg=zooKeeper.exists(/mynode,false);獲取節(jié)點數(shù)據(jù)內(nèi)容bytedata2=zooKeeper.getData(/mynode,false,null);修改節(jié)點數(shù)據(jù)zooKeeper.setData(/mynode,helloworld.getBytes(),-1);刪除節(jié)點zooKeeper.delete(/mynode,-1);關(guān)閉連接zooKeeper.close();四、zooeep的通知(Watch機制什么是zookeeper的通知機制?Znode發(fā)生變化(Znode本身的增加,刪除,修改,以及子Znode的變

11、化)可以通過Watch機制通知到客戶端。那么要實就必須實現(xiàn)org.apache.zookeeper.Watcher接口,并且將實現(xiàn)類的對象傳入到可以Watch的方法中。Zookeeper中所有讀:(getData(),getChildren(),exists。)都可以設(shè)置Watch選項。Watch事件具有one-timetrigger(次性觸發(fā))的特監(jiān)視的Znode有變化,那么就會通知設(shè)置該Watch的客戶端。watch類型數(shù)據(jù)watch(datawatches):getData和exists負責設(shè)置數(shù)據(jù)watch孩子watch(childwatches):getChildren負責設(shè)置孩子w

12、atch注意:exists操作上的watch,在被監(jiān)視的Znode創(chuàng)建、刪除或數(shù)據(jù)更新時被觸發(fā)。getData操作上的watch,在被監(jiān)視的Znode刪除或數(shù)據(jù)更新時被觸發(fā)。在被創(chuàng)建時不能被觸發(fā),因為只有Znode定存在,getData操作才會成功。getChildren操作上的watch,在被監(jiān)視的Znode的子節(jié)點創(chuàng)建或刪除,或是這個Znode自身被刪除時被觸發(fā)??梢酝ㄟ^查看watch事件類型來區(qū)分是Znode,還是他的子節(jié)點被刪除:NodeDelete表示Znode被刪除,NodeDeletedChanged表示子節(jié)點被刪除。JavaAPI設(shè)置Watch機制創(chuàng)建自定義Watch監(jiān)聽類/*

13、自定義watch*/publicclassMyWatchimplementsWatcherpublicvoidprocess(WatchedEventwatchedEvent)System.out.println(監(jiān)控的節(jié)點:+watchedEvent.getPath();System.out.println(監(jiān)控的類型:+watchedEvent.getType();設(shè)置Watch監(jiān)聽ZooKeeperzooKeeper=newZooKeeper(hostPort,1000,null);zooKeeper.getChildren(rootPath,newMyWatch();事件類型None:

14、在客戶端與Zookeeper集群中的服務(wù)器斷開連接的時候,客戶端會收到這個事件NodeCreated:Znode創(chuàng)建事件NodeDeleted:Znode刪除事件NodeDataChanged:Znode數(shù)據(jù)內(nèi)容更新事件。其實本質(zhì)上該事件只關(guān)注dataVersion版本號,但是只要調(diào)用了更新接口dataVersion就會有變更NodeChildrenChanged:Znode子節(jié)點改變事件,只關(guān)注子節(jié)點的個數(shù)變更,子節(jié)點內(nèi)容有變更是不會通知的五、zookeepe應(yīng)用場景1、配置文件管理什么是配置文件管理?程序通常會需要進行一些配置文件進行配置的管理。但是如果對于分布式項目來說,可能會部署在不同

15、的服務(wù)器上,這樣每臺服務(wù)都會有自己的一套配置,如果需要對某些配置進行調(diào)整,則需要逐一的對各個服務(wù)器進行修改zookeeper能夠?qū)崿F(xiàn)統(tǒng)一的配置文件管理。如何管理配置文件?將需要統(tǒng)一管理的配置全部放到zookeeper上去,保存在Zookeeper的某個目錄節(jié)點中,然后所有相關(guān)應(yīng)用程序?qū)@個目錄節(jié)點進行監(jiān)聽,一旦配置信息發(fā)生變化,每個應(yīng)用程序就會收到Zookeeper的通知,然后從Zookeeper獲取新的配置信息應(yīng)用到系統(tǒng)中就好(1)什么是集群管理?所謂集群管理無在乎兩點:是否有機器退出和加入、選舉master。(2)如何管理集群?對于第一點,所有機器約定在父目錄GroupMembers下創(chuàng)建

16、臨時目錄節(jié)點,然后監(jiān)聽父目錄節(jié)點的子節(jié)點變化消息。掛掉,該機器與zookeeper的連接斷開,其所創(chuàng)建的臨時目錄節(jié)點被刪除,所有其他機器都收到通知:某個兄弟目錄被刪除。新也是類似,所有機器收到通知:新兄弟目錄加入,highcount又有了。對于第二點,我們稍微改變一下,所有機器創(chuàng)建臨時順序編號目錄節(jié)點,每次選取編號最小的機器作為master就好。(1)分布式鎖的實現(xiàn)方式保持獨占我們將zookeeper上的一個znode看作是一把鎖,通過createznode的方式來實現(xiàn)。所有客戶端都去創(chuàng)建/distribute_lock節(jié)點,最終成功創(chuàng)建的那個客戶端也即擁有了這把鎖。用完刪除掉自己創(chuàng)建的dis

17、tribute_lock節(jié)點就釋放出鎖控制時序/distributeock已經(jīng)預(yù)先存在,所有客戶端在它下面創(chuàng)建臨時順序編號目錄節(jié)點,和選master樣,編號最小的獲得鎖,用完刪除,依次方便發(fā)現(xiàn)節(jié)點數(shù)據(jù)了,那么服務(wù)A就可以訪問服務(wù)B7o六、zookeeper群1、zookeeper的集群搭建偽集群模式什么是偽集群模式?所謂偽集群,是指在單臺機器中啟動多個zookeeper進程,并組成一個集群.步驟:將單機安裝的zookeeper文件夾復制2份在每份zookeeper文件夾中的data目錄下創(chuàng)建一個myid文件,并且寫入一個編號(每個zookeeper服務(wù)的編號必須不同,1、2、3)配置核心配置文

18、件依次啟動每個zookeeper服務(wù)*查看每個zookeeper服務(wù)的狀態(tài)集群模式集群模式的配置和偽集群基本一致由于集群模式下,各server部署在不同的機器上,因此各server的conf/zoo.cfg文件可以完全一樣.zookeeper集群的過半數(shù)存活原則什么是“過半數(shù)存活”原則?“半數(shù)存活”原則,即集群中存活的服務(wù)器數(shù)量必須為總服務(wù)器數(shù)量的一半以上。注意:由于zookeeper過半數(shù)存活機制,因此在集群搭建的時候,我們通常都是搭建奇數(shù)臺服務(wù)器。因為2N+1臺服務(wù)器和2N+2臺服務(wù)器的容災(zāi)能力都是一樣的,都是允許掛掉N臺服務(wù)器(3臺允許掛1臺,4臺也允許掛1臺,依次類推)。所以基于成本考

19、慮,2N+1臺的選擇方案更優(yōu)。zookeeper集群的角色簸號青(leader)“(Leader)十(Follower)*Follower肝擁熔P制舸鼾顓回勰,在選網(wǎng)輸(Observer)*Observer鶴蘇抵給leader節(jié)點.世Observer不繃投票遐貝肪leader曲O.Observer霸砸客戶端(Client)1zookeeper集群的核心ZAB協(xié)議ZooKeeper作為高可用的一致性協(xié)調(diào)框架,自然的ZooKeeper也有著一致性算法的實現(xiàn),ZooKeeper使用的是ZAB協(xié)議作為數(shù)據(jù)一致性的算法,ZAB(ZooKeeperAtomicBroadcast)全稱為:原子消息廣播協(xié)議Z

20、AB協(xié)議的基礎(chǔ)Leader選舉:在ZooKeeper中所有的事務(wù)請求都由一個主服務(wù)器也就是Leader來處理,其他服務(wù)器為Follower,Leader將客戶端的事務(wù)請求轉(zhuǎn)換為事務(wù)Proposal,并且將Proposal分發(fā)給集群中其他所有的Follower,然后Leader等待Follwer反饋,當有過半數(shù)(=N/2+1)的Follower反饋信息后,Leader將再次向集群內(nèi)Follower廣播Commit信息,Commit為將之前的Proposal提交ZAB協(xié)議的狀態(tài)每個ZAB協(xié)議中,每個節(jié)點都屬于以下三種中的一種Looking:系統(tǒng)剛啟動時或者Leader崩潰后正處于選舉狀態(tài)Following:Follower節(jié)點所處的狀態(tài),F(xiàn)ollower與Leader處于數(shù)據(jù)同步階段Lea

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論