3.hbase 存儲模型和存儲過程分析

hbase爲什麼可以存儲PB級的數據還可以保證千萬QPS的併發和ms級的訪問速度,這得離不開它巧妙的存儲模型和存儲過程。另一方面,只有清楚瞭解hbase存儲模型和存儲過程才能設計好hbase最關鍵的行鍵。

邏輯存儲模型

邏輯上,可以把Hbase看成一個多維的哈希表,行鍵(Rowkey)-列族(Column Family)-列(Column Qualifier)-時間戳(Timestamp) 爲定位一個具體單元數據(CELL)的座標。

如下,爲一個數據的邏輯示意圖,可以一級級逐漸加強過濾條件查詢。實際存儲和查詢結果都是有序的,行鍵/列族/列都是按照字典序排列,而時間戳按照逆序排列便於直接取最新的數據,記住邏輯有序支持快速查找和掃描過濾,很多時候設計表需要利用有序的特性

邏輯模型

物理存儲模型

傳統的數據庫都是面向行存儲,主鍵索引行數據,對比行數據的存儲方式,列的存儲單列查詢只需要查詢對應的列,因此可以獲得更快的查詢速度,而且單列數據的相似度也會更高,可以有更高的壓縮比。

很多時候,我們說hbase是面向列的存儲,實際上這是有誤的,嚴格來說他是面向列族的數據庫。如下,而每個列族存在一個HFile中。

hbase物理模型

可以看到hbase的底層存儲是基於HDFS的,因此和Hadoop體系兼容性很好。具體由HMaster和HRegionServer構成,其中HMaster是協調主節點(可配置HMaster集羣,依賴zookeeper選舉主節點),Region Server負責存儲和執行數據操作。

對應到每臺Region Server機器上:

  • HRegionServer服務器中存儲了很多的HRegion,HRegion可以理解爲傳統數據庫的分片,多個Region賭贏一個HLog,HLog類似關係數據庫InnoDB的redo log
  • 每個HRegion是由多個HStore組成的,每個列族(ColumnFamily)對應一個HStore概念
  • 每個HStore和關係數據庫庫的概念非常像,包括磁盤存儲文件HFile和內存存儲MemStore,還有圖上未標出的查詢緩存BlockCache,每個HFile只包含一個列族的數據,因此查詢時指定列族查詢時,只需要找到包含數據的對應HFile,不會影響其它查詢,併發比較高。Memstore採用跳錶結構,HFile使用LSM樹。

存儲過程

查詢

先看看爲什麼HBase存儲大量數據還可以這麼快的查詢速度,如下圖,META表中存儲的是按照有序保存的row key分段區間對應的region位置,ROOT中又是存儲的對應META表的位置,這兩個表也是作爲特殊表保存在HBase中,這樣通過兩級表查找,最多只需要三次跳轉就可以定位任意一個Region,每個region中只需要查找指定列族對應的HFile按照行鍵即可快速查找有序數據

兩級表查找

另外HBase中都是二進制存儲偏移,便於快速定位,且最近查找的數據都是緩存在內存中,進一步加快了查找效率。關於查詢速度估算也可以參考這篇文章

寫入

如下hbase寫入數據時,首先寫到內存memstore中,然後再溢寫到磁盤文件HFile中,這樣可以保證較高的寫入速度,每次寫內存前會先寫WAL(Writing Ahead Log,即HLog),類似關係數據庫InnoDB的redo log,保證崩潰時可以恢復已經寫入的數據(Crash-safe)。

hbase寫入

MemStore內存每次溢寫到磁盤時,不會直接寫入原來的HFile,而是會寫入新的小HFile中,這樣避免了文件鎖的問題,支持較高併發,實際在後臺有線程會處理當前小HFile的合併,這也是利用LSM樹合併非常快的優點。可以看到這裏行鍵分佈均勻很重,可以防止傾斜;另外應當減小寫入頻率,提升單次寫入量(批量導入)才能降低磁盤文件操作的壓力。

刪除

如果直接刪除磁盤數據,那麼IO壓力很大,肯定有問題。HBase磁盤採用墓碑標記的刪除方式————即先標記對應記錄刪除,如下具體在單個HFile過小合併(Compaction)時纔會發生真正的合併,此時纔會執行數據的刪除。

hbase刪除

那麼這就要注意頻繁刪除可能導致IO高和數據膨脹問題(可依賴TTL刪除)。

原創,轉載請註明來自

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章