Hadoop大數(shù)據(jù)處理技術(shù)基礎(chǔ)與實(shí)踐(微課版)(第3版) 課件 第7、8章 海量數(shù)據(jù)庫(kù)HBase技術(shù)、ZKeeper 技術(shù)_第1頁(yè)
Hadoop大數(shù)據(jù)處理技術(shù)基礎(chǔ)與實(shí)踐(微課版)(第3版) 課件 第7、8章 海量數(shù)據(jù)庫(kù)HBase技術(shù)、ZKeeper 技術(shù)_第2頁(yè)
Hadoop大數(shù)據(jù)處理技術(shù)基礎(chǔ)與實(shí)踐(微課版)(第3版) 課件 第7、8章 海量數(shù)據(jù)庫(kù)HBase技術(shù)、ZKeeper 技術(shù)_第3頁(yè)
Hadoop大數(shù)據(jù)處理技術(shù)基礎(chǔ)與實(shí)踐(微課版)(第3版) 課件 第7、8章 海量數(shù)據(jù)庫(kù)HBase技術(shù)、ZKeeper 技術(shù)_第4頁(yè)
Hadoop大數(shù)據(jù)處理技術(shù)基礎(chǔ)與實(shí)踐(微課版)(第3版) 課件 第7、8章 海量數(shù)據(jù)庫(kù)HBase技術(shù)、ZKeeper 技術(shù)_第5頁(yè)
已閱讀5頁(yè),還剩82頁(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)介

