首先要回答一個問題,為何要使用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ù)量,提高尋址效率