參考鏈接
https://www.cnblogs.com/qingyunzong/p/8692430.html
hbase分布式存儲(chǔ)機(jī)制(工作原理詳解)
hbase系統(tǒng)架構(gòu)圖
hbase集群中每個(gè)組件的作用
Client
//包含訪問hbase 的接口,client 維護(hù)著一些cache 來加快對(duì)hbase 的訪問,比如regione 的位置信息。
1、HBase 有兩張?zhí)厥獗恚?br/>.META.:記錄了用戶所有表拆分出來的的 Region 映射信息,.META.可以有多個(gè) Regoin
-ROOT-:記錄了.META.表的 Region 信息,-ROOT-只有一個(gè) Region,無論如何不會(huì)分裂
2、Client 訪問用戶數(shù)據(jù)前需要首先訪問 ZooKeeper,找到-ROOT-表的 Region 所在的位置,然 后訪問-ROOT-表,接著訪問.META.表,最后才能找到用戶數(shù)據(jù)的位置去訪問,中間需要多次 網(wǎng)絡(luò)操作,不過 client 端會(huì)做 cache 緩存。
//客戶端直接與regionserver聯(lián)系的
備注:0.96 版本以后將-ROOT-表去掉了。至于為什么,請(qǐng)?jiān)敿?xì)見,hbase的尋址地址過程。
.META. -ROOT- 這2個(gè)表的信息都是通過zookeeper中的信息去找的,.META. -ROOT-這兩個(gè)表具體是在regionserver的服務(wù)器上
Hmaster:
1 為Region server 分配region
2 負(fù)責(zé)region server 的負(fù)載均衡
3 發(fā)現(xiàn)失效的region server 并重新分配其上的region
4 GFS 上的垃圾文件回收
5 處理schema(模式) 更新請(qǐng)求 //可以通俗的理解為管理用戶對(duì)表的增刪改成操作
regionserver
1 Region server 維護(hù)Master 分配給它的region,處理對(duì)這些region 的IO 請(qǐng)求
2 Region server 負(fù)責(zé)切分在運(yùn)行過程中變得過大的region //真正管理表實(shí)際數(shù)據(jù)的
3 regionsever 負(fù)責(zé)響應(yīng)用戶的IO請(qǐng)求,并且向hdfs中讀寫數(shù)據(jù)
//可以看到,client 訪問hbase 上數(shù)據(jù)的過程并不需要master 參與
(尋址訪問zookeeper 和regionserver,數(shù)據(jù)讀寫訪問regione server),master 僅僅維護(hù)者table 和region 的元數(shù)據(jù)信息,所有負(fù)載很低。
提示:一般的regionserver和hdfs中的datanode并置,datanode存儲(chǔ)有regionserver正在管理的數(shù)據(jù),hbase的數(shù)據(jù)最終都是存儲(chǔ)在hdfs上。
Zookeeper
1 保證任何時(shí)候,集群中只有一個(gè)master
2 存貯所有Region 的尋址入口。
3 實(shí)時(shí)監(jiān)控Region Server 的狀態(tài),將Region server 的上線和下線信息實(shí)時(shí)通知給Master
4 存儲(chǔ)Hbase 的schema(模式),包括有哪些table,每個(gè)table 有哪些column family
HRegion
table在行的方向上分隔為多個(gè)Region。Region是HBase中分布式存儲(chǔ)和負(fù)載均衡的最小單元,即不同的region可以分別在不同的Region Server上,但同一個(gè)Region是不會(huì)拆分到多個(gè)server上。Region按大小分隔,每個(gè)表一般是只有一個(gè)region。隨著數(shù)據(jù)不斷插入表,region不斷增大,當(dāng)region的某個(gè)列族達(dá)到一個(gè)閾值時(shí)就會(huì)分成兩個(gè)新的region。每個(gè)region由以下信息標(biāo)識(shí):< 表名,startRowkey,創(chuàng)建時(shí)間> 由目錄表(-ROOT-和.META.)記錄該region的endRowkey
Memstore store 與storefile
一個(gè)region 由多個(gè)store 組成,每個(gè)store 包含一個(gè)列族的所有數(shù)據(jù) Store 包括位于把內(nèi)存的memstore 和位于硬盤的storefile
寫操作先寫入memstore,當(dāng)memstore 中的數(shù)據(jù)量達(dá)到某個(gè)閾值,regionserver 啟動(dòng)flashcache進(jìn)程寫入storefile,每次寫入形成單獨(dú)一個(gè)storefile。
當(dāng)storefile 大小超過一定閾值后,會(huì)把當(dāng)前的region 分割成兩個(gè),并由Hmaster 分配奧相應(yīng)的region 服務(wù)器,實(shí)現(xiàn)負(fù)載均衡
客戶端檢索數(shù)據(jù)時(shí),先在memstore 找,找不到再找storefile
HLog(WAL log)
WAL 意為Write ahead log(http://en.wikipedia.org/wiki/Write-ahead_logging),類似mysql 中的binlog,用來做災(zāi)難恢復(fù)只用,Hlog 記錄數(shù)據(jù)的所有變更,一旦數(shù)據(jù)修改,就可以從log 中進(jìn)行恢復(fù)。
每個(gè)Region Server 維護(hù)一個(gè)Hlog,而不是每個(gè)Region 一個(gè)。這樣不同region(來自不同table)的日志會(huì)混在一起,這樣做的目的是不斷追加單個(gè)文件相對(duì)于同時(shí)寫多個(gè)文件而言,可以減少磁盤尋址次數(shù),因此可以提高對(duì)table 的寫性能。帶來的麻煩是,如果一臺(tái)region server下線,為了恢復(fù)其上的region,需要將region server 上的log 進(jìn)行拆分,然后分發(fā)到其它regionserver 上進(jìn)行恢復(fù)
HLog 文件就是一個(gè)普通的Hadoop Sequence File,Sequence File 的Key 是HLogKey 對(duì)象,HLogKey 中記錄了寫入數(shù)據(jù)的歸屬信息,除了table 和region 名字外,同時(shí)還包括sequence number 和timestamp,timestamp 是”寫入時(shí)間”,sequence number 的起始值為0,或者是最近一次存入文件系統(tǒng)中sequence number。HLog Sequece File 的Value 是HBase 的KeyValue對(duì)象,即對(duì)應(yīng)HFile 中的KeyValue,可參見上文描述。
HFile :
HBase中KeyValue數(shù)據(jù)的存儲(chǔ)格式,HFile是Hadoop的 二進(jìn)制格式文件,實(shí)際上StoreFile就是對(duì)Hfile做了輕量級(jí)包裝,即StoreFile底層就是HFile。
Trailer 部分的格式:
HFile 分為六個(gè)部分:
1、Data Block 段–保存表中的數(shù)據(jù),這部分可以被壓縮
2、Meta Block 段(可選的)–保存用戶自定義的kv 對(duì),可以被壓縮。
3、File Info 段–Hfile 的元信息,不被壓縮,用戶也可以在這一部分添加自己的元信息。
4、Data Block Index 段–Data Block 的索引。每條索引的key 是被索引的block 的第一條記錄的key。
5、Meta Block Index 段(可選的)–Meta Block 的索引。
6、Trailer–這一段是定長(zhǎng)的。保存了每一段的偏移量,讀取一個(gè)HFile 時(shí),會(huì)首先讀取Trailer,Trailer 保存了每個(gè)段的起始位置(段的Magic Number 用來做安全check),然后,DataBlock Index 會(huì)被讀取到內(nèi)存中,這樣,當(dāng)檢索某個(gè)key 時(shí),不需要掃描整個(gè)HFile,而只需從內(nèi)存中找到key 所在的block,通過一次磁盤io 將整個(gè)block 讀取到內(nèi)存中,再找到需要的key。DataBlock Index 采用LRU 機(jī)制淘汰。HFile 的Data Block,Meta Block 通常采用壓縮方式存儲(chǔ),壓縮之后可以大大減少網(wǎng)絡(luò)IO 和磁盤IO,隨之而來的開銷當(dāng)然是需要花費(fèi)cpu 進(jìn)行壓縮和解壓縮。
目標(biāo)Hfile 的壓縮支持兩種方式:Gzip,Lzo。
hbase分布式存儲(chǔ)機(jī)制詳解
1 已經(jīng)提到過,Table 中的所有行都按照row key 的字典序排列。
2 Table 在行的方向上分割為多個(gè)region。
3 region 按大小分割的,每個(gè)表一開始只有一個(gè)region,隨著數(shù)據(jù)不斷插入表,region 不斷增大,當(dāng)增大到一個(gè)閥值的時(shí),region 就會(huì)等分會(huì)兩個(gè)新的region。當(dāng)table 中的行不斷增多,就會(huì)有越來越多的region。
4 region 是Hbase 中分布式存儲(chǔ)和負(fù)載均衡的最小單元。最小單元就表示不同的region 可以分布在不同的HRegion server 上。但一個(gè)region 是不會(huì)拆分到多個(gè)server 上的。
5、當(dāng)regionserver上的region的數(shù)據(jù)量增長(zhǎng)到一個(gè)閾值的時(shí)候會(huì)分裂,然后繼續(xù)增長(zhǎng)分裂。(推薦每一個(gè)regionserver管理1000個(gè)region)
再到細(xì)節(jié)中,一個(gè)region中的數(shù)據(jù)最終存儲(chǔ)到hdfs上去的時(shí)候,會(huì)采用什么樣子的機(jī)制呢?
6、Region 雖然是分布式存儲(chǔ)的最小單元,但并不是存儲(chǔ)的最小單元。事實(shí)上,Region 由一個(gè)或者多個(gè)Store 組成,每個(gè)store 保存一個(gè)columns family(列族)。每個(gè)Strore 又由一個(gè)memStore 和0 至多個(gè)StoreFile 組成。如圖:StoreFile 以HFile 格式保存在HDFS 上。
//region中的一個(gè)列族就是一個(gè)物理的存儲(chǔ)單位,所有2個(gè)不同的列族是絕對(duì)不可能存放在同一個(gè)文件中的。
7、每個(gè)Strore 又由一個(gè)memStore 和0 至多個(gè)StoreFile 組成。memstore是共享的,相當(dāng)于整個(gè)store的內(nèi)存緩存,如果客戶端去讀數(shù)據(jù)的時(shí)候,如果命中到哪里就會(huì)優(yōu)先從memstore中拿或者寫數(shù)據(jù)。如果memstore中沒有我們要取的數(shù)據(jù)的話,接下來才會(huì)到storefile中去找。memstore可以理解為一個(gè)緩存的機(jī)制。如果是寫數(shù)據(jù)的時(shí)候,會(huì)先向memstore中去寫,然后過段時(shí)間才會(huì)把memstore刷成storefile(這其實(shí)就是region flush:寫數(shù)據(jù)的時(shí)候先寫到memstore中,過段時(shí)間再flush成storefile storefile會(huì)轉(zhuǎn)化成hfile 最終存儲(chǔ)到hdfs上)//StoreFile 以HFile 格式保存在HDFS 上。
8、當(dāng)有多個(gè)storefile超過我們?cè)O(shè)定的閾值的時(shí)候,會(huì)出現(xiàn)compactition(壓縮)操作。將允許操作將所有的storefile文件作為一個(gè)storefile重新寫入(每次memstore刷新寫入一個(gè)storefile)你可以指定更大數(shù)量延壓縮,但壓縮將運(yùn)行更長(zhǎng)時(shí)間,在壓縮期間,更新將無法刷新到磁盤。長(zhǎng)時(shí)間的壓縮需要足夠的內(nèi)存,再以壓縮的持續(xù)時(shí)間內(nèi)記錄所有更新,如太大,壓縮期間,客戶端會(huì)超時(shí)。
9、在hfile端也會(huì)出現(xiàn)壓縮的情況:hbase會(huì)自動(dòng)拾取一些較小的hfile,并將它們寫入一些較大的hFile中,這個(gè)過程叫minor compacition :minor compacatition通過重寫操作,利用合并排序?qū)⑤^小的文件轉(zhuǎn)化為較大數(shù)量卻數(shù)量較少的文件中。
提示:在有些資料中會(huì)單獨(dú)的提到blockcache是讀操作的緩存,他保存了內(nèi)存中經(jīng)常被讀的一些信息。memstore是寫操作的緩存,
我們把他們理解成一樣的,作用為緩存就可以了。不必深究。
如果要深入理解 memstore和blockcache的具體區(qū)別,請(qǐng)參考此文中的問題1 問題2 的解答
HBase原理-遲到的‘?dāng)?shù)據(jù)讀取流程’部分細(xì)節(jié) http://hbasefly.com/2017/06/11/hbase-scan-2/
HBase BlockCache系列 – 走進(jìn)BlockCache http://hbasefly.com/2016/04/08/hbase-blockcache-1/
1、BlockCache是Region Server級(jí)別的,
2、一個(gè)Region Server只有一個(gè)Block Cache,在Region Server啟動(dòng)的時(shí)候完成Block Cache的初始化工作。
3、到目前為止,HBase先后實(shí)現(xiàn)了3種Block Cache方案,LRUBlockCache是最初的實(shí)現(xiàn)方案,也是默認(rèn)的實(shí)現(xiàn)方案;HBase 0.92版本實(shí)現(xiàn)了第二種方案SlabCache,見HBASE-4027;HBase 0.96之后官方提供了另一種可選方案BucketCache,見HBASE-7404。
具體memstore 和blockcache的具體區(qū)別 請(qǐng)看后續(xù)的博客!
問題1:
常說HBase數(shù)據(jù)讀取要讀Memstore、HFile和Blockcache,為什么上面Scanner只有StoreFileScanner和MemstoreScanner兩種?沒有BlockcacheScanner?
答
1、HBase中數(shù)據(jù)僅僅獨(dú)立地存在于Memstore和StoreFile中
2、Blockcache中的數(shù)據(jù)只是StoreFile中的部分?jǐn)?shù)據(jù)(熱點(diǎn)數(shù)據(jù))即所有存在于Blockcache的數(shù)據(jù)必然存在于StoreFile中。
3、因此MemstoreScanner和StoreFileScanner就可以覆蓋到所有數(shù)據(jù)。
4、首先查數(shù)據(jù)的時(shí)候,先會(huì)從blockcache中找,如果存在直接取出;如果沒有再到storefile中查找。
問題2:
數(shù)據(jù)更新(寫)操作先將數(shù)據(jù)寫入Memstore,再落盤。落盤之后需不需要更新Blockcache中對(duì)應(yīng)的kv?如果不更新,會(huì)不會(huì)讀到臟數(shù)據(jù)?
答:
1、不需要更新blockcache中的數(shù)據(jù)
2、不會(huì)讀到臟數(shù)據(jù),因?yàn)閿?shù)據(jù)寫到memstore中落盤形成新的文件。
3、memstore形成的新的文件和blockcache里面的數(shù)據(jù)是相互獨(dú)立的,以版本方式存在。
Region 管理機(jī)制
(1) region 分配
任何時(shí)刻,一個(gè)region 只能分配給一個(gè)region server。master 記錄了當(dāng)前有哪些可用的region server。以及當(dāng)前哪些region 分配給了哪些region server,哪些region 還沒有分配。當(dāng)存在未分配的region,并且有一個(gè)region server上有可用空間時(shí),master 就給這個(gè)region server 發(fā)送一個(gè)裝載請(qǐng)求,把region分配給這個(gè)region server。region server 得到請(qǐng)求后,就開始對(duì)此region
提供服務(wù)。
(2) region server 上線
master 使用zookeeper 來跟蹤region server 狀態(tài)。當(dāng)某個(gè)region server 啟動(dòng)時(shí),會(huì)首先在zookeeper 上的server 目錄下建立代表自己的文件,并獲得該文件的獨(dú)占鎖。由于master 訂閱了server 目錄上的變更消息,當(dāng)server 目錄下的文件出現(xiàn)新增或刪除操作時(shí),master 可以得到來自zookeeper 的實(shí)時(shí)通知。因此一旦region server 上線,master 能馬上得到消息。
(3)region server 下線
當(dāng)region server 下線時(shí),它和zookeeper 的會(huì)話斷開,zookeeper 而自動(dòng)釋放代表這臺(tái)server 的文件上的獨(dú)占鎖。而master 不斷輪詢server 目錄下文件的鎖狀態(tài)。如果master 發(fā)現(xiàn)某個(gè)region server 丟失了它自己的獨(dú)占鎖,(或者master 連續(xù)幾次和region server 通信都無法成功),master 就是嘗試去獲取代表這個(gè)region server 的讀寫鎖,一旦獲取成功,就可以確定:
1 region server 和zookeeper 之間的網(wǎng)絡(luò)斷開了。
2 region server 掛了。
的某其中一種情況發(fā)生了,無論哪種情況,region server 都無法繼續(xù)為它的region提供服務(wù)了,此時(shí)master 會(huì)刪除server 目錄下代表這臺(tái)region server 的文件,并將這臺(tái)region server 的region 分配給其它還活著的同志。
如果網(wǎng)絡(luò)短暫出現(xiàn)問題導(dǎo)致region server 丟失了它的鎖,那么region server重新連接到zookeeper 之后,只要代表它的文件還在,它就會(huì)不斷嘗試獲取這個(gè)文件上的鎖,一旦獲取到了,就可以繼續(xù)提供服務(wù)。
HMaster 工作機(jī)制
(1)Hmaster 上線
master 啟動(dòng)進(jìn)行以下步驟:
1 從zookeeper 上獲取唯一一個(gè)代碼master 的鎖,用來阻止其它master 成為master。
2 掃描zookeeper 上的server 目錄,獲得當(dāng)前可用的region server 列表。
3 和2 中的每個(gè)region server 通信,獲得當(dāng)前已分配的region 和region server的對(duì)應(yīng)關(guān)系。
4 掃描.META.region 的集合,計(jì)算得到當(dāng)前還未分配的region,將他們放入待分配region 列表。
(2)master 下線
由于master 只維護(hù)表和region 的元數(shù)據(jù),而不參與表數(shù)據(jù)IO 的過程,master下線僅導(dǎo)致所有元數(shù)據(jù)的修改被凍結(jié)(無法創(chuàng)建刪除表,無法修改表的schema(模式),無法進(jìn)行region 的負(fù)載均衡,無法處理region 上下線,無法進(jìn)行region 的合并,唯一例外的是region 的split 可以正常進(jìn)行,因?yàn)橹挥衦egion server 參與),表的數(shù)據(jù)讀寫還可以正常進(jìn)行。因此master 下線短時(shí)間內(nèi)對(duì)整個(gè)hbase集群沒有影響。從上線過程可以看到,master 保存的信息全是可以冗余信息(都可以從系統(tǒng)其它地方收集到或者計(jì)算出來),因此,一般hbase 集群中總是有一個(gè)master 在提供服務(wù),還有一個(gè)以上的’master’在等待時(shí)機(jī)搶占它的位置。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。