hash算法_数据库中间件分片算法之hash
前言
夜深人靜的時(shí)候,打開(kāi)云音樂(lè),點(diǎn)上一曲攀登,帶上真無(wú)線藍(lán)牙耳機(jī),瞬間燃到爆,鍵盤打字如飛倦意全無(wú)。
分片規(guī)則
這幾天有人問(wèn)我,dble和MyCat到底有什么不同。其實(shí)dble作為MyCAT的同門,吸收了MyCat的精華,同時(shí)也相應(yīng)的做了一些減法。只支持MySQL顯得更加的純粹。所以選擇對(duì)比學(xué)習(xí)兩者我覺(jué)得挺好。
前面我們學(xué)習(xí)了schema.xml文件的配置,我們能獨(dú)立的把邏輯庫(kù)和邏輯表搭建起來(lái),讓數(shù)據(jù)表跟隨我們的定義規(guī)則(取模)進(jìn)行分布。今天我們介紹具體的分片算法。dble相對(duì)于mycat來(lái)說(shuō),是做了一些減法的。比如一致hash算法就沒(méi)有,而是使用了jumpstringhash代替了一致性hash。具體原因可以參考文章dble 沿用 jumpstringhash,移除 Mycat 一致性 hash 原因
HASH分區(qū)算法
Hash分區(qū)算法是一種比較典型而且常用的算法。要使用HASH分區(qū)算法需要在rule.xml中定義兩個(gè)部分。
分區(qū)規(guī)則定義
如下所示,使用tableRule標(biāo)簽定義,name對(duì)應(yīng)的是規(guī)則的名字,而rule標(biāo)簽中的columns則對(duì)應(yīng)的分片字段,這個(gè)字段必須和表中的字段一致。algorithm則代表了執(zhí)行分片函數(shù)的名字。
<tableRule name="auto-sharding-long"> <rule> <columns>id</columns> <algorithm>rang-long</algorithm> </rule> </tableRule>分區(qū)算法定義
如下所示,使用function標(biāo)簽定義分區(qū)算法,name代表算法的名字,算法的名字要和上面的tableRule中的標(biāo)簽相對(duì)應(yīng)。class:指定分區(qū)算法實(shí)現(xiàn)類。property指定了對(duì)應(yīng)分區(qū)算法的參數(shù)。不同的算法參數(shù)不同。
<function name="rang-long"" class="com.actiontech.dble.route.function.AutoPartitionByLong"> <property name="mapFile">auto-sharding-long.txt</property> ... </function>先看一下hash分區(qū)的定義。function的中的class屬性需要設(shè)置為hash或者com.actiontech.dble.route.function.PartitionByLong規(guī)則。然后分區(qū)算法對(duì)應(yīng)參數(shù)是partitionCount和partitionLength。
<function name="hashLong" class="hash"> <property name="partitionCount">C1[,C2, ...Cn]</property> <property name="partitionLength">L1[,L2, ...Ln]</property> </function>- partitionCount:指定分區(qū)的區(qū)間數(shù),具體為 C1 [+C2 + ... + Cn]
- partitionLength:指定各區(qū)間長(zhǎng)度,具體區(qū)間劃分為 [0, L1), [L1, 2L1), ..., [(C1-1)L1, C1L1), [C1L1, C1L1+L2), [C1L1+L2, C1L1+2L2), ... 其中,每一個(gè)區(qū)間對(duì)應(yīng)一個(gè)數(shù)據(jù)節(jié)點(diǎn)。
測(cè)試Hash分區(qū)算法
1.在啟動(dòng)的時(shí)候,兩個(gè)數(shù)組點(diǎn)乘做運(yùn)算,得到取模數(shù)。
2.兩個(gè)數(shù)組進(jìn)行叉乘,得出物理分區(qū)表。
3.根據(jù)where條件的值來(lái)落入實(shí)際分片
select * from shareding_key = 999;先根據(jù)分片鍵取出999,按照公式1的計(jì)算結(jié)果除取摸,然后得到的值落到2計(jì)算出來(lái)的分片中。
4.舉個(gè)簡(jiǎn)單的例子:
<property name="partitionCount">2,3</property> <property name="partitionLength">100,50</property>根據(jù)公式1:
也就是傳進(jìn)來(lái)的值需要對(duì)350取模。 根據(jù)公式2: 物理分區(qū)為
999對(duì)350取模,正好是299。落在[250-300]這個(gè)區(qū)間里面。也就是第4個(gè)區(qū)間。 接下來(lái)我們實(shí)際來(lái)測(cè)試一下,我們?cè)趓ule.xml中設(shè)置如下:
<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>我們通過(guò)公式2算出有5個(gè)分片。所以在schema.xml中設(shè)置table屬性如下:
<table name="hash_test" primaryKey="id" rule="rule_hash" dataNode="dn1,dn2,dn3,dn4,dn5"/>5.創(chuàng)建表測(cè)試
我們先使用shell創(chuàng)建1000行數(shù)據(jù),在創(chuàng)建表,通過(guò)load data語(yǔ)法將我們shell產(chǎn)生的文件進(jìn)行導(dǎo)入。
for i in {1..1000} do echo $i'|name'$[i]'' >>a1.txt done
這里可以看到我們查詢999這個(gè)數(shù)據(jù),會(huì)自動(dòng)到dn4這個(gè)分片上進(jìn)行查詢。再比如我們查500,500對(duì)350取模是150,150是落在第二個(gè)分區(qū)里面的。
6.另一個(gè)例子
<property name="partitionCount">2</property> <property name="partitionLength">1000</property>此時(shí)C* L=2*1000=2000,將對(duì)2000進(jìn)行取模。 同時(shí)將劃分如下的分區(qū):
注意事項(xiàng)
最后:
上面都是自己整理好的!我就把資料貢獻(xiàn)出來(lái)給有需要的人!順便求一波關(guān)注。
學(xué)習(xí)我們是認(rèn)真的,拿大廠offer是勢(shì)在必得的。java(想了解更多點(diǎn)一下哦)
作者:Buddyyuan
鏈接:https://juejin.im/post/5e0a2b16518825495a1e78f6
總結(jié)
以上是生活随笔為你收集整理的hash算法_数据库中间件分片算法之hash的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: win10开机慢怎么解决_细说Win10
- 下一篇: truncate table 非常慢_你