組成部件說明
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
引入HLog緣由:
在分佈式系統環境中,沒法避免系統出錯或者宕機,一旦HRegionServer意外退出,MemStore中的內存數據就會丟失,引入HLog就是防止這種狀況
工做機制:
每一個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,完成數據恢復。oop
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指針
圖片解釋:
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數組裏麪包含了不少項,而且有固定的結構。blog
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
結束語:這篇文章是我專門在網上弄下來的,算是hbase部分的終極篇吧,個人服務端的源碼系列也要基於這個順序來開展。