第七章海量數(shù)據(jù)庫(kù)HBase技術(shù)7.1初識(shí)HBase7.1初識(shí)HBaseHbase是一個(gè)類似Bigtable的分布式結(jié)構(gòu)化數(shù)據(jù)庫(kù)系統(tǒng),Bigtable是GoogleStyle的數(shù)據(jù)庫(kù),使用結(jié)構(gòu)化的文件來(lái)存儲(chǔ)數(shù)據(jù)。7.1初識(shí)HBase定義:BT是一個(gè)稀疏的,長(zhǎng)期存儲(chǔ)的,多維度的,排序的映射表。索引:行關(guān)鍵字,列關(guān)鍵字和時(shí)間戳.值:一個(gè)不解釋的字符數(shù)組.?dāng)?shù)據(jù)都是字符串,沒(méi)類型,格式由客戶來(lái)解釋(row:string,column:string,time:int64)->string7.2HBase表視圖7.2HBase表視圖HBase表視圖分為概念視圖和物理視圖,在概念視圖上是由稀疏的行組成的集合,很多行都沒(méi)有完整的列族,但是在物理存儲(chǔ)中是以列族為單元進(jìn)行存儲(chǔ)的,一行數(shù)據(jù)被分散在多個(gè)物理存儲(chǔ)單元中,空單元全部丟棄。7.2HBase表視圖行名是一個(gè)反向URL{即n.www}。contents列族存放網(wǎng)頁(yè)內(nèi)容anchor列族存放引用該網(wǎng)頁(yè)的錨鏈接文本。CNN的主頁(yè)被SportsIllustrater和MY-look的主頁(yè)引用,因此該行包含了名叫“anchor:”和“anchhor:my.look.ca”的列。列名字的格式是"<family>:<label>"時(shí)間戳每個(gè)錨鏈接只有一個(gè)版本,由時(shí)間戳標(biāo)識(shí),如t9,t8;而contents列則有三個(gè)版本,分別由時(shí)間戳t3,t5,和t6標(biāo)識(shí)。一個(gè)存儲(chǔ)Web網(wǎng)頁(yè)的例子的表的片斷7.2HBase表視圖概念視圖7.2HBase表視圖行行關(guān)鍵字可以是任意字符串,每一行都有一個(gè)可排序的主鍵和任意多的列。表用行鍵即主鍵排序,通過(guò)主鍵訪問(wèn)表。在一個(gè)行關(guān)鍵字下的每一個(gè)讀寫操作都是原子操作有利于同行并發(fā)操作舉例,在Webtable里,通過(guò)反轉(zhuǎn)URL中主機(jī)名的方式,可以把同一個(gè)域名下的網(wǎng)頁(yè)組織成連續(xù)行。7.2HBase表視圖列族每行列分組形成列族:“<family>:<qualifiers>”每張表有一個(gè)family集合,固定不變,相當(dāng)于表結(jié)構(gòu)列族成員有相同前綴。OK:a與OK:b都屬于OK列族成員同一列族下存放的所有數(shù)據(jù)通常都是同一類型列族必須先創(chuàng)建,然后能在其中的列關(guān)鍵字下存放數(shù)據(jù),動(dòng)態(tài)增加列限定詞任意字符串。比如,Webtable列族是anchor;給列族的每一個(gè)列關(guān)鍵字代表一個(gè)錨鏈接物理存儲(chǔ)列族成員在文件系統(tǒng)存在一起,(確切)面向列族。這是訪問(wèn)控制的基本單位。7.2HBase表視圖時(shí)間戳表中每一個(gè)表項(xiàng)都可以包含同一數(shù)據(jù)的多個(gè)版本不同版本的表項(xiàng)內(nèi)容按時(shí)間戳倒序排列,即最新的排在前面。自動(dòng)進(jìn)行垃圾清除。用戶可以指明只保留表項(xiàng)的最后n個(gè)版本在Webtable中,在contents:列中存放確切爬行一個(gè)網(wǎng)頁(yè)的時(shí)間戳。如上的垃圾清除機(jī)制可以讓我們只保留每個(gè)網(wǎng)頁(yè)的最近三個(gè)版本。7.2HBase表視圖物理視圖在物理存儲(chǔ)上面,它是按照列來(lái)保存的,在概念視圖上面有些列是空白的,這樣的列實(shí)際上并不會(huì)被存儲(chǔ)如果在查詢的時(shí)候不提供時(shí)間戳,返回最新版本7.2HBase表視圖表橫向分不同區(qū)域,各區(qū)域代表所有行一個(gè)子集區(qū)域確定:第一行(包含)最后行(不含)+隨機(jī)標(biāo)識(shí)表初始單個(gè)區(qū)域->逐漸擴(kuò)大超過(guò)閾值->以行為界分割區(qū)域分散在HBase集群上單元Bigtable通過(guò)行關(guān)鍵字的字典序來(lái)維護(hù)數(shù)據(jù)。動(dòng)態(tài)劃分成多個(gè)連續(xù)行叫做“子表”(tablet)是數(shù)據(jù)分布和負(fù)載均衡的單位。這樣一來(lái),讀較少的連續(xù)行就比較有效率7.2HBase表視圖7.2HBase表視圖在記錄寫入Store的MemStore之前,必須先由RegionServer寫入到WAL(HLog)中7.2HBase表視圖HLog文件存儲(chǔ)結(jié)構(gòu)7.2HBase表視圖HFile文件存儲(chǔ)結(jié)構(gòu)KeyValue內(nèi)部結(jié)構(gòu)7.3HBase物理存儲(chǔ)模型7.3HBase物理存儲(chǔ)模型7.3HBase物理存儲(chǔ)模型架構(gòu)與實(shí)現(xiàn)Hbase由主節(jié)點(diǎn)master多個(gè)區(qū)域服務(wù)器regionserver從結(jié)點(diǎn)Master分配區(qū)域給已注冊(cè)的區(qū)域服務(wù)器Regionserver負(fù)責(zé)0到多個(gè)區(qū)域,響應(yīng)客戶端讀寫請(qǐng)求通知master分裂成子區(qū)域信息7.3HBase物理存儲(chǔ)模型1.Client客戶端(Client)用于提交管理或讀寫請(qǐng)求,采用RPC與HMaster和HRegionServer進(jìn)行通信。2.ZooKeeperZooKeeper為HBase提供協(xié)同管理服務(wù),當(dāng)HRegionServer上線時(shí)會(huì)把自己注冊(cè)到ZooKeeper中,以使ZooKeeper能實(shí)時(shí)監(jiān)控HRegionServer的健康狀態(tài),當(dāng)發(fā)現(xiàn)某一個(gè)HRegionServer死掉時(shí),能及時(shí)通知HMaster進(jìn)行相應(yīng)處理。3.HMasterHMaster是主服務(wù)(HBaseMasterServer)的實(shí)例,在Hadoop集群中,一般設(shè)置運(yùn)行于NameNode,它負(fù)責(zé)監(jiān)控集群中所有的HRegionServer,并對(duì)所有表和Region進(jìn)行管理操作。7.3HBase物理存儲(chǔ)模型4.HRegionServerHRegionServer是RegionServer的實(shí)例,它負(fù)責(zé)服務(wù)和管理多個(gè)HRegion實(shí)例,并直接響應(yīng)用戶的讀寫請(qǐng)求,HRegionServer運(yùn)行于Hadoop集群的數(shù)據(jù)節(jié)點(diǎn)中,一般來(lái)說(shuō),一個(gè)數(shù)據(jù)節(jié)點(diǎn)運(yùn)行一個(gè)HRegionServer。HRegionServer是HBase的最核心模塊,有很多后臺(tái)線程,很多相關(guān)操作都需要相應(yīng)線程進(jìn)行處理,如監(jiān)控各Region的大小并進(jìn)行切片,對(duì)StoreFile進(jìn)行壓縮合并操作,監(jiān)控MemStore并進(jìn)行Flush操作,把所有修改寫入WAL等。5.HRegionHRegion是對(duì)表進(jìn)行劃分的基本單元,一個(gè)表在剛創(chuàng)建時(shí)只有一個(gè)Region,但隨著記錄的增加,表會(huì)越來(lái)越大,HRegionServer會(huì)實(shí)時(shí)跟蹤Region的大小,當(dāng)Region增大到某個(gè)閾值(由hbase.hregion.max.filesize確定)時(shí),就會(huì)進(jìn)行切片操作,由一個(gè)Region分裂成兩個(gè)Region,隨著表的繼續(xù)增大,還會(huì)分裂成更多的Region。7.3HBase物理存儲(chǔ)模型6.HRegionServerHRegionServer是RegionServer的實(shí)例,它負(fù)責(zé)服務(wù)和管理多個(gè)HRegion實(shí)例,并直接響應(yīng)用戶的讀寫請(qǐng)求,HRegionServer運(yùn)行于Hadoop集群的數(shù)據(jù)節(jié)點(diǎn)中,一般來(lái)說(shuō),一個(gè)數(shù)據(jù)節(jié)點(diǎn)運(yùn)行一個(gè)HRegionServer。HRegionServer是HBase的最核心模塊,有很多后臺(tái)線程,很多相關(guān)操作都需要相應(yīng)線程進(jìn)行處理,如監(jiān)控各Region的大小并進(jìn)行切片,對(duì)StoreFile進(jìn)行壓縮合并操作,監(jiān)控MemStore并進(jìn)行Flush操作,把所有修改寫入WAL等。5.HRegionHRegion是對(duì)表進(jìn)行劃分的基本單元,一個(gè)表在剛創(chuàng)建時(shí)只有一個(gè)Region,但隨著記錄的增加,表會(huì)越來(lái)越大,HRegionServer會(huì)實(shí)時(shí)跟蹤Region的大小,當(dāng)Region增大到某個(gè)閾值(由hbase.hregion.max.filesize確定)時(shí),就會(huì)進(jìn)行切片操作,由一個(gè)Region分裂成兩個(gè)Region,隨著表的繼續(xù)增大,還會(huì)分裂成更多的Region。7.4HBase相關(guān)操作7.4HBase相關(guān)操作BT的API提供了建立和刪除表和列族的函數(shù).還提供了函數(shù)來(lái)修改集群,表和列族的元數(shù)據(jù),比如說(shuō)訪問(wèn)權(quán)限。7.4HBase相關(guān)操作Hbase

