rule.xml的tableRule标签配置表的分片规则
<tableRule name="hash-mode-5_id">
<rule>
<columns>id</columns>
<algorithm>hash-mode-5</algorithm>
</rule>
</tableRule>
name指定分片规则名字,唯一性;
columns指定用于分片的mysql实体表的字段,
algorithm指定使用的分片算法,取自标签定义的函数,函数的实现是编写在java代码中的
rule.xml的function标签配置表的分片算法
<function name="hash-mod-5" class="io.mycat.route.function.PartitionByHashMod" >
<property name="count">5</property>
</function>
定义了hash-mod-5使用io.mycat.route.function.PartitionByHashMod"这个java类来实现分片算法 ,count是其参数
常用分片算法以及rule.xml中的配置
1.简单取模-PartitionByMod
适用于根据整数字段进行分片,取模的值对应分片库的序号,比如某条记录的id=100, mod 3 = 1,那这条记录就在分片db2(分片节点的序号从0开始)上
简单取模算法简单,存储均匀,但是伸缩不方便
<tableRule name="users">
<rule>
<columns>users_Fid</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<property name="count">3</property>
</function>
2.哈希取模-PartitionByHashMod
针对非整数字段,通过哈希算法得到一个整数值,然后再进行取模分片
通过哈希取模,因为哈希得到的整数值是随机的,所以数据更具分散性,但是多条记录的分片字段的值相同的时候它们哈希取模的值也相同,会被储存到同一分片,比如有100条订单记录,其中98条是用户A的,其他分别是B、C的,如果根据用户名字段进行哈希取模分片,那么A的98条记录都会集中在同一分片中,只有其它2条在别的分片中,造成数据存储不均匀
<tableRule name="users">
<rule>
<columns>users_Fname</columns>
<algorithm>hash-mod</algorithm>
</rule>
</tableRule>
<function name="hash-mod" class="io.mycat.route.function.PartitionByHashMod">
<property name="count">3</property>
</function>
3.枚举分片-PartitionByFileMap
人为指定分片字段值对应哪个分片节点,比如:根据所在城市字段Fcity_id进行分片,直接通过mapFile配置城市id和db一一对应,所在城市的记录就存在对应的db中
<tableRule name="users">
<rule>
<columns>users_Fcity_id</columns>
<algorithm>map-city</algorithm>
</rule>
</tableRule>
<function name="map-city" class="io.mycat.route.function.PartitionByFileMap">
<property name="mapFile">partition-map-city.txt</property>
<property name="type">0</property>
<property name="defaultNode">0</property>
</function>
partition-map-city.txt这个mapFile文件放在/usr/local/mycat/conf/目录下,
type属性指定枚举值类型:0表示整型,非0表示字符串型
defaultNode属性配置是否使用默认的节点:<0不使用,>=0使用(具体的节点值在mapFile中定义)
4.字符串范围取模分片-PartitionByPrefixPattern
根据指定字符串的前N个字符确定分片,比如根据订单号的前3个字符来分片存储
订单号前3位是ABC,进行模运算:mod(ASCII(A)+ASCII(B)+ASCII©,128)=70
逻辑顺序:
首先,计算ABC的ascii码值之和=65+66+67=198;
然后,根据一个自定义的基数取模,198%128=70
最后,将取模的值匹配mapFile中设置(0-63=0 64-127=1)的对应的分片DB2
<tableRule name="bill">
<rule>
<columns>Fbid</columns>
<algorithm>prefixpattern-mod</algorithm>
</rule>
</tableRule>
<function name="prefixpattern-mod" class="io.mycat.route.function.PartitionByPrefixPattern">
<property name="patternValue">128</property>
<property name="prefixLength">3</property>
<property name="mapFile">prefix-partition-pattern.bill.txt</property>
</function>
patternValue属性是取模基数
prefixLength属性是取分片字段的前几个字符来运算