第一种分片规则 - 范围分片。只适用于数字类型的字段进行分片

 

rule = "auto-sharding-long"

 

根据指定的字段(默认是主键字段)及其配置的范围(默认是500万)与数据节点的对应情况,来决定该数据属于哪一个分片 例如: id值在0~500万,就存储在第一台分片服务器; id值在500万~1000万,就存储在第二台服务器; ...

 

如何指定是哪个字段 在/usr/local/mycat/conf目录的schema.xml文件找到如下。primaryKey表示根据什么字段(id)来分片。rule表示分片规则(rang-long)。

底层的是/usr/local/mycat/conf目录的rule.xml文件找到如下。columns表示根据什么字段(id)来分片。algorithm表示分片规则(rang-long)

 

如何指定范围分片的配置范围 在/usr/local/mycat/conf目录的autopartition-long.txt文件找到如下。M表示万,K表示千,即可修改范围

 

 

第二种分片规则 - 取模分片。只适用于数字类型的字段进行分片

 

rule = "mod-long"

 

根据指定的字段值与节点数量进行求模运算,根据运算结果,来决定该数据属于哪一个分片 例如: id值有0~7,也就是有5条数据。共有3台分片节点服务器。怎么判断哪个id值的数据会存到哪个节点服务器,如下 id为1的数据会存到第二台服务器,原因:1%3=1 id为2的数据会存到第三台服务器,原因:2%3=2 id为3的数据会存到第一台服务器,原因:3%3=0 id为4的数据会存到第二台服务器,原因:4%3=1 id为5的数据会存到第三台服务器,原因:5%3=2 id为6的数据会存到第一台服务器,原因:6%3=0 id为7的数据会存到第二台服务器,原因:7%3=1

 

如何指定是哪个字段 在/usr/local/mycat/conf目录的schema.xml文件找到如下。primaryKey表示根据什么字段(id)来分片。rule表示分片规则(mod-long)。

底层的是/usr/local/mycat/conf目录的rule.xml文件找到如下。columns表示根据什么字段(id)来分片。algorithm表示分片规则(mod-long)

 

如何指定求模的节点数量 在/usr/local/mycat/conf目录的rule.xml文件找到如下。修改property的数量即可

 

 

第三种分片规则 - 一致性hash。 适用于任何类型的字段进行分片

 

rule = "sharding-by-murmur"

 

根据指定字段的hash值来进行分片。所谓一致性哈希,指的是相同的哈希因子计算值总是被划分到相同的分区表中,不会因为分区节点的 增加而改变原来数据的分区位置。简单说就把id值是一样的、或者hash函数是一样的,那么数据就会被划分到同一台分片服务器,即使以后 增加了或减少了分片服务器,我们的数据是不会改变存储位置的(原来在哪个分片服务器,就在哪个分片服务器)

 

如何指定是哪个字段 在/usr/local/mycat/conf目录的rule.xml文件找到如下。columns表示根据什么字段(id)来分片。algorithm表示分片规则(murmur)

 

如何指定hash分片 在/usr/local/mycat/conf目录的rule.xml文件找到如下

 

 

具体演示

 

1、配置/usr/local/mycat/conf目录的schema.xml文件(我会打包放在模板文件里面)

 

2、配置/usr/local/mycat/conf目录的rule.xml、server.xml文件(我会打包放在模板文件里面)

 

3、在第一台服务器启动mycat

 

4、在第一、二、三台服务器创建guding数据库

 

5、在第一台服务器登录进mycat,并导入表结构和表数据

 

6、此时去datagrip软件,看我们的第一、二、三台服务器的hash数据库 会发现第一台服务器的tb_order表有相应数据 会发现第二台服务器的tb_order表有相应数据 会发现第三台服务器的tb_order表有相应数据 这些数据是按照一致性hash的规则,把数据分配到三台服务器

 

 

第四种分片规则 - 枚举分片。适用于按照省份、性别、状态拆分数据等业务

 

rule = "sharding-by-intfile-xxxx"

 

通过在配置文件中配置可能的枚举值,指定数据分布到不同数据节点服务器上

 

如何指定枚举值 在/usr/local/mycat/conf目录的rule.xml文件找到如下

底层的是/usr/local/mycat/conf目录的rule.xml文件找到如下

 

如何修改映射文件,即修改枚举值对应的分片节点 在/usr/local/mycat/conf目录的partition-hash-int.txt文件找到如下。语法: 枚举值=哪台分片服务器

