HBase數據庫相關知識
1、 HBase相關概念模型
l 表(table),與關系型數據庫一樣就是有行和列的表
l 行(row),在表里數據按行存儲、行由行鍵(rowkey)唯一標識,沒有數據類型統一為byte[]數組
l 列族(column family),行里的數據按列族分組String類型,每個表必須至少有一個列族
l 列限定符(column qualifier),列族里的數據用列限定符定位。類似關系型數據庫里面的列,不必事前定義,沒有數據類型同樣是byte[]數組
l 單元(cell),單元值我們真實存儲的數據(value),沒有數據類型byte[]數組
l 時間版本(version),單元值有時間版本,時間版本用時間戳標識long類型(默認保留3個數據版本)
2、 數據存儲模型
Hbase集群數據存儲底層使用HDFS保障數據容錯(一個節點宕機負責遷移數據到另外節點保證數據一致),多機器分布式存儲(下圖為一個機器節點存儲示意圖)
每個Hbase服務host主機被HDFS視為一個DataNode(數據節點)每個數據節點有一個RegionServer(區域服務)負責讀寫服務。
3、 表存儲分區
下圖是一張表在Hbase中存儲的數據分割,數據通過行鍵(rowkey)進行數據分割到不同Regionserver(如果行鍵是有一定規則的Hbase一般不會負載分發數據,一般會將行鍵原始值進行MD5或哈希散列計算之后作為行鍵存儲)
4、 表中各元素關系
一個表中可以有多個列族,但不宜太多(有待考究)一般是3~5個左右。其中類某些列族里面的數據可以一對多的關系,兩個列族之間互不影響(見下圖)
5、 Hbase數據物理存儲與邏輯表結構及數據版本的關系
Hbase的張表是一個目錄,下面是列族目錄,不同的列族在存儲路徑上互不影響,一個列族內的數據存儲在一個HFile上面。
每個列族內的每一列的每個cell數據都有自己的版本(Hbase默認保存3個版本的數據,可設置)。
插入新數據作為數據(value)的第一個版本(如不指定時間戳版本Hbase自動生成)。
更新數據不會再原有數據上做更新,同插入數據一樣,只不過在之前版本的前面(邏輯上)獲取新的時間戳(version)。
讀取數據的時候一般讀取倒序第一行就是后插入的數據,同時也可以讀取之前保存的版本數據。
刪除數據不會馬上真實的刪除存儲的數據,只是對要刪除的數據進行標記(不會被查詢到),等待HFile數據合並的時候進行一起刪除。
下圖為鍵值關系及版本示意圖
要想定位 “張三” 需要 行鍵,列族,列,時間戳(version)定位到。
6、 HBase優勢
通過上面簡單了解HBase有如下特點
- 非常突出“列”的概念,null值不占空間
- 每張表只能有一個索引,就是行鍵(rowkey)
- 列族可以標識一類列,兩個列族之間互不影響
- 存在多個數據版本
- 更新和刪除操作比較特殊
- 數據結構無限制
通過特點有一下優勢
- 吞吐量高
- 隨機讀非常快(按rowkey讀取)
- 集群容錯好
- 橫向擴展方便,適合長期存儲
劣勢
1. 不支持二級索引
2. HFile數據文件合並或拆分會對服務可用性造成一定影響
3. 行鍵(rowkey)實際使用需要進行良好設計
4. 很難進行模糊查詢和部分數據提取
7、 針對不足一些方案
針對不支持二級索引的可以使用另一張表進行二級索引存儲或使用redis進行二級索引存儲。
HFile數據合並或拆分在業務閑時進行操作
行鍵根據實際業務需求進行設計