API:寫入Bigtable./OpenthetableTable*T=OpenOrDie(”/bigtable/web/webtable”);//WriteanewanchoranddeleteanoldanchorRowMutationr1(T,“n.www”);r1.Set(”anchor:”,“CNN”);r1.Delete(”anchor:”);Operationop;Apply(&op,&r1);7.4HBase相關(guān)操作在BT中,客戶應(yīng)用可以寫或者刪除值,從每個(gè)行中找值,或者遍歷一個(gè)表中的數(shù)據(jù)子集。調(diào)用Apply函數(shù),就對(duì)Webtable進(jìn)行了一個(gè)原子修改:它為/增加了一個(gè)錨點(diǎn),并刪除了另外一個(gè)錨點(diǎn)。7.4HBase相關(guān)操作Hbase

API:讀Bigtable.Scannerscanner(T);ScanStream*stream;stream=scanner.FetchColumnFamily(”anchor”);stream->SetReturnAllVersions();scanner.Lookup(”n.www”);for(;!stream->Done();stream->Next()){printf(”%s%s%lld%s\n”,scanner.RowName(),stream->ColumnName(),stream->MicroTimestamp(),stream->Value());7.4HBase相關(guān)操作C++代碼是使用Scanner抽象來(lái)遍歷一個(gè)行內(nèi)的所有錨點(diǎn)??蛻艨梢员闅v多個(gè)列族。有很多方法可以限制一次掃描中產(chǎn)生的行,列和時(shí)間戳。例如,我們可以限制上面的掃描,讓它只找到那些匹配正則表達(dá)式*.的錨點(diǎn),或者那些時(shí)間戳在當(dāng)前時(shí)間前10天的錨點(diǎn)。7.5Hbase應(yīng)用案例7.5Hbase應(yīng)用案例以敦煌莫高窟為例,敦煌莫高窟是我國(guó)重要的文化遺產(chǎn),保存了大量珍貴的佛教藝術(shù)和文化遺產(chǎn)。通過(guò)將莫高窟的相關(guān)數(shù)據(jù),如石窟編號(hào)、題材、制作年代、藝術(shù)風(fēng)格、藏經(jīng)內(nèi)容等信息,存儲(chǔ)在HBase表中,并通過(guò)HBase提供的高級(jí)操作和API,如過(guò)濾、排序、聚合等功能,實(shí)現(xiàn)對(duì)莫高窟文化遺產(chǎn)的全面管理和分析,為文化遺產(chǎn)的保護(hù)和傳承做出貢獻(xiàn),體現(xiàn)了中國(guó)傳統(tǒng)文化中的“珍愛(ài)文物、傳承文明”的精神,也體現(xiàn)現(xiàn)代社會(huì)對(duì)于文化遺產(chǎn)保護(hù)和傳承的重視和需求。本章完第八章ZooKeeper技術(shù)8.1分布式協(xié)調(diào)技術(shù)及其實(shí)現(xiàn)者8.1分布式協(xié)調(diào)技術(shù)及其實(shí)現(xiàn)者分布式協(xié)調(diào)技術(shù)

分布式協(xié)調(diào)技術(shù)主要用來(lái)解決分布式環(huán)境中多個(gè)進(jìn)程之間的同步控制,讓它們有序地去訪問(wèn)某種臨界資源,防止產(chǎn)生“臟數(shù)據(jù)”。單機(jī)環(huán)境下可以利用簡(jiǎn)單的讀寫鎖機(jī)制來(lái)實(shí)現(xiàn),問(wèn)題放到分布式環(huán)境下就需要分布式鎖,這個(gè)分布式鎖也就是分布式協(xié)調(diào)技術(shù)實(shí)現(xiàn)的核心內(nèi)容。在分布式計(jì)算上,不同的計(jì)算機(jī)透過(guò)信息交換,嘗試達(dá)成共識(shí);但有時(shí)候,系統(tǒng)上協(xié)調(diào)計(jì)算機(jī)或成員計(jì)算機(jī)可能因系統(tǒng)錯(cuò)誤并交換錯(cuò)的信息,導(dǎo)致影響最終的系統(tǒng)一致性。])。如在單機(jī)環(huán)境中,進(jìn)程對(duì)一個(gè)資源的獲取要么成功,要么失敗。但在分布式環(huán)境中,對(duì)一個(gè)資源的訪問(wèn)或者一個(gè)服務(wù)的調(diào)用,即使返回失敗消息,但有可能實(shí)際上訪問(wèn)成功或者調(diào)用成功了,也有可能是時(shí)間上不同的兩個(gè)節(jié)點(diǎn)對(duì)另外一個(gè)節(jié)點(diǎn)順序調(diào)用服務(wù),那么調(diào)用請(qǐng)求一定是按照順序到達(dá)的嗎?這些都涉及網(wǎng)絡(luò)問(wèn)題,所以分布式協(xié)調(diào)遠(yuǎn)比在同一臺(tái)機(jī)器上對(duì)多個(gè)進(jìn)程的調(diào)度要難得多,于是一種通用性好、伸縮性好、高可靠、高可用的協(xié)調(diào)機(jī)制應(yīng)運(yùn)而生——ZooKeeper。8.1分布式協(xié)調(diào)技術(shù)及其實(shí)現(xiàn)者概述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ù)等8.1分布式協(xié)調(diào)技術(shù)及其實(shí)現(xiàn)者什么是Zookeeper?8.1分布式協(xié)調(diào)技術(shù)及其實(shí)現(xiàn)者Zookeeper能幫我們做什么?Hadoop,使用Zookeeper的事件處理確保整個(gè)集群只有一個(gè)NameNode,存儲(chǔ)配置信息等.HBase,使用Zookeeper的事件處理確保整個(gè)集群只有一個(gè)HMaster,察覺(jué)HRegionServer聯(lián)機(jī)和宕機(jī),存儲(chǔ)訪問(wèn)控制列表等.8.1分布式協(xié)調(diào)技術(shù)及其實(shí)現(xiàn)者Zookeeper是簡(jiǎn)單的Zookeeper是富有表現(xiàn)力的Zookeeper具有高可用性Zookeeper采用松耦合交互方式Zookeeper是一個(gè)資源庫(kù)Zookeeper的特性8.2Zookeeper的安裝和配置8.2Zookeeper的安裝和配置下載ZooKeeper:/apache-mirror/zookeeper/zookeeper-3.4.3/zookeeper-3.4.3.tar.gz解壓:tarxzfzookeeper-3.4.3.tar.gz在conf目錄下創(chuàng)建一個(gè)配置文件zoo.cfg,tickTime=2000

