夜深人静的时候,打开云音乐
,点上一曲攀登
,带上真无线蓝牙耳机,瞬间燃到爆,键盘打字如飞倦意全无。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。后续将继续分享其余的算法。谢谢支持!