這是舊版本的hbase的架構(gòu)圖,一個(gè)regionserver中只有一個(gè)Hlog。
這一張是新版本的圖,每一個(gè)regionserver中可以有30個(gè)Hlog。
老版本和新版本的變動(dòng):
- 0.96版本以前,一個(gè)regionserver只有一個(gè)HLog,并且管理元數(shù)據(jù)有.meta. -root-兩個(gè)元數(shù)據(jù)表。
- 0.98版本以后,一個(gè)regionserver可以有多個(gè)Hlog,并且管理元數(shù)據(jù),只有.meta.表。
- .MEAT.:記錄了用戶(hù)所有表拆分出來(lái)的region映射信息(各個(gè)region的rowkey范圍,以及存在的節(jié)點(diǎn)),.MEAT.可以有多個(gè)region。對(duì)應(yīng)的用戶(hù)表中切分出來(lái)的每一個(gè)region就對(duì)應(yīng).META.表中的一個(gè)記錄
- -ROOT-:記錄了.META.表的 Region 信息,-ROOT-只有一個(gè) Region,無(wú)論如何不會(huì)分裂,同樣的.META.表切分出來(lái)的一個(gè)region就是- ROO-表中的一個(gè)記錄。
- Client訪問(wèn)用戶(hù)表前需要首先訪問(wèn)zookeeper,找到對(duì)應(yīng)的-ROOT-表的region所在位置,然后訪問(wèn)-ROOT-表,找到.meta.表的訪問(wèn)位置,然后找到.meta.表,最后通過(guò).meta.表找到用戶(hù)數(shù)據(jù)的位置去訪問(wèn),中間需要多次網(wǎng)絡(luò)操作,并且client 端會(huì)做 cache 緩存(即如果下一次查找的記錄在上一次已經(jīng)查詢(xún)了,可以不進(jìn)行以上操作,直接在緩存中得到)
- zookeeper為HBASE提供failover機(jī)制,選主master,避免單點(diǎn)故障,其實(shí)HBASE中的master,宕機(jī)一段時(shí)間對(duì)集群影響不大,因?yàn)閙aster,及時(shí)master宕機(jī),HBASE集群仍然可以做:查看,上傳操作,但是不能創(chuàng)建和修改表。但是master宕機(jī)很長(zhǎng)時(shí)間是不行的,因?yàn)閙aster需要做負(fù)載。
- 存儲(chǔ)所有Region 的尋址入口:-ROOT-表在哪臺(tái)服務(wù)器上。-ROOT-這張表的位置信息
- 實(shí)時(shí)監(jiān)控regionserver的狀態(tài),將regionserver的上線和下線信息實(shí)時(shí)通知給master
- 存儲(chǔ)HBASE的schema(包括有哪些 Table,每個(gè) Table 有哪些 Column Family);默認(rèn)情況下: /hbase/table:是zookeeper中存儲(chǔ)HBASE中表名的目錄
- 為regionserver分配region(并且做負(fù)載均衡)
- 發(fā)現(xiàn)失效的 RegionServer 并重新分配其上的 Region(即,如果有相應(yīng)的RegionServer宕機(jī)的時(shí)候,master會(huì)將其宕機(jī)節(jié)點(diǎn)上的region,復(fù)制到其他節(jié)點(diǎn)上),高容錯(cuò)。
- HDFS 上的垃圾文件(HBase)回收
- 處理HBASE的schema(表的創(chuàng)建、刪除、修改、列簇的增加…)
- RegionServer 維護(hù) Master 分配給它的 Region,處理對(duì)這些 Region 的 IO 請(qǐng)求(即對(duì)表中數(shù)據(jù)的增、刪、改)
- 負(fù)責(zé)和底層的文件系統(tǒng)hdfs交互,存儲(chǔ)數(shù)據(jù)到hdfs
- 負(fù)責(zé) Store 中的 HFile 的合并工作
- RegionServer 負(fù)責(zé) Split 在運(yùn)行過(guò)程中變得過(guò)大的 Region,負(fù)責(zé) Compact (切分)操作
切分原則:
第一次:128*(1*1)
第二次:128*(3*3)
第三次:128*(5*5) 直到計(jì)算的結(jié)果>10G的時(shí)候,以后就按照10G切分
上圖是一個(gè)regionserver的存儲(chǔ)
- Table中的所有行按照rowkey進(jìn)行字典排序,然后根據(jù)rowkey范圍,切分出不同的region
- Region的默認(rèn)大小為10G,每個(gè)表一開(kāi)始只有一個(gè) HRegion,隨著數(shù)據(jù)不斷插入 表,HRegion 不斷增大,當(dāng)增大到一個(gè)閥值的時(shí)候,HRegion 就會(huì)等分會(huì)兩個(gè)新的 HRegion。 當(dāng)表中的行不斷增多,就會(huì)有越來(lái)越多的 HRegion
- Region是Hbase 中分布式存儲(chǔ)和負(fù)載均衡的最小單元。同一個(gè)region中的數(shù)據(jù)一定是存儲(chǔ)在同一個(gè)節(jié)點(diǎn)上的,但是region切分后,可以存儲(chǔ)的不同的節(jié)點(diǎn)
- Region雖然是負(fù)載的最小單元,但是不是物理存儲(chǔ)的最小單元。實(shí)際上,region由一個(gè)或者多個(gè)store組成,每一個(gè)store,存儲(chǔ)的是region中的一個(gè)列簇中的所有數(shù)據(jù)。每個(gè) Strore 又由一個(gè) MemStore 和 0 至多個(gè) StoreFile 組成
一個(gè)region由多個(gè)store組成,每一個(gè)store包含一個(gè)列簇的所有數(shù)據(jù),一個(gè)region由多個(gè)store組成,每一個(gè)store包含一個(gè)列簇的所有數(shù)據(jù)。
原理:在寫(xiě)入數(shù)據(jù)的時(shí)候,現(xiàn)將數(shù)據(jù)寫(xiě)入到Memstore,當(dāng) Memstore 中的數(shù)據(jù)量達(dá)到某個(gè)閾值,regionserver啟動(dòng)flushcache 進(jìn)程寫(xiě)入 Storefile,每次寫(xiě)入形成單獨(dú)一個(gè) HFile。(即,當(dāng)達(dá)到閾值的時(shí)候,首先會(huì)將存儲(chǔ)在Memstore中的數(shù)據(jù)寫(xiě)入磁盤(pán),形式為hfile,當(dāng)磁盤(pán)中有多個(gè)Hfile的時(shí)候,又會(huì)進(jìn)行合并,合并成一個(gè)storefile)。
StoreFile 以 HFile 格式保存在 HDFS 上,請(qǐng)看下圖 HFile 的數(shù)據(jù)組織格式:
其中:首先 HFile 文件是不定長(zhǎng)的,長(zhǎng)度固定的只有其中的兩塊:Trailer 和 FileInfo。
- Trailer:有指針,指向其他數(shù)據(jù)塊的起始點(diǎn)
- FileInfo:記錄本文件的元數(shù)據(jù)信息
- Data:存儲(chǔ)的是表中的數(shù)據(jù)
- Meta:保存用戶(hù)自定義的 kv 對(duì)
- Data Index:data的索引,每條索引的 key 是被索引的 block 的第一條記錄的 key
- Meta Index:Meta的索引,記錄著Meta數(shù)據(jù)的起始位置
- Data中的magic:用于校驗(yàn),判斷是否有數(shù)據(jù)損壞
其中,除了trailer和fileinfo兩個(gè)定長(zhǎng)的數(shù)據(jù)以外,其他的數(shù)據(jù)都可以進(jìn)行壓縮。
data中的K-V鍵值的介紹:
兩個(gè)固定長(zhǎng)度的數(shù)值,分別表示key的長(zhǎng)度和value的長(zhǎng)度。緊接著是key,開(kāi)始是固定長(zhǎng)度的數(shù)值,表示rowkey的長(zhǎng)度,緊接著是rowkey,然后是固定長(zhǎng)度的數(shù)值,緊接著是列簇名(最好是16),接著是 Qualifier(列名),然后是兩個(gè)固定長(zhǎng)度的數(shù)值,表示 TimeStamp 和 KeyType(Put/Delete)。Value 部分沒(méi)有這么復(fù)雜的結(jié)構(gòu),就是純粹的二進(jìn)制數(shù)據(jù)了。
WAL 意為 Write ahead log,用于做災(zāi)難恢復(fù)的,HLog 記錄數(shù)據(jù)的所有變更,一旦數(shù)據(jù)修改,就可以從 Log 中 進(jìn)行恢復(fù)。
災(zāi)難恢復(fù)的解釋:開(kāi)始的時(shí)候region的數(shù)據(jù)時(shí)存儲(chǔ)在內(nèi)存中的metestore,此時(shí)還沒(méi)有達(dá)到閾值,數(shù)據(jù)仍在內(nèi)存中,沒(méi)有持久化到磁盤(pán),如果此時(shí)機(jī)器突然宕機(jī),儲(chǔ)存在內(nèi)存的數(shù)據(jù),會(huì)丟失,此時(shí)需要hlog進(jìn)行數(shù)據(jù)的恢復(fù)。但是hlog只會(huì)保存,在沒(méi)有同步到磁盤(pán)中的那部分操作的日志,已同步到磁盤(pán)的數(shù)據(jù),那部分的日志,會(huì)被存放到oldWAL目錄下,10分鐘后刪除。
HLog 的文件結(jié)構(gòu):
- HLog Sequence File 的 Key 是 HLogKey 對(duì)象,HLogKey 中記錄了寫(xiě)入數(shù)據(jù)的歸屬信息,除 了 table 和 region 名字外,同時(shí)還包括 sequence number 和 timestamp,timestamp 是”寫(xiě)入 時(shí)間”,sequence number 的起始值為 0,或者是最近一次存入文件系統(tǒng)中 sequence number。
- HLog Sequece File 的 Value 是 HBase 的 KeyValue 對(duì)象,即對(duì)應(yīng) HFile 中的 KeyValue
介紹 :讀寫(xiě)是在regionserver上發(fā)生,每個(gè) RegionSever 為一定數(shù)量的 Region 服務(wù),如果client要對(duì)某一行數(shù)據(jù)做讀寫(xiě)的時(shí)候,我們?cè)撛L問(wèn)哪一個(gè)regionserver?,可以使用尋址的方式解決。
解釋:
- client請(qǐng)求zookeeper獲得-root-所在的regionserver地址
- client請(qǐng)求-root-所在的regionserver,獲取取.META.表的地址。client 會(huì)將-ROOT-的相關(guān) 信息 cache 下來(lái),以便下一次快速訪問(wèn)
- client請(qǐng)求.META.表的regionserver,獲取訪問(wèn)數(shù)據(jù)所在的regionserver的地址(仍然有緩存)
- client請(qǐng)求訪問(wèn)數(shù)據(jù)所在的regionserver,獲取相應(yīng)的數(shù)據(jù)
- Client 請(qǐng)求 ZooKeeper 獲取.META.所在的 RegionServer 的地址
- Client 請(qǐng)求.META.所在的 RegionServer 獲取訪問(wèn)數(shù)據(jù)所在的 RegionServer 地址,Client 會(huì)將.META.的相關(guān)信息 cache 下來(lái),以便下一次快速訪問(wèn)
- Client 請(qǐng)求數(shù)據(jù)所在的 RegionServer,獲取所需要的數(shù)據(jù)
- 客戶(hù)端通過(guò)zookeeper以及-root-表和.mate.表找到目標(biāo)數(shù)據(jù)所在的regionserver(尋址)
- 聯(lián)系regionserve查詢(xún)目標(biāo)數(shù)據(jù)
- Region先在memstore中查找,命中則返回
- 如果memstore找不到,則在storefile中掃描 , 為了能快速的判斷要查詢(xún)的數(shù)據(jù)在不在這個(gè) StoreFile 中,應(yīng)用了 BloomFilter(布隆過(guò)濾)
- Client先根據(jù)rowkey找到對(duì)應(yīng)的region所在的regionserver(尋址)
- Client向regionserver提交請(qǐng)求
- Regionserver找到目標(biāo)region
- Regionserver檢查數(shù)據(jù)是否與 Schema 一致
- 如果客戶(hù)端沒(méi)有指定版本,則獲取當(dāng)前系統(tǒng)時(shí)間作為數(shù)據(jù)版本
- 將更新寫(xiě)入Hlog
- 將數(shù)據(jù)寫(xiě)入memstore
- 判斷memstore的是否需要flush為storefile
注意:
- 數(shù)據(jù)在更新時(shí)首先寫(xiě)入 HLog(WAL Log),再寫(xiě)入內(nèi)存(MemStore)中,MemStore 中的數(shù)據(jù)是排序的
- Storefile是只讀的,一旦創(chuàng)建就不能在修改,因此HBASE的更新/修改其實(shí)是不斷追加的操作,根據(jù)版本的保留策略,會(huì)將舊的數(shù)據(jù)刪除
任何時(shí)刻,一個(gè)region只能分配一個(gè)regionserver。Master記錄了當(dāng)前有哪些可用的regionserver。以及當(dāng)前哪些region分配給了哪些regionserver,哪些region還沒(méi)有分配。當(dāng)需要分配新的region的時(shí)候,master就給一個(gè)有可用空間的regionserver發(fā)送裝載region的請(qǐng)求。把這個(gè)region分配個(gè)這個(gè)regionserver。
Master 使用 zookeeper 來(lái)跟蹤 RegionServer 狀態(tài)。當(dāng)某個(gè) RegionServer 啟動(dòng)時(shí),會(huì)首先在 ZooKeeper 上的 server 目錄下建立代表自己的 znode。由于 Master 訂閱了ZooKeeper server 目錄上的變 更消息,當(dāng) server 目錄下的文件出現(xiàn)新增或刪除操作時(shí),Master 可以得到來(lái)自 ZooKeeper 的實(shí)時(shí)通知。因此一旦 RegionServer 上線,Master 能馬上得到消息
當(dāng) RegionServer 下線時(shí),它和 zookeeper 的會(huì)話斷開(kāi),ZooKeeper 而自動(dòng)釋放代表這臺(tái) server 的文件上的獨(dú)占鎖。Master 就可以確定,regionserver和zookeeper之間無(wú)法通行了,regionserver可能宕機(jī)了。
- 從zookeeper上獲取唯一代表Active Master 的鎖,用來(lái)阻止其它 Master 成為 Master
- 掃描zookeeper上的server的節(jié)點(diǎn),獲得當(dāng)前可用的regionserver節(jié)點(diǎn)列表。
- 和每一個(gè)regionserver通信,獲得當(dāng)前分配的region和regionserver的對(duì)應(yīng)關(guān)系。
- 掃描.META. Region 的集合,計(jì)算得到當(dāng)前還未分配的region,將他們放入待分配region列表。
由于master只維護(hù)表和region的元數(shù)據(jù),而不參與數(shù)據(jù)IO的過(guò)程,master下線僅導(dǎo)致所有的元數(shù)據(jù)的修改被凍結(jié)(無(wú)法創(chuàng)建表,無(wú)法修改表的schema,無(wú)法進(jìn)行region的負(fù)載均衡),表的數(shù)據(jù)讀寫(xiě)還可以正常進(jìn)行。因此master可以短暫的下線。從上線過(guò)程可以看到,Master 保存的信息全是可以冗余信息(都可以從系統(tǒng)其它地方 收集到或者計(jì)算出來(lái))
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。
文章標(biāo)題:hbase的底層原理-創(chuàng)新互聯(lián)
網(wǎng)站鏈接:http://aaarwkj.com/article14/jscde.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、動(dòng)態(tài)網(wǎng)站、靜態(tài)網(wǎng)站、虛擬主機(jī)、ChatGPT、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容