dataDir=/Users/zdandljb/zookeeper/data

dataLogDir=/Users/zdandljb/zookeeper/dataLog

clientPort=2181啟動(dòng)ZooKeeper的Server:shbin/zkServer.shstart,如果想要關(guān)閉,輸入:zkServer.shstop8.2Zookeeper的安裝和配置創(chuàng)建myid文件,server1機(jī)器的內(nèi)容為:1,server2機(jī)器的內(nèi)容為:2,server3機(jī)器的內(nèi)容為:3在conf目錄下創(chuàng)建一個(gè)配置文件zoo.cfg,tickTime=2000

dataDir=/Users/zdandljb/zookeeper/data

dataLogDir=/Users/zdandljb/zookeeper/dataLogclientPort=2181 initLimit=5 syncLimit=2 server.1=server1:2888:3888 server.2=server2:2888:3888server.3=server3:2888:38888.2Zookeeper的安裝和配置建了3個(gè)文件夾,server1server2server3,然后每個(gè)文件夾里面解壓一個(gè)zookeeper的下載包進(jìn)入data目錄,創(chuàng)建一個(gè)myid的文件,里面寫入一個(gè)數(shù)字,server1,就寫一個(gè)1,server2對(duì)應(yīng)myid文件就寫入2,server3對(duì)應(yīng)myid文件就寫個(gè)38.2Zookeeper的安裝和配置在conf目錄下創(chuàng)建一個(gè)配置文件zoo.cfg,tickTime=2000

