01.06 数据库中间件分片算法之enum

今天我们学习的是enum分片算法。

1.hash分区算法

2.stringhash分区算法

3.enum分区算法

4.numberrange分区算法

5.patternrange分区算法

6.date分区算法

7.jumpstringhash算法

enum分区算法的配置

<code><tablerule>
<rule>
<columns>code/<columns>
<algorithm>func_enum/<algorithm>
/<rule>
/<tablerule>

<function>
<property>partition.txt/<property>
<property>0/<property>
<property>0/<property>
/<function>/<code>

enum和之前的hash算法一样。需要在rule.xml中配置tableRule和function。

tableRule标签,name对应的是规则的名字,而rule标签中的columns则对应的分片字段,这个字段必须和表中的字段一致。algorithm则代表了执行分片函数的名字。function标签,name代表分片算法的名字,算法的名字要和上面的tableRule中的标签相对应。class:指定分片算法实现类。property指定了对应分片算法的参数。不同的算法参数不同。mapFile:指定配置文件名。其格式将在下面做详细说明。defaultNode:指定默认节点号。默认值为-1,不指定默认节点。type:指定配置文件中key的类型。0:整型; 其它:字符串。

mapfile文件格式配置如下:

a.type=0,

int1=node0

int2=node1

a.type=其他 string1=node0 string2=node1

1.启动加载配置

当启动的时候,会先根据type的值判断是字符串还是数字。然后把mapfile中配置的值加载到内存中,形成一个映射表。 例如上面的配置中type=0,就可以判断是数字,然后查看mapFile对应的文件partition.txt,可以查到:

10000=0

10010=1

也就是枚举值10000,就存放在分片1上,而枚举值10010,就存放在分片2上。

2.运行过程

当在运行的过程中,如果有用户通过查询code=10000或者是code=10001的时候,就会访问这个枚举算法。根据上面的映射表直接查询得到分片的编号。

3.我们建表来测试一下。

通过创建test_enum表,我们插入三条数据,分别是code=10000,10010,10020,可以看到10000被存放在分片1上,10010被存放在分片2上。这个和我们在partition.txt中配置的文件一样。当我们插入10020的时候,因为枚举值不存在,它会选择默认的分片节点dn1。这里不会因为错误而报错。

枚举在使用的时候,需要把已知的全部罗列出来。但是也有劣势,就是可能罗列不全,在这个时候把不在枚举定义范围的数字存放到默认节点是一个没有办法的办法,如果突然因为某个新版本上线,出现一些新的枚举类型而没有及时更新,会导致默认节点数据快速膨胀。此时就需要进行扩容,然后实现局部数据迁移。