表示如果数据的枚举值为1,那么就存储在第一台分片节点服务器; 枚举值为2就存储在第二台分片服务器; 枚举值为5就存储在第二台节点服 务器(因为上面我们指定了默认节点为2)

 

tip: 怎么指定枚举值以及对应的节点很简单,就看我们要导入什么数据,比如我们要导入一张tb_user表,表里面有一个字段是status,值要么 是0、要么是1、要么是3,那我们就可以把status字段的三个不同的只当做是枚举值,当某条数据的status为0,该数据就会存到第一台服务器, 当某条数据的status为1,该数据就会存到第二台服务器,当某条数据的status为2,该数据就会存到第三台服务器。

 

 

具体演示

 

1、配置/usr/local/mycat/conf目录的schema.xml文件(我会打包放在模板文件里面)

 

2、配置/usr/local/mycat/conf目录的rule.xml、server.xml、partition-hash-int.txt.txt文件(我会打包放在模板文件里面)

 

3、在第一台服务器启动mycat

 

4、在第一、二、三台服务器创建meiju数据库

 

5、在第一台服务器登录进mycat,并导入表结构和表数据

 

6、此时去datagrip软件,看我们的第一、二、三台服务器的meiju数据库 会发现第一台服务器的tb_order表有相应数据 会发现第二台服务器的tb_order表有相应数据 会发现第三台服务器的tb_order表有相应数据 这些数据是按照枚举的规则,把数据分配到三台服务器

 

 

第五种分片规则 - 应用指定算法

 

rule = "sharding-by-substring"

 

运行阶段由应用自主决定路由到哪个分片,直接根据字符字串(必须是数字)计算分片号。例如指定的字符串是0,该数据就会存储到 第一台服务器上,指定的字符串是1,该数据就会存储到第二台服务器上,指定的字符串是2,该数据就会存储到第三台服务器上

 

在/usr/local/mycat/conf目录的rule.xml文件添加如下

 

 

具体演示

 

1、配置/usr/local/mycat/conf目录的schema.xml文件(我会打包放在模板文件里面)

 

2、配置/usr/local/mycat/conf目录的rule.xml、server.xm文件(我会打包放在模板文件里面)

 

3、在第一台服务器启动mycat

 

4、在第一、二、三台服务器创建建zhiding数据库

 

5、在第一台服务器登录进mycat,并导入表结构和表数据

 

6、此时去datagrip软件,看我们的第一、二、三台服务器的meiju数据库 会发现第一台服务器的tb_app表有相应数据 会发现第二台服务器的tb_app表有相应数据 会发现第三台服务器的tb_app表有相应数据 这些数据是按照应用指定算法的规则,把数据分配到三台服务器

 

 

第六种分片规则 - 固定hash算法

 

rule = "sharding-by-long-hash"

 

该算法类似于十进制的求模运算,但是为二进制的操作。例如,取id值的二进制(十位)与1111111111进行与运算。 最后的与运算结果一定在0000000000~11111111111,转换成10进制就是0~1024 我们可以把结果为0~255范围的数据放到第一台服务器,256~511放到第二台服务器,512~1023放到第三台服务器, 超过1024就会存储到第一台服务器

 

特点:

1、如果是求模,连续的值,分别分配到各个不同的分片; 但是此算法会将连续的值可能分配到相同的分片,降低了事务处理的难度

2、可以均匀分配,也可以非均匀分配

3、分片字段(默认是id字段)必须为数字类型

 

在/usr/local/mycat/conf目录的rule.xml文件找到并修改为如下

在/usr/local/mycat/conf目录的rule.xml文件添加如下

 

 

具体演示

 

1、配置/usr/local/mycat/conf目录的schema.xml文件(我会打包放在模板文件里面)

 

2、配置/usr/local/mycat/conf目录的rule.xml、server.xm文件(我会打包放在模板文件里面)

 

3、在第一台服务器启动mycat

 

4、在第一、二、三台服务器创建建guding_hash数据库

 

5、在第一台服务器登录进mycat,并导入表结构和表数据

 

6、此时去datagrip软件,看我们的第一、二、三台服务器的guding_hash数据库 会发现第一台服务器的tb_longhash表有相应数据 会发现第二台服务器的tb_longhash表有相应数据 会发现第三台服务器的tb_longhash表有相应数据 这些数据是按照应用固定hash算法的规则,把数据分配到三台服务器

 

 

