hbase 系統架構圖

<b>組成部件說明 </b>
client:
使用hbase rpc機制與hmaster和hregionserver進行通信
client與hmaster進行通信進行管理類操作
client與hregionserver進行資料讀寫類操作
zookeeper:
zookeeper quorum存儲-root-表位址、hmaster位址
hregionserver把自己以ephedral方式注冊到zookeeper中,hmaster随時感覺各個hregionserver的健康狀況
zookeeper避免hmaster單點問題
hmaster:
hmaster沒有單點問題,hbase中可以啟動多個hmaster,通過zookeeper的master election機制保證總有一個master在運作
主要負責table和region的管理工作:
1 管理使用者對表的增删改查操作
2 管理hregionserver的負載均衡,調整region分布
3 region split後,負責新region的分布
4 在hregionserver停機後,負責失效hregionserver上region遷移
hregionserver:
hbase中最核心的子產品,主要負責響應使用者i/o請求,向hdfs檔案系統中讀寫資料
hregionserver管理一些列hregion對象;
每個hregion對應table中一個region,hregion由多個hstore組成;
每個hstore對應table中一個column family的存儲;
column family就是一個集中的存儲單元,故将具有相同io特性的column放在一個column family會更高效
hstore:
hbase存儲的核心。由memstore和storefile組成。
memstore是sorted memory buffer。使用者寫入資料的流程:
client寫入 -> 存入memstore,一直到memstore滿 -> flush成一個storefile,直至增長到一定門檻值 -> 觸發compact合并操作 -> 多個storefile合并成一個storefile,同時進行版本合并和資料删除 -> 當storefiles compact後,逐漸形成越來越大的storefile -> 單個storefile大小超過一定門檻值後,觸發split操作,把目前region split成2個region,region會下線,新split出的2個孩子region會被hmaster配置設定到相應的hregionserver上,使得原先1個region的壓力得以分流到2個region上。
由此過程可知,hbase隻是增加資料,有所得更新和删除操作,都是在compact階段做的,是以,使用者寫操作隻需要進入到記憶體即可立即傳回,進而保證i/o高性能。
hlog
<b>引入hlog原因: </b>
在分布式系統環境中,無法避免系統出錯或者當機,一旦hregionserver意外退出,memstore中的記憶體資料就會丢失,引入hlog就是防止這種情況
<b>工作機制:</b>
每個hregionserver中都會有一個hlog對象,hlog是一個實作write ahead log的類,每次使用者操作寫入memstore的同時,也會寫一份資料到hlog檔案,hlog檔案定期會滾動出新,并删除舊的檔案(已持久化到storefile中的資料)。當hregionserver意外終止後,hmaster會通過zookeeper感覺,hmaster首先處理遺留的hlog檔案,将不同region的log資料拆分,分别放到相應region目錄下,然後再将失效的region重新配置設定,領取到這些region的hregionserver在load region的過程中,會發現有曆史hlog需要處理,是以會replay hlog中的資料到memstore中,然後flush到storefiles,完成資料恢複。
hbase存儲格式
hbase中的所有資料檔案都存儲在hadoop hdfs檔案系統上,格式主要有兩種:
1 hfile hbase中keyvalue資料的存儲格式,hfile是hadoop的二進制格式檔案,實際上storefile就是對hfile做了輕量級包裝,即storefile底層就是hfile
2 hlog file,hbase中wal(write ahead log) 的存儲格式,實體上是hadoop的sequence file
hfile
<b></b>
圖檔解釋:
hfile檔案不定長,長度固定的塊隻有兩個:trailer和fileinfo
trailer中指針指向其他資料塊的起始點
file info中記錄了檔案的一些meta資訊,例如:avg_key_len, avg_value_len, last_key, comparator, max_seq_id_key等
data index和meta index塊記錄了每個data塊和meta塊的起始點
data block是hbase i/o的基本單元,為了提高效率,hregionserver中有基于lru的block cache機制
每個data塊的大小可以在建立一個table的時候通過參數指定,大号的block有利于順序scan,小号block利于随機查詢
每個data塊除了開頭的magic以外就是一個個keyvalue對拼接而成, magic内容就是一些随機數字,目的是防止資料損壞
hfile裡面的每個keyvalue對就是一個簡單的byte數組。這個byte數組裡面包含了很多項,并且有固定的結構。
keylength和valuelength:兩個固定的長度,分别代表key和value的長度
key部分:row length是固定長度的數值,表示rowkey的長度,row 就是rowkey
column family length是固定長度的數值,表示family的長度
接着就是column family,再接着是qualifier,然後是兩個固定長度的數值,表示time stamp和key type(put/delete)
value部分沒有這麼複雜的結構,就是純粹的二進制資料
hlog file
hlog檔案就是一個普通的hadoop sequence file,sequence file 的key是hlogkey對象,hlogkey中記錄了寫入資料的歸屬資訊,除了table和region名字外,同時還包括 sequence number和timestamp,timestamp是“寫入時間”,sequence number的起始值為0,或者是最近一次存入檔案系統中sequence number。
hlog sequece file的value是hbase的keyvalue對象,即對應hfile中的keyvalue
<b>結束語:</b>這篇文章是我專門在網上弄下來的,算是hbase部分的終極篇吧,我的服務端的源碼系列也要基于這個順序來開展。