MyCat的常见几种分片策略:范围分片,取模分片,Hash分片,枚举分配,子串分片,固定Hash分片,字符串Hash分片,日期分片,自然月分片。当然不仅于此,具体参考MyCat文档。
1. 范围分片
这是MyCat里面配置文件的默认分片方式,tableRule的name是auto-sharding-long,具体使用到的类是io.mycat.route.function.AutoPartitionByLong,通过在rule.xml中可以查询到配置文件的名称,默认是autopartition-long.txt,打开mycat的conf文件夹,可以看到有这个文件。文件内容如下
# range start-end ,data node index
# K=1000,M=10000.
0-500M=0
500M-1000M=1
1000M-1500M=2
很简单,就是需要配置3台服务器组成集群,其中id为0到5000000的数据放标识为0的服务器上,id为5000000到10000000的数据放标识为1的服务器上,id为10000000到15000000的数据放标识为2的服务器上。
这里面的配置可以修改,范围分片适用于id是数值类型的情况。
范围分片的优点是配置简单,逻辑简单,缺点就是很可能插入了一两百万条数据,结果全在一台服务器上,其他两台服务器是空着的,旱的旱死,涝的涝死。
2. 取模分片
tableRule的name是mod-long,用到了类是io.mycat.route.function.PartitionByMod, 需要配置为name为count的property参数,代表服务器数量。比如
取模分片的优点是分片比较均匀,不会像范围分片那样数据比较集中。
3. Hash分片
tableRule的name是sharding-by-murmur, 用到的类是io.mycat.route.function.PartitionByMurmurHash,需要配置为name为count的property参数,代表服务器数量。分片是通过计算数据id的Hash值,然后对服务器数量取模,分配到对应的服务器上,不要求分片字段是数值型。相同哈希因子计算值总是分配到同一分区,不会因为分区节点增加而改变分区位置。
4. 枚举分片
tableRule在rule.xml中没有配置,但是可以自定义name,使用到的类是io.mycat.route.function.PartitionByFileMap,还需要参考配置文件partition-hash-int.txt,里面记录了枚举的内容,默认如下:
10000=0
10010=1
当数据枚举字段为10000的时候分配到分片1上,10010时分配到分片2上,可以进行修改和增加,比如
0=0
1=1
2=2
5. 子串分片
rule.xml中没有直接记录name,可以自定义,使用到的类是io.mycat.route.function.PartitionDirectBySubString,实现原理是针对某一个字符串进行截取,得到的子字符串必须为数值类型,然后通过子字符串进行分片。需要指定
6. 固定Hash分片
rule.xml中没有直接记录name,可以自定义,使用到的类是io.mycat.route.function.PartitionByLong,对分片字段进行与1023的二进制(也就是1111111111)进行"&"运算,得到的值必然在0-1023之间,然后分配到指定分片。需要配置的是
7. 字符串Hash分片
配置文件中还没有记录,可以自定义,使用的类是io.mycat.route.function.PartitionByString, 通过获取字符串的二进制值,与1023进行"&"运算然后分配到指定分片,和固定Hash分片原理相似。
8. 日期分片
配置文件中还没有记录,可以自定义,使用的类是io.mycat.route.function.PartitionByDate,需要配置的是
9. 自然月分片
tableRule的name是sharding-by-month,使用的类是io.mycat.route.function.PartitionByMonth,原理和日期分片相似,但是自然月分片的话不是按固定30或者31天来分,而是1月分一块,2月分一块这样子。同样的,【结束时间-开始时间】得到的月份数就是分片数量,分片服务器不能小于这个数。