夜深人靜的時候,打開雲音樂
,點上一曲攀登
,帶上真無線藍牙耳機,瞬間燃到爆,鍵盤打字如飛倦意全無。node
這幾天有人問我,dble和MyCat到底有什麼不一樣。其實dble做爲MyCAT的同門,吸取了MyCat的精華,同時也相應的作了一些減法。只支持MySQL顯得更加的純粹。因此選擇對比學習二者我以爲挺好。算法
前面咱們學習了schema.xml文件的配置,咱們能獨立的把邏輯庫
和邏輯表
搭建起來,讓數據表跟隨咱們的定義規則(取模)進行分佈。今天咱們介紹具體的分片算法。dble
相對於mycat
來講,是作了一些減法的。好比一致hash算法就沒有,而是使用了jumpstringhash
代替了一致性hash。具體緣由能夠參考文章dble 沿用 jumpstringhash,移除 Mycat 一致性 hash 緣由
shell
hash分區算法
Hash分區算法是一種比較典型並且經常使用的算法。要使用HASH分區算法須要在rule.xml中定義兩個部分。數組
以下所示,使用tableRule
標籤訂義,name對應的是規則的名字,而rule
標籤中的columns
則對應的分片字段,這個字段必須和表中的字段一致。algorithm
則表明了執行分片函數的名字。函數
<tableRule name="auto-sharding-long"> <rule> <columns>id</columns> <algorithm>rang-long</algorithm> </rule> </tableRule>
以下所示,使用function
標籤訂義分區算法,name表明算法的名字,算法的名字要和上面的tableRule中的<algorithm>標籤相對應。class
:指定分區算法實現類。property
指定了對應分區算法的參數。不一樣的算法參數不一樣。學習
<function name="rang-long" class="com.actiontech.dble.route.function.AutoPartitionByLong"> <property name="mapFile">auto-sharding-long.txt</property> ... </function>
partitionCount
:指定分區的區間數,具體爲 C1 +C2 + ... + CnpartitionLength
:指定各區間長度,具體區間劃分爲 [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>
根據公式13d
也就是傳進來的值須要對350取模。code
根據公式2,物理分區爲xml
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,把桌面和終端完美結合成二次元是標配。
這裏能夠看到咱們查詢999這個數據,會自動到dn4這個分片上進行查詢。再好比咱們查500,500對350取模是150,150是落在第二個分區裏面的。
<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。後續將繼續分享其餘的算法。謝謝支持!