前言:
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
-
taiwan=3
-
indonesia=4
mapfile中的字符是无需加单引号或双引号的,但是区分大小写。
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>
schema.xml中定义好分片的rule和相应的datanode即可。
5.装载定义好的规则,并进行测试
-
root# mysql -uroot -p -h 127.0.0.1 -P 9066
-
mysql> reload @@config;
-
-
root#mysql -uroot -p -h 127.0.0.1 -P 8066
-
mysql> create table for_test(...);
-
mysql> create table datetime_test(...);
-
mysql> insert into for_test values(...);
-
mysql> insert into datetime_test values(...);
-
mysql> select * from for_test;
-
mysql> select * from datetime_test;
OK,大功告成。这个是新表的Sharding测试。如果是现有的数据表,迁移数据需要自行处理。
参考资料:
1.《分布式数据库架构及企业实践--基于MyCat中间件》
2.http://www.cnblogs.com/ivictor/p/5155123.html
3.分片相关源代码:
阅读(1747) | 评论(0) | 转发(0) |