前言:
MyCat支持大概有20多种分片规则,除了常规的按RANGE、LIST、HASH、DATETIME分片之外,还首创了E-R分片规则,也支持用户自定义分片规则。在Sharing的支持上算是比较全面了。下面我们就以LIST和DATETIME分区为例,来看下如何快速部署分区表。Sharding关键点:
需要配置的文件有schema.xml, rule.xml, 和rule.xml中function部分指定的txt文件(mapfile)。使用rule.xml中的拆分规则时,请复制和部分后重新命名。因为规则虽然相同,但是每个Sharding表的拆分会有区别,无法使用同一套mapfile。
拆分规则设置没问题的话,reload @@config就可以成功加载。如果设置不对,重启MyCat会无法启动。
因为一些细节在官方文档中并未详细描述,请在测试环境测试好之后,再搬到线上应用。
Sharding过程:
1.先确定所要使用的Sharding规则
在rule.xml中复制和部分,重新命名。不要把同一个规则的和放到一起,MyCat会无法读取。
2.配置rule.xml
rule.xml示例:点击(此处)折叠或打开
-
tableRule name="sharding-by-nation">
-
rule>
-
columns>nation/columns>
-
algorithm>nation-int/algorithm>
-
/rule>
-
/tableRule>
-
-
tableRule name="sharding-by-date">
-
rule>
-
columns>create_time/columns>
-
algorithm>partbydate/algorithm>
-
/rule>
-
/tableRule>
-
-
function name="nation-int"
-
class="io.mycat.route.function.PartitionByFileMap">
-
property name="mapFile">partition-nation-int.txt/property>
-
property name="type">1/property>
-
property name="defaultNode">0/property>
-
/function>
-
-
function name="partbydate"
-
class="io.mycat.route.function.PartitionByDate">
-
property name="dateFormat">yyyy-MM-dd/property>
-
property name="sBeginDate">2017-01-01/property>
-
property name="sEndDate">2017-01-05/property>
-
property name="sPartionDay">1/property>
- /function>
先配置tableRule,以枚举分片为例:
sharding-by-nation是规则名,在schema.xml中会用到。
columns中即是分片的列。
algorithm是我们调用的分片function。
再配置function:
nation-int的命名要和tableRule相对应,否则tableRule就无法调用相关的分片算法。
class即是调用的分片算法的类。
property是根据算法的要求,指定的Sharding规则,每个算法的规则都不相同,这部分的定义要参考官方文档和源代码。
使用枚举值进行拆分:
需要定义一个mapfile。
type的默认值是0,0表示Integer,非零表示String。
defaultNode指默认节点,小于0表示不设置默认节点,大于或等于0表示设置默认节点。从0开始,数字即为默认值写入的节点。
默认节点的作用就是在枚举分片时,如果碰到mapfile中未定义的枚举值,就路由到默认节点。如果不配置默认节点的话,碰到不识别的枚举值会报这个错误:Like this: can't find datanode for sharding column:column_name val:ffffffff
对datetime值进行拆分:
dateFormat指日期格式。
sBeginDate为开始日期。
sEndDate为结束日期。如果配置了sEndDate,则数据达到这个日期之后,后面的日期会在sBeginDate和sEndDate中循环插入。
sPartionDay为分区天数。如果不设置,默认从开始日期计算,每10天一个分区。
配置时要注意开始日期和结束日期之间的分区数量,要和schema.xml中的datenode数量相匹配。否则会抛出datanode不够的错误。
例如sBeginDate为‘‘2017-01-01’’,sEndDate为“2017-12-31”,sPartionDay为1,那么我们就需要365个datanode。
3.配置mapfile
mapfile示例:partition-nation-int.txt点击(此处)折叠或打开
- singapore=0
- thailand=1
- malaysia=2
- *=3
- indonesia=4
0-4即是第n个节点。
4.配置schema.xml
schema.xml示例:点击(此处)折叠或打开
-
schema name="xxx" checkSQLschema="false">
-
-
table name="for_test" dataNode="dn3,dn4,dn5,dn6,dn7" rule="sharding-by-nation" />
- table name="datetime_test" dataNode="dn3,dn4,dn5,dn6,dn7" rule="sharding-by-date" />
-
-
/schema>
-
-
-
dataNode name="dn3" dataHost="master_server" database="db0" />
-
dataNode name="dn4" dataHost="master_server" database="db1" />
-
dataNode name="dn5" dataHost="master_server" database="db2" />
-
dataNode name="dn6" dataHost="master_server" database="db3" />
- dataNode name="dn7" dataHost="master_server" database="db4" />
-
-
-
dataHost name="master_server" maxCon="1000" minCon="10" balance="0"
-
writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100">
-
heartbeat>show slave status/heartbeat>
-
!-- can have multi write hosts -->
- writeHost host="hostM1" url="vip:6606" user="xxx" password="xxx" />
- /dataHost>
5.装载定义好的规则,并进行测试
点击(此处)折叠或打开
- root