夜深人靜的時候,打開雲音樂
,點上一曲攀登
,帶上真無線藍牙耳機,瞬間燃到爆,鍵盤打字如飛倦意全無。node
這幾天有人問我,dble和MyCat到底有什麼不一樣。其實dble做爲MyCAT的同門,吸取了MyCat的精華,同時也相應的作了一些減法。只支持MySQL顯得更加的純粹。因此選擇對比學習二者我以爲挺好。mysql
前面咱們學習了schema.xml文件的配置,咱們能獨立的把邏輯庫
和邏輯表
搭建起來,讓數據表跟隨咱們的定義規則(取模)進行分佈。今天咱們介紹具體的分片算法。dble
相對於mycat
來講,是作了一些減法的。好比一致hash算法就沒有,而是使用了jumpstringhash
代替了一致性hash。具體緣由能夠參考文章dble 沿用 jumpstringhash,移除 Mycat 一致性 hash 緣由
算法
hash分區算法
Hash分區算法是一種比較典型並且經常使用的算法。要使用HASH分區算法須要在rule.xml中定義兩個部分。sql
以下所示,使用tableRule
標籤訂義,name對應的是規則的名字,而rule
標籤中的columns
則對應的分片字段,這個字段必須和表中的字段一致。algorithm
則表明了執行分片函數的名字。shell
<tableRule name="auto-sharding-long">
<rule>
<columns>id</columns>
<algorithm>rang-long</algorithm>
</rule>
</tableRule>
複製代碼
以下所示,使用function
標籤訂義分區算法,name表明算法的名字,算法的名字要和上面的tableRule中的標籤相對應。class
:指定分區算法實現類。property
指定了對應分區算法的參數。不一樣的算法參數不一樣。數組
<function name="rang-long"" class="com.actiontech.dble.route.function.AutoPartitionByLong">
<property name="mapFile">auto-sharding-long.txt</property>
...
</function>
複製代碼
先看一下hash分區的定義。function的中的class屬性須要設置爲hash
或者com.actiontech.dble.route.function.PartitionByLong
規則。而後分區算法對應參數是partitionCount
和partitionLength
。bash
<function name="hashLong" class="hash">
<property name="partitionCount">C1[,C2, ...Cn]</property>
<property name="partitionLength">L1[,L2, ...Ln]</property>
</function>
複製代碼
partitionCount
:指定分區的區間數,具體爲 C1 [+C2 + ... + Cn]partitionLength
:指定各區間長度,具體區間劃分爲 [0, L1), [L1, 2L1), ..., [(C1-1)L1, C1L1), [C1L1, C1L1+L2), [C1L1+L2, C1L1+2L2), ... 其中,每個區間對應一個數據節點。= 函數
select * from shareding_key = 999;
複製代碼
先根據分片鍵取出999,按照公式1的計算結果除取摸,而後獲得的值落到2計算出來的分片中。學習
<property name="partitionCount">2,3</property>
<property name="partitionLength">100,50</property>
複製代碼
根據公式1:
也就是傳進來的值須要對350取模。
根據公式2:
物理分區爲
999對350取模,正好是299。落在[250-300]這個區間裏面。也就是第4個區間。
接下來咱們實際來測試一下,咱們在rule.xml中設置以下:測試
<tableRule name="rule_hash">
<rule>
<columns>id</columns>
<algorithm>func_hash_test</algorithm>
</rule>
</tableRule>
<function name="func_hash_test" class="Hash">
<property name="partitionCount">2,3</property>
<property name="partitionLength">100,50</property>
</function>
複製代碼
咱們經過公式2算出有5個分片。因此在schema.xml中設置table屬性以下:
<table name="hash_test" primaryKey="id" rule="rule_hash" dataNode="dn1,dn2,dn3,dn4,dn5"/>
複製代碼
咱們先使用shell建立1000行數據,在建立表,經過load data語法將咱們shell產生的文件進行導入。
for i in {1..1000}
do
echo $i'|name'$[i]'' >>a1.txt
done
複製代碼
請原諒我做爲一個GEEK,把桌面和終端完美結合成二次元是標配。
<property name="partitionCount">2</property>
<property name="partitionLength">1000</property>
複製代碼
此時C* L=2*1000=2000,將對2000進行取模。
同時將劃分以下的分區:
partition size : 5 > table datanode size : 4 please make sure table datanode size = function partition size
今天學習了分片算法Hash。後續將繼續分享其餘的算法。謝謝支持!