加油,奥利给!
。这是励志网红冬泳怪鸽
的口头禅。这位怪蜀黍喜欢冬泳,照顾一个智力障碍的弟弟。但是他并没有烦恼,而是坚持在凌晨4点起来做直播。这位正能量大叔面对生活的艰辛和困苦,没有被打败,给我们传递了正能量。我们现在只是吃点学习的苦算不了什么。今天我们继续来介绍patternrange分区算法。
1.hash分区算法
2.stringhash分区算法
3.enum分区算法
4.numberrange分区算法
5.patternrange分区算法
6.date分区算法
7.jumpstringhash算法
<tableRule name="rule_pattern">
<rule>
<columns>id</columns>
<algorithm>func_pattern</algorithm>
</rule>
</tableRule>
<!-- pattern partition -->
<!--mapFile must contains all value of 0~patternValue-1,key and value must be Continuous increase-->
<function name="func_pattern" class="PatternRange">
<property name="mapFile">partition-pattern.txt</property>
<property name="patternValue">1024</property>
<property name="defaultNode">0</property><!--contains string which is not number,router to default node-->
</function>
和之前的算法一样。需要在rule.xml中配置tableRule和function。
配置文件格式如下:
start1-end1=node1
start1-end2=node2
这个算法定义的是区间,比如start1-end1就是第一个区间,该区间的数据就落到node1分片里面。而start2-end2是第二个区间,这个区间的数据就落到node2分片里面。
注意事项
:这里有个注意的地方,上面配置文件已经写到了mapFile must contains all value of 0~patternValue-1。就是mapFile文件的这个区间里面必须包含0-patternValue-1。假设你的patternValue=1024,那么文件里面区间就必须设置0-1023范围,如果不设置就会报错ERROR 1064 (HY000): can't find any valid data node :test_patternvalue -> ID -> 1023
当启动的时候,会根据rule.xml中定义去读取mapfile。然后将文件中定义的各个范围加载到内存中形成映射表。例如下面的配置:
root@mycat ~# cat partition-pattern.txt
0-255=0
256-511=1
512-1023=2
如果有用户通过where查询id=2060的时候,就会访问这个patternrange算法。该算法就会把id这个分片字段的值2068拿出来求模,它是对patternValue
设置的值取模。
通过2060这个值对patternValue
取模,得到的值为12,然后根据映射表,12是在区间11-20之间的,因此数据将存放在物理分片dn2上面。
<tableRule name="rule_pattern">
<rule>
<columns>id</columns>
<algorithm>func_pattern</algorithm>
</rule>
</tableRule>
<function name="func_pattern" class="patternrange">
<property name="mapFile">partition-pattern.txt</property>
<property name="patternValue">1024</property>
<property name="defaultNode">0</property>
</function>
[root@mycat ~]# cat partition-pattern.txt
0-255=0
256-511=1
512-1023=2
<table name="test_patternvalue" primaryKey="id" rule="rule_pattern" dataNode="dn1,dn2,dn3"/>
我们插入了三条数据,分别是id=500,3000,-2。他们分别对1024进行求模。前面2个数字很简单,求模运算后得到500和952,然后根据配置的映射表,可以看到分别存放在dn2和dn3分片上面。最后一个是-2,-2取模在java中采用了truncate除法,计算的结果就是-2。而-2这个结果不在映射表中任何一个区间内,但是因为我们配置了defaultNode,因此,它会存放到dn1上。而如果我们不配置defaultNode的话,这里插入就会报错。
和上一篇《数据库中间件分片算法之numberrange
》一样,当在map-file中配置区间出现重合的情况下,只会根据配置文件中最先定义的区间相对应的分片节点作为选择。
今天就介绍到这儿,今天的算法和numberrange相似,不同点在于是多了一个取模。而java的取模采用了truncate除法。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。