架構(gòu)師必備:HBase行鍵設(shè)計與應(yīng)用

首先要回答一個問題,為何要使用HBase?
隨著業(yè)務(wù)不斷發(fā)展、數(shù)據(jù)量不斷增大,MySQL數(shù)據(jù)庫存在這些問題:

  • MySQL支持的數(shù)據(jù)量為TB級,不能一直保留歷史數(shù)據(jù)。而HBase支持的數(shù)據(jù)量為PB級,適合存儲久遠(yuǎn)的歷史冷數(shù)據(jù)
  • 新增列的代價較高,數(shù)據(jù)量越大耗費時間越長。而HBase可以隨意增加列,空列不占據(jù)空間,業(yè)務(wù)模型可以靈活變化

要使用HBase,最重要的一點是rowkey行鍵設(shè)計,如果設(shè)計不妥,后續(xù)要改的代價非常大。

HBase行鍵設(shè)計原則

下面列幾個HBase rowkey設(shè)計的原則:

  • 組合鍵:組合鍵是指拼接多個業(yè)務(wù)字段,如需查詢,則業(yè)務(wù)字段必須作為rowKey的一部分
  • 字段順序:一對多,則一應(yīng)該放在前面,以便能夠scan得到結(jié)果,如用戶id:訂單id,如果反過來則無法得到用戶下的所有訂單
  • 業(yè)務(wù)字段對齊長度:因為rowKey是按字典序排列的,所以需要對齊長度,比如id取12位,9位id前補齊3個0,否則就會出現(xiàn)123456789比654321比排在前面的問題。對齊長度后,000000654321排在000123456789之前,符合預(yù)期
  • 打散以避免熱點:id與時間有關(guān),隨時間遞增,如果不做處理可能導(dǎo)致部分節(jié)點有讀寫熱點,加上前綴可以打散,如取 業(yè)務(wù)id的后幾位 % region個數(shù) 作為rowKey的前綴

HBase應(yīng)用舉例

冷熱數(shù)據(jù)分離

image.png
  • HBase適合作為冷數(shù)據(jù)存儲,存儲和查詢海量歷史數(shù)據(jù)
  • MySQL適合作為熱存儲存儲,支持?jǐn)?shù)據(jù)讀寫、事務(wù)操作
  • 歸檔近期未更新的歷史數(shù)據(jù),新增數(shù)據(jù)至HBase,再刪除MySQL記錄

流水記錄

image.png
  • 流水記錄可隨時新增字段
  • 適合存儲海量流水記錄

簡要回顧HBase架構(gòu)

image.png
  • region:所有行按rowkey字典序排列,region是其中一部分,相當(dāng)于分片,每個region只能在一個region server上
  • region server:可以包含一到多個region,調(diào)用HDFS的客戶端接口對region所有數(shù)據(jù)進(jìn)行讀寫操作
  • WAL:預(yù)寫日志,WAL是Write-Ahead Log的縮寫。預(yù)先寫入,WAL是一個保險機制,數(shù)據(jù)在寫到Memstore之前,先被寫到WAL了。這樣當(dāng)故障恢復(fù)的時候可以從WAL中恢復(fù)數(shù)據(jù)
  • store:一個列族對應(yīng)一個store,因此為了提高性能,不建議使用超過2個列族。一個store包含一個memstore和多個HFile
  • memstore:數(shù)據(jù)寫入WAL之后就會被放入memstore,主要用于在內(nèi)存中對行做排序,排序完成后再寫入HFile
  • HFile:數(shù)據(jù)的存儲實體,memstore寫滿后就會寫入HFile
  • region自動分片(split)、合并(merge):region大小達(dá)到閾值后,會自動分區(qū),反之會做合并region的操作
  • HFile合并(compaction):刪除數(shù)據(jù)后會導(dǎo)致HFile變小,需要合并以減少HFile的數(shù)量,即減少碎片文件數(shù)量,提高尋址效率
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容