HBase從宏觀上看只有HMaster、RegionServer和zookeeper三個組件。數據庫
Master: 負責啓動的時候分配Region到具體的RegionServer,執行各類管理操做,好比Region的分割合併。HBase的Master是不負責數據的讀寫的,因此它掛了集羣照樣能夠運行並讀寫數據,可是沒法新建刪除表。服務器
RegionServer:RegionServer上有一個或者多個Region。讀寫的數據就存儲在Region上。數據結構
Region:表的一部分數據,HBase是個會自動分片的數據庫。一個Region就至關於關係型數據庫中的一個分區表中的分區。架構
zookeeper:HBase沒有Master能夠運行,可是沒有zookeeper是沒法運行的,在JavaAPI在讀寫HBase時,配置的就是zookeeper的地址,而不是HBase自己的地址。由於讀取數據所須要的元數據表就存儲在zookeeper上。設計
WAL,預寫日誌,WAL是Write-Ahead Log的縮寫。當操做到達Region的時候,HBase會直接把操做寫到WAL中,而後會將數據放到基於內存實現的Memstore,等數據到達必定量時才flush到HFile中,若是這個過程當中服務宕機或者斷電,那麼數據就丟失了。WAL是一個保險機制,數據在寫到Memstore以前就會寫到WAL,這樣WAL中的日誌就是數據恢復的依據。WAL默認是開啓的。一個好的軟件的設計真的是連服務器的宕機都考慮進去了。日誌
Memstore,爲了讓HBase中的讀取效率提升,設計了Memstore,數據寫入HDFS以前會先寫入這裏,而後數據量達到一個閥值就flush到HFile中。HBase是採用LSM樹來保存數據,因此在Memstore中會先將數據整理爲LSM樹,而後再刷寫到磁盤。server
LSM樹,即日誌結構合併樹(Log-Structured Merge-Tree)。其實它並不屬於一個具體的數據結構,它更可能是一種數據結構的設計思想。將數據分別放到內存和磁盤中,每次有數據更新不是必須將數據寫入到磁盤中,而能夠先將最新的數據駐留在內存中,等到積累到閥值後,再使用歸併排序的方式將內存內的數據合併追加到磁盤隊尾,由於全部待排序的樹都是通過排序的,能夠經過合併排序的方式快速合併到一塊兒。blog
雖然新寫入的數據會暫存Memstore中,但並非讀取數據的時候也是先讀Memstore,再去讀磁盤。排序
HFile , 是HBase數據真正的載體,建立全部的表、列等數據都放到HFile中。HFile也是StoreFile,有的地方也叫StoreFile。內存
文件主要分爲四個部分:Scanned block section,Non-scanned block section,Opening-time data section和Trailer。
Scanned block section:顧名思義,表示順序掃描HFile時全部的數據塊將會被讀取,包括Leaf Index Block和Bloom Block以及DataBlock。(DataBlock是HBase中數據存儲的最小單元。DataBlock中主要存儲用戶的KeyValue數據(KeyValue後面通常會跟一個timestamp)
Non-scanned block section:表示在HFile順序掃描的時候數據不會被讀取,主要包括Meta Block和Intermediate Level Data Index Blocks兩部分。
Load-on-open-section:這部分數據在HBase的region server啓動時,須要加載到內存中。包括FileInfo、Bloom filter block、data block index和meta block index。
Trailer:這部分主要記錄了HFile的基本信息、各個部分的偏移值和尋址信息。
HFile會被切分爲多個大小相等的block塊,每一個block的大小能夠在建立表列簇的時候經過參數blocksize 進行指定,默認爲64k,大號的Block有利於順序Scan,小號Block利於隨機查詢,於是須要權衡。而且全部block塊都擁有相同的數據結構。
未完,待補充...