資料從mysql遷移到hbase的一些思考及設計

黄舟
發布: 2017-03-02 16:45:52
原創
1390 人瀏覽過

一、進行遷移的原因

由於業務的發展,使用mysql進行建立索引進行搜尋已經造成資料流的瓶頸卡在了資料庫io,例如每次dump全表的時候,會造成壓力過大,造成耗時很長,而且目前的資料量基本上已經達到了億級的資料量,如果希望mysql能更好的提供服務,下一步必須考慮分庫分錶才可以;基於這種情況下,考慮使用hbase用來進行資料的存儲,因為hbase所能承受的資料量遠大於mysql,而且對列的擴展也很方便

二、關係型資料庫與Nosql的一些區別

(1)儲存方式的區別

在類似mysql,sqlserver,oracle等關係型資料庫,資料的儲存是按照行進行儲存的,如下圖所示:


但是在hbase裡面,所有的資料都是基於列進行儲存的,如下所示:


其中hbase的邏輯模型如下圖所示:


其中:com.cnn.ww對應的是rowkey,相當於mysql的主鍵的概念

contents,anchor:這兩個對應的是列族的概念,在物理的儲存上,同一個列族的資料儲存在相同檔案

cnnsi.com,mylook.ca:對應的是列族下面的列,在hbase中列是可以動態增加的

對應的方格數據表示的是單元數據,即對應rowkey,cf:column下面的具體的值

其中tn:表示的是時間戳,單元資料的不同版本

其中有一張儲存結構如下:



(2)CRUD一些差異

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裡面可以直接刪除某一列

(3)索引的區別

在mysql中可以建立索引,或是過濾查詢,但是在hbase中,只支援依照rowkey進行查詢速率最快

(4)從mysql到nosql的發展的思考

關係型資料庫的歷史已經很久,但是當資料量膨脹之後,例如對於mysql資料庫,當資料量為上億或更多的時候,如果按照索引進行查詢,可能效果也不是特別的明顯,最後只能按照主鍵進行查詢,或者逐漸發展為分庫分錶的模式,但是分庫分錶又給運維以及使用帶來了很大的麻煩;於是這個時候,nosql資料庫主鍵發展,nosql簡稱not only sql,是在資料量暴增的當前逐漸發展壯大起來,以nosql裡面的hbase作為例子,支持TB以及PB的數據,並且列的擴充特別的彈性

(5)hbase為什麼可以儲存海量的資料呢

其實hbase可以看做是mysql分庫分錶後的結果,只是不同的是mysql分庫分表後支援索引等,但是對於hbase僅支援rowkey作為主鍵索引,從書中可以知道,hbase的資料是按照列進行儲存的,並且當資料過大的時候,會按照行進行分裂,如下如所示:



把不同的region放到了不同的機器,並且最後還有master進行管理,即相當於對行列進行了一個劃分,從而儲存大量的資料

三、資料遷移遇到的一些問題

(1)聯合索引的問題

在mysql會有一些聯合索引的情況,例如存在一個商品與分類對應關係的表,需要得到某一個商品的所有分類,也希望可以得到某一個分類的所有商品,在mysql中直接按照聯合索引可以達到要求,但是在hbase的時候只能按照rowkey查詢如何辦呢

經過閱讀相關的資料得到有以下兩種的解決方法

1、建立寬表

在hbase中,允許行跟行之間的列是不同的,只要有共同的列族即可,那麼對於上述的情況,可以建立一個按照分類為rowkey的寬表,如下所示

分類id ,作為rowkey

product_id,作為列名字

value儲存為是否刪除


##上述即可rowkey為分類id ,可以直接從row得到所有的product_id,然後自己過濾是否刪除

2、建立高表

什麼是建立高表呢,也就是說不需要那麼多的列,只是儲存多行,因為在hbase裡面是按照字典順序排序的,因此可以進行如下的設計

分類id_商品id,作為rowkey


##只要scan以1開頭的行,就可以得到所有的資料

上述兩種辦法從本質上來說,都是建構了一個二級索引來儲存資料


# 以上就是資料從mysql遷移到hbase的一些思考及設計的內容,更多相關內容請關注PHP中文網(www.php. cn)!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板