知識布局-redis-hbase
前言
數據結構是指相互之間存在著一種或多種關係的數據元素的集合和該集合中數據元素之間的關係組成。記為:
Data_Structure=(D,R)
其中D是數據元素的集合,R是該集合中所有元素之間的關係的有限集合。
上述文字是百度百科定義的數據結構。也就是說數據結構有兩個概念,一個是數據元素,一個是這些元素對應的關係。在數學中,空間的概念也類似。比如線性空間,就是由域和相應的代數關係組成的。
在學習hbase的時候,最常看到的是log structed merge tree;在學習elasticsearch的時候,最常看到的是Finite State Transducer,在學習redis的時候,最常看到的是一致性hash環。這樣的產品有很多。我們要想知道他們的特性,就必須要將這些底層的數據結構搞清楚。
目錄
1.redis slot的簡單介紹
2.hbase應用
3.總結
1.redis slot的簡單介紹
拿redis來說,目前的redis集群默認切割為16384個slot。在增加節點,刪除節點的時候,都會涉及到相應的slot的數據的遷移。下面我們就來說說redis的底層數據結構。
好奇的同學肯定會思考,redis如何來處理這個key到slot id的映射。這裡我就貼一下jedis-2.9.0的實現源碼:
為了簡化問題:
我們做如下的假設
1.假設slot一共5個,0,1,2,3,4
2.假設hash演算法就是直接求hashcode,然後%5
3.機器的id,取機器名稱求hashcode,然後%5(忽略實例,認為一個機器就是一個實例,真實情況比較複雜)
4.機器id和slot的關係,我們有如下定義
沿著下圖的環,找到一個機器節點,然後往逆時針方向遍歷,如果碰到機器,則遍歷結束。上面過程中遍歷到的節點,該節點對應的數據,都保存在該機器節點。
說明:上述假設會出現這樣的情況,5個slot,也就是說集群的最大規模是5台機器。一台機器對應一個slot。
假設就一台機器
那麼slot 0~4的數據全都存放在上面。
那麼slot 4 0 1保存在機器1上面,slot 2 3 保存在機器2上面。
從樣例1->樣例2,要是做成一個集群擴容的話,那麼就涉及到
1.集群添加機器
2.slot數據的遷移
從樣例2->樣例1,要是做成一個集群機器下線的話,就涉及到
1.slot數據的遷移
2.集群機器的刪除
這就是redis的數據模型的簡版。描述的不一定準確。如果做過hbase數據設計的人,估計會從中找到一些靈感。
2.hbase應用
在hbase中,我們經常會涉及到一個概念:預分區。
預分區的話,到底要分多少個分區呢?這個我們要好好支持一下。
先貼一個我兩年前畫的一個圖,不一定準確。
其實這個也涉及到了這個N,也就是hash取模的問題。
我們可以事先將這個N取為16384。
然後,將這16384水平切分成16份,每份1024的範圍。當業務量上來後,我們進行水平添加機器,然後,將一些大的region一分為2,滿足業務需求。
3.總結:
當知識從模稜兩可的狀態,變成越來越清晰的時候,我們可能會進行對比。當對比的次數多了之後,我們開始探究這個東西是什麼了。這算是一種學習方法吧。
推薦閱讀:
※大數據之 Hadoop 的資料庫 HBase 的架構的詳細講解
※《HBase實戰》第二章之數據模型問題集
※5-Hbase Rowkey設計
※HBase 入門筆記-數據落地篇