MyCat中常见的几种分片策略
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,代表有3台服务器组成集群参与分片,id % 3得到的值是0,1,2,所以就会被分别分片到服务器1,服务器2,服务器3上。
取模分片的优点是分片比较均匀,不会像范围分片那样数据比较集中。
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,实现原理是针对某一个字符串进行截取,得到的子字符串必须为数值类型,然后通过子字符串进行分片。需要指定0和2以及3,0,startIndex代表开始截取的字符串位置,size代表需要截取的长度,partitionCount代表分片数量,defaultPartition表示没有找到对应分片的时候默认存放到指定位置的分片。
6. 固定Hash分片
rule.xml中没有直接记录name,可以自定义,使用到的类是io.mycat.route.function.PartitionByLong,对分片字段进行与1023的二进制(也就是1111111111)进行"&"运算,得到的值必然在0-1023之间,然后分配到指定分片。需要配置的是2,1和256,512,满足2×256 + 1×512 = 1024这种格式,这里代表的是0-255分配到第一分片,256-511分配到第二分片,512-1023分配到第三分片,满足n1×range1 + n2×range2 + ... + nN×rangeN = 1024即可。需要注意的是partitionCount和partitionLength的数量必须一一对应。
7. 字符串Hash分片
配置文件中还没有记录,可以自定义,使用的类是io.mycat.route.function.PartitionByString, 通过获取字符串的二进制值,与1023进行"&"运算然后分配到指定分片,和固定Hash分片原理相似。
8. 日期分片
配置文件中还没有记录,可以自定义,使用的类是io.mycat.route.function.PartitionByDate,需要配置的是yyyy-MM-dd,2022-01-01,2022-01-20,10,其中dateFormat指的是日期格式,sBeginDate是开始时间,sEndDate是结束时间,sPartionDay指的是按n天进行分片。比较需要注意的是,【(结束时间-开始时间)/分片天数】的计算结果是分片数,实际的分片数必须要有足够的分片才行,也就是说01.01-01.10分到第一分片,01.11-01.20分到第二分片,如果此时结束时间不是01.20,而是01.30,那就没有足够的分片来存放01.21-01.30的数据。如果满足分片要求,sEndDate之后的时间会循环分配,也就是说01.21-01.30的分到第一分片,01.31-02.09的分到第二分片,02.10-02.19的又分配到第一分片,如此下去。
9. 自然月分片
tableRule的name是sharding-by-month,使用的类是io.mycat.route.function.PartitionByMonth,原理和日期分片相似,但是自然月分片的话不是按固定30或者31天来分,而是1月分一块,2月分一块这样子。同样的,【结束时间-开始时间】得到的月份数就是分片数量,分片服务器不能小于这个数。
#数据人的面试交流地##面试被问“你的缺点是什么?”怎么答##我在牛爱网找对象#