Chinaunix首页 | 论坛 | 博客
  • 博客访问: 560424
  • 博文数量: 36
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1749
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-20 16:13
个人简介

中国科学院大学计算机硕士,曾在新浪爱彩数据库组带DBA团队,现居新加坡。wx: lihui_dba

文章分类

全部博文(36)

文章存档

2020年(2)

2019年(3)

2017年(7)

2016年(1)

2015年(7)

2014年(11)

2013年(5)

分类: Mysql/postgreSQL

2017-10-12 11:43:44

前言:

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示例:

点击(此处)折叠或打开

  1.        
  2.         <tableRule name="sharding-by-nation">
  3.                 <rule>
  4.                         <columns>nation</columns>
  5.                         <algorithm>nation-int</algorithm>
  6.                 </rule>
  7.         </tableRule>

  8.        
  9.         <tableRule name="sharding-by-date">
  10.                 <rule>
  11.                         <columns>create_time</columns>
  12.                         <algorithm>partbydate</algorithm>
  13.                 </rule>
  14.         </tableRule>

  15.         <function name="nation-int"
  16.                 class="io.mycat.route.function.PartitionByFileMap">
  17.                 <property name="mapFile">partition-nation-int.txt</property>
  18.                 <property name="type">1</property>
  19.                 <property name="defaultNode">0</property>
  20.         </function>

  21.         <function name="partbydate"
  22.                 class="io.mycat.route.function.PartitionByDate">
  23.                 <property name="dateFormat">yyyy-MM-dd</property>
  24.                 <property name="sBeginDate">2017-01-01</property>
  25.                 <property name="sEndDate">2017-01-05</property>
  26.                 <property name="sPartionDay">1</property>
  27.         </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

点击(此处)折叠或打开

  1. singapore=0
  2. thailand=1
  3. malaysia=2
  4. taiwan=3
  5. indonesia=4
mapfile中的字符是无需加单引号或双引号的,但是区分大小写。
0-4即是第n个节点。

4.配置schema.xml

schema.xml示例:

点击(此处)折叠或打开

  1.         <schema name="xxx" checkSQLschema="false">

  2.                 <table name="for_test" dataNode="dn3,dn4,dn5,dn6,dn7" rule="sharding-by-nation" />
  3.                 <table name="datetime_test" dataNode="dn3,dn4,dn5,dn6,dn7" rule="sharding-by-date" />

  4.         </schema>


  5.         <dataNode name="dn3" dataHost="master_server" database="db0" />
  6.         <dataNode name="dn4" dataHost="master_server" database="db1" />
  7.         <dataNode name="dn5" dataHost="master_server" database="db2" />
  8.         <dataNode name="dn6" dataHost="master_server" database="db3" />
  9.         <dataNode name="dn7" dataHost="master_server" database="db4" />


  10.         <dataHost name="master_server" maxCon="1000" minCon="10" balance="0"
  11.                           writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100">
  12.                 <heartbeat>show slave status</heartbeat>
  13.                 <!-- can have multi write hosts -->
  14.                 <writeHost host="hostM1" url="vip:6606" user="xxx" password="xxx" />
  15.         </dataHost>
schema.xml中定义好分片的rule和相应的datanode即可。

5.装载定义好的规则,并进行测试

点击(此处)折叠或打开

  1. root# mysql -uroot -p -h 127.0.0.1 -P 9066
  2. mysql> reload @@config;

  3. root#mysql -uroot -p -h 127.0.0.1 -P 8066
  4. mysql> create table for_test(...);
  5. mysql> create table datetime_test(...);
  6. mysql> insert into for_test values(...);
  7. mysql> insert into datetime_test values(...);
  8. mysql> select * from for_test;
  9. mysql> select * from datetime_test;
OK,大功告成。这个是新表的Sharding测试。如果是现有的数据表,迁移数据需要自行处理。

参考资料:

1.《分布式数据库架构及企业实践--基于MyCat中间件》
2.http://www.cnblogs.com/ivictor/p/5155123.html
3.分片相关源代码:


阅读(1747) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~