由於業務的發展,使用mysql進行建立索引進行搜尋已經造成資料流的瓶頸卡在了資料庫io,例如每次dump全表的時候,會造成壓力過大,造成耗時很長,而且目前的資料量基本上已經達到了億級的資料量,如果希望mysql能更好的提供服務,下一步必須考慮分庫分錶才可以;基於這種情況下,考慮使用hbase用來進行資料的存儲,因為hbase所能承受的資料量遠大於mysql,而且對列的擴展也很方便
在類似mysql,sqlserver,oracle等關係型資料庫,資料的儲存是按照行進行儲存的,如下圖所示:
但是在hbase裡面,所有的資料都是基於列進行儲存的,如下所示:
其中hbase的邏輯模型如下圖所示:
其中:com.cnn.ww對應的是rowkey,相當於mysql的主鍵的概念
contents,anchor:這兩個對應的是列族的概念,在物理的儲存上,同一個列族的資料儲存在相同檔案
cnnsi.com,mylook.ca:對應的是列族下面的列,在hbase中列是可以動態增加的
對應的方格數據表示的是單元數據,即對應rowkey,cf:column下面的具體的值
其中tn:表示的是時間戳,單元資料的不同版本
其中有一張儲存結構如下:
CRUD是資料庫的最基本也是最常用的操作,在hbase裡面也有對應的指令,例如建表語句對於mysql的在此不詳述,對於hbase shell的如下所示
create 'table','columnfamily'
#即可以建立一個名為table,列族為columnfamily的表,其他的一些blocksize,version資料為默認
讀取資料的時候,在hbase語句如:get 'table','row','cf:column'即可得到對應的資料
更新資料的時候,在hbase中沒有對應更新的概念,只是會有一個新的版本,從時間戳上可以體現出來,所用的語句為
put 'table','row','cf:name','value '
即可將value的值賦給對應cf列族,name的列
刪除資料的區別,在mysql中刪除資料只能是直接刪除一行,或是將某一列置為空,在hbase裡面可以直接刪除某一列
在mysql中可以建立索引,或是過濾查詢,但是在hbase中,只支援依照rowkey進行查詢速率最快
關係型資料庫的歷史已經很久,但是當資料量膨脹之後,例如對於mysql資料庫,當資料量為上億或更多的時候,如果按照索引進行查詢,可能效果也不是特別的明顯,最後只能按照主鍵進行查詢,或者逐漸發展為分庫分錶的模式,但是分庫分錶又給運維以及使用帶來了很大的麻煩;於是這個時候,nosql資料庫主鍵發展,nosql簡稱not only sql,是在資料量暴增的當前逐漸發展壯大起來,以nosql裡面的hbase作為例子,支持TB以及PB的數據,並且列的擴充特別的彈性
其實hbase可以看做是mysql分庫分錶後的結果,只是不同的是mysql分庫分表後支援索引等,但是對於hbase僅支援rowkey作為主鍵索引,從書中可以知道,hbase的資料是按照列進行儲存的,並且當資料過大的時候,會按照行進行分裂,如下如所示:
把不同的region放到了不同的機器,並且最後還有master進行管理,即相當於對行列進行了一個劃分,從而儲存大量的資料
在mysql會有一些聯合索引的情況,例如存在一個商品與分類對應關係的表,需要得到某一個商品的所有分類,也希望可以得到某一個分類的所有商品,在mysql中直接按照聯合索引可以達到要求,但是在hbase的時候只能按照rowkey查詢如何辦呢
經過閱讀相關的資料得到有以下兩種的解決方法
在hbase中,允許行跟行之間的列是不同的,只要有共同的列族即可,那麼對於上述的情況,可以建立一個按照分類為rowkey的寬表,如下所示
分類id ,作為rowkey
product_id,作為列名字
value儲存為是否刪除
##只要scan以1開頭的行,就可以得到所有的資料
上述兩種辦法從本質上來說,都是建構了一個二級索引來儲存資料
# 以上就是資料從mysql遷移到hbase的一些思考及設計的內容,更多相關內容請關注PHP中文網(www.php. cn)!