rule.xml 里面就定义了我们对表进行拆分所涉及到的规则定义。我们可以灵活的对表使用不同的分片算法。这个文件里面主要有 tableRule 和 function 这两个标签。在具体使用过程中可以按照需求添加 tableRule 和 function。
-
tableRule 标签
#name为规则的唯一名称,用于标识不同的表规则
id #columns 为表示对表的哪个字段进行拆分
#algorithm 使用function标签中的name属性。连接表规则和具体路由算法。当然,多个表规则可以连接到同一个路由算法上。
table 标签内使用。让逻辑表使用这个规则进行分片
func1
-
function 标签
#name 指定算法的名字,供algorithm引用
#class 制定路由算法具体的类名字。
#property 为具体算法需要用到的一些属性。
partition-hash-int.txt
下面列举一些Mycat水平拆分表的常用规则:
- 枚举法
name
hash-int
partition-hash-int.txt
#type为type默认值为0,0表示mapFile中的枚举类型Integer,非零表示mapFile中的枚举类型String
1
#默认节点:小于0表示不设置默认节点,大于等于0表示设置默认节点,结点为指定的值(所有的节点配置都是从0开始,及0代表节点1),默认节点的作用:枚举分片时,如果碰到不识别的枚举值,就让它路由到默认节点,如果不配置默认节点(defaultNode值小于0表示不配置默认节点),碰到不识别的枚举值就会报错
0
partition-hash-int.txt 配置:
张飞=0
刘备=1
关羽=2
- 求模法
user_id
mod-long
#此种配置非常明确即根据id与count(你的结点数)进行求模预算,相比方式1,此种在批量插入时需要切换数据源,id不连续
3
- 日期列分区法
create_time
sharding-by-date
yyyy-MM-dd
#配置中配置了开始日期,分区天数,即默认从开始日期算起,分隔10天一个分区
2014-01-01
10
Assert.assertEquals(true, 0 == partition.calculate("2014-01-01"));
Assert.assertEquals(true, 0 == partition.calculate("2014-01-10"));
Assert.assertEquals(true, 1 == partition.calculate("2014-01-11"));
Assert.assertEquals(true, 12 == partition.calculate("2014-05-01"));
- 范围约定
user_id
rang-long
autopartition-long.txt
autopartition-long.txt
# range start-end ,data node index
# K=1000,M=10000.
0-500M=0
500M-1000M=1
1000M-1500M=2
或
0-10000000=0
10000001-20000000=1
- 通配取模
user_id
sharding-by-pattern
#patternValue 即求模基数
256
#defaoultNode 默认节点,如果不配置默认节点,则默认是0即第一个节点
2
partition-pattern.txt
partition-pattern.txt
# id partition range start-end ,data node index
###### first host configuration
#1-32 即代表id%256后分布的范围,如果在1-32则在分区1,其他类推,如果id非数字数据,则会分配在defaoultNode 默认节点
1-32=0
33-64=1
65-96=2
97-128=3
######## second host configuration
129-160=4
161-192=5
193-224=6
225-256=7
0-0=7
- 编程指定
user_id
sharding-by-substring
0
2
8
0
此方法为直接根据字符子串(必须是数字)计算分区号(由应用传递参数,显式指定分区号)。例如id=05-100000002,在此配置中代表根据id中从startIndex=0,开始,截取siz=2位数字即05,05就是获取的分区,如果没传默认分配到defaultPartition
- 字符串拆分hash解析
user_id sharding-by-stringhash #length代表字符串hash求模基数,其中length*count=1024 512 #count分区数,其中length*count=10242 #hashSlice hash预算位,即根据子字符串中int值 hash运算0:2 0 代表 str.length(), -1 代表 str.length()-1,大于0只代表数字自身 可以理解为substring(start,end),start为0则只表示0 例1:值“45abc”,hash预算位0:2 ,取其中45进行计算 例2:值“aaaabbb2345”,hash预算位-4:0 ,取其中2345进行计算 /** * “2” -> (0,2) * “1:2” -> (1,2) * “1:” -> (1,0) * “-1:” -> (-1,0) * “:-1” -> (0,-1)125 * “:” -> (0,0) */
- 一致性hash
user_id murmur 0 2
一致性hash预算有效解决了分布式数据的扩容问题,前1-9中id规则都多少存在数据扩容难题,而10规则解决了数据扩容难点。