dataDir=/Users/zdandljb/zookeeper/data

dataLogDir=xxx/zookeeper/server1/clientPort=2181 initLimit=5 syncLimit=2 server.1=server1:2888:3888 server.2=server2:2888:3888 server.3=server3:2888:38888.3Zookeeper的數(shù)據(jù)模型8.3Zookeeper的數(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)不支持部分讀寫,而是一次性完整讀寫8.3Zookeeper的數(shù)據(jù)模型Zookeeper的節(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_SEQUENTIAL8.3Zookeeper的數(shù)據(jù)模型Zookeeper的角色領(lǐng)導(dǎo)者(leader),負(fù)責(zé)進(jìn)行投票的發(fā)起和決議,更新系統(tǒng)狀態(tài)學(xué)習(xí)者(learner),包括跟隨者(follower)和觀察者(observer),follower用于接受客戶端請(qǐng)求并想客戶端返回結(jié)果,在選主過(guò)程中參與投票O(jiān)bserver可以接受客戶端連接,將寫請(qǐng)求轉(zhuǎn)發(fā)給leader,但observer不參加投票過(guò)程,只同步leader的狀態(tài),observer的目的是為了擴(kuò)展系統(tǒng),提高讀取速度客戶端(client),請(qǐng)求發(fā)起方8.3Zookeeper的數(shù)據(jù)模型Zookeeper的角色8.3Zookeeper的數(shù)據(jù)模型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)推斷事件的順序8.3Zookeeper的數(shù)據(jù)模型Zookeeper的讀寫機(jī)制Zookeeper是一個(gè)由多個(gè)server組成的集群一個(gè)leader,多個(gè)follower每個(gè)server保存一份數(shù)據(jù)副本全局?jǐn)?shù)據(jù)一致分布式讀寫更新請(qǐng)求轉(zhuǎn)發(fā),由leader實(shí)施8.3Zookeeper的數(shù)據(jù)模型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ù)8.3Zookeeper的數(shù)據(jù)模型Zookeeper的API接口String