第七种分片规则 - 字符串hash解析

 

rule = "sharding-by-stringhash"

 

截取字符串中的指定位置的子字符串,进行hash算法,算出分片。上一种分片规则是直接用字段值(数字类型的)与1111111111(二进制)进行 与运算,然后根据算出来的结果来决定某个数据会存储到哪台服务器。这节课讲的这种分片规则是截取字段值(字符串类型的)其中的子字符串, 再把截取出来的子字符串先转换为hash值(数字类型的),然后再跟1111111111(二进制)进行与运算,然后根据算出来的结果来决定某个数据 会存储到哪台服务器

 

在/usr/local/mycat/conf目录的rule.xml文件添加如下

 

 

具体演示

 

1、配置/usr/local/mycat/conf目录的schema.xml文件(我会打包放在模板文件里面)

 

2、配置/usr/local/mycat/conf目录的rule.xml、server.xm文件(我会打包放在模板文件里面)

 

3、在第一台服务器启动mycat

 

4、在第一、二、三台服务器创建建zifuchuan_hash数据库

 

5、在第一台服务器登录进mycat,并导入表结构和表数据

 

 

6、此时去datagrip软件,看我们的第一、二台服务器的zifuchuan_hash数据库 会发现第一台服务器的tb_strhash表有相应数据 会发现第二台服务器的tb_strhash表有相应数据 这些数据是按照应用字符hash解析的规则,把数据分配到两台服务器

 

 

第八种分片规则 - 按天分片(也叫按日期分片)

 

rule = "sharding-by-date"

 

指定一段时间,在指定周期,产生的数据就存储到哪个分片服务器。例如0~30天,周期10,也就是0~10天产生的数据会存储放到第一台 服务器,10~20天产生的数据会存储在第二台服务器,20~30天产生的数据会存储在第三台服务器。 注意: 例如我们只有三台服务器,有0~30天的数据需要分片存储,那周期必须为10,必须要刚好分完。否则报错 在/usr/local/mycat/conf目录的rule.xml文件添加如下

 

 

具体演示

 

1、配置/usr/local/mycat/conf目录的schema.xml文件(我会打包放在模板文件里面)

 

2、配置/usr/local/mycat/conf目录的rule.xml、server.xm文件(我会打包放在模板文件里面)

 

3、在第一台服务器启动mycat

 

4、在第一、二、三台服务器创建建date_fenpian数据库

 

5、在第一台服务器登录进mycat,并导入表结构和表数据

 

注意数据必须要在这个范围内,如果插入3月的数据就会报错

 

6、此时去datagrip软件,看我们的第一、二、三台服务器的date_fenpian数据库 会发现第一台服务器的tb_datepart表有相应数据 会发现第二台服务器的tb_datepart表有相应数据 这些数据是按照按天分配的规则,把数据分配到三台服务器

 

 

第九种分片规则 - 自然月

 

rule = "sharding-by-month"

 

使用场景为按照月份来分片,每个自然月为一个分片。 例如1月的数据在第一台服务器存储,第2月在第二台,第3月在第三台,第4月在第一台,第5月在第二台,....,相当于前面的取模规则 注意:例如02-01 ~ 04-30,其中共三个自然月,那我们必须要有三台分片服务器,不然报错

 

在/usr/local/mycat/conf目录的rule.xml文件找到并修改为如下

 

 

具体演示

 

1、配置/usr/local/mycat/conf目录的schema.xml文件(我会打包放在模板文件里面)

 

2、配置/usr/local/mycat/conf目录的rule.xml、server.xm文件(我会打包放在模板文件里面)

 

3、在第一台服务器启动mycat

 

4、在第一、二、三台服务器创建建month_fenpian数据库

 

5、在第一台服务器登录进mycat,并导入表结构和表数据

 

注意,我们虽然设置的是2~4月,但是不在这个范围内的也是可以插入的 例如5月的数据会在第一台服务器,6月的会在第二台服务器,7月的会在第三台服务器,...

注意,我们的范围是2~4月,里面涉及到是三个自然月,所以必须要有三台服务器,不然mycat启动不了,也就是报错

 

6、此时去datagrip软件,看我们的第一、二、三台服务器的month_fenpian数据库 会发现第一台服务器的tb_monthpart表有相应数据 会发现第二台服务器的tb_monthpart表有相应数据 这些数据是按照按自然月分配的规则,把数据分配到三台服务器