create(String

path,byte[]

data,List<ACL>

acl,CreateMode

createMode)Stat

exists(String

path,boolean

watch)voiddelete(String

path,int

version)List<String>getChildren(String

path,boolean

watch)List<String>getChildren(String

path,boolean

watch)8.3Zookeeper的數(shù)據(jù)模型Zookeeper的API接口Stat

setData(String

path,byte[]

data,int

version)byte[]getData(String

path,boolean

watch,Stat

stat)voidaddAuthInfo(String

scheme,byte[]

auth)Stat

setACL(String

path,List<ACL>

acl,int

version)List<ACL>getACL(String

path,Stat

stat)8.3Zookeeper的數(shù)據(jù)模型觀察(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,getChildren,getData可以觸發(fā)觀察的操作:create,delete,setData8.3Zookeeper的數(shù)據(jù)模型寫操作與zookeeper內(nèi)部事件的對(duì)應(yīng)關(guān)系8.3Zookeeper的數(shù)據(jù)模型zookeeper內(nèi)部事件與watcher的對(duì)應(yīng)關(guān)系8.3Zookeeper的數(shù)據(jù)模型寫操作與watcher的對(duì)應(yīng)關(guān)系8.3Zookeeper的數(shù)據(jù)模型ACL每個(gè)znode被創(chuàng)建時(shí)都會(huì)帶有一個(gè)ACL列表,用于決定誰(shuí)可以對(duì)它執(zhí)行何種操作8.3Zookeeper的數(shù)據(jù)模型ACL身份驗(yàn)證模式有三種:digest:用戶名,密碼host:通過(guò)客戶端的主機(jī)名來(lái)識(shí)別客戶端ip:

通過(guò)客戶端的ip來(lái)識(shí)別客戶端newACL(Perms.READ,newId("host",""));

這個(gè)ACL對(duì)應(yīng)的身份驗(yàn)證模式是host,符合該模式的

身份是,權(quán)限的組合是:READ8.3Zookeeper的數(shù)據(jù)模型Znode的節(jié)點(diǎn)狀態(tài)8.4Zookeeper工作原理8.4Zookeeper工作原理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)。8.4Zookeeper工作原理一旦leader已經(jīng)和多數(shù)的follower進(jìn)行了狀態(tài)同步后,他就可以開(kāi)始廣播消息了,即進(jìn)入廣播狀態(tài)。這時(shí)候當(dāng)一個(gè)server加入zookeeper服務(wù)中,它會(huì)在恢復(fù)模式下啟動(dòng),發(fā)現(xiàn)leader,并和leader進(jìn)行狀態(tài)同步。待到同步結(jié)束,它也參與消息廣播。Zookeeper服務(wù)一直維持在Broadcast狀態(tài),直到leader崩潰了或者leader失去了大部分的followers支持。8.4Zookeeper工作原理廣播模式需要保證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ì)數(shù)。當(dāng)leader崩潰或者leader失去大多數(shù)的follower,這時(shí)候zk進(jìn)入恢復(fù)模式,恢復(fù)模式需要重新選舉出一個(gè)新的leader,讓所有的server都恢復(fù)到一個(gè)正確的狀態(tài)。8.4Zookeeper工作原理每個(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為獲勝者,如果獲勝者的票數(shù)超過(guò)半數(shù),則改server被選為leader。否則,繼續(xù)這個(gè)過(guò)程,直到leader被選舉出來(lái)。Leader選舉8.4Zookeeper工作原理leader就會(huì)開(kāi)始等待server連接Follower連接leader,將最大的zxid發(fā)送給leaderLeader根據(jù)follower的zxid確定同步點(diǎn)完成同步后通知follower已經(jīng)成為uptodate狀態(tài)Follower收到uptodate消息后,又可以重新接受client的請(qǐng)求進(jìn)行服務(wù)了Leader選舉8.4Zookeeper工作原理Leader選舉8.4Zookeeper工作原理Leader選舉8.4Zookeeper工作原理Zookeeper示例代碼8.4Zookeeper工作原理Zookeeper示例代碼8.4Zookeeper工作原理輸出的結(jié)果如下:已經(jīng)觸發(fā)了None事件!testRootData [testChildPathOne]目錄節(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事件!Zookeeper示例代碼8.5典型應(yīng)用場(chǎng)景8.5典型應(yīng)用場(chǎng)景應(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ù)。NameService是Zookeeper內(nèi)置的功能,只要調(diào)用Zookeeper的API就能實(shí)現(xiàn)8.5典型應(yīng)用場(chǎng)景應(yīng)用場(chǎng)景2-配置管理配置的管理在分布式應(yīng)用環(huán)境中很常見(jiàn),例如同一個(gè)應(yīng)用系統(tǒng)需要多臺(tái)PCServer運(yùn)行,但是它們運(yùn)行的應(yīng)用系統(tǒng)的某些配置項(xiàng)是相同的,如果要修改這些相同的配置項(xiàng),那么就必須同時(shí)修改每臺(tái)運(yùn)行這個(gè)應(yīng)用系統(tǒng)的PCServer,這樣非常麻煩而且容易出錯(cuò)。將配置信息保存在Zookeeper的某個(gè)目錄節(jié)點(diǎn)中,然后將所有需要修改的應(yīng)用機(jī)器監(jiān)控配置信息的狀態(tài),一旦配置信息發(fā)生變化,每臺(tái)應(yīng)用機(jī)器就會(huì)收到Zookeeper的通知,然后從Zookeeper獲取新的配置信息應(yīng)用到系統(tǒng)中。8.5典型應(yīng)用場(chǎng)景應(yīng)用場(chǎng)景2-配置管理8.5典型應(yīng)用場(chǎng)景應(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è)功能LeaderElection。8.5典型應(yīng)用場(chǎng)景應(yīng)用場(chǎng)景3-集群管理8.5典型應(yīng)用場(chǎng)景應(yīng)用場(chǎng)景3-集群管理zk.create("/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.EPHEMERAL_SEQUENTIAL);8.5典型應(yīng)用場(chǎng)景應(yīng)用場(chǎng)景3-集群管理zk.create("/testRootPath/testChildPath4","4".getBytes(),Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);System.out.println(zk.getChildren("

溫馨提示

  • 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)論