mycat实现分库分表(二)

  书接上回,我们继续分库分表的实现。在上篇中已经提到的内容将不再说明,具体请参照《mycat实现读写分离(一)》

  

  1、分库分表schema配置

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
 3 
 4 <mycat:schema xmlns:mycat="http://io.mycat/">  
 5   <!-- 数据库配置,与server.xml中的数据库对应 -->  
 6   <schema name="testdb" checkSQLschema="true" sqlMaxLimit="100"> 
 7     <table name="travel_record" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2,dn3,dn4" rule="mod-long"/> 
 8   </schema>  
 9   <!-- 分片配置 -->  
10   <dataNode name="dn1" dataHost="host1" database="testdb"/>  
11   <dataNode name="dn2" dataHost="host2" database="testdb"/>  
12   <dataNode name="dn3" dataHost="host3" database="testdb"/>
13   <dataNode name="dn4" dataHost="host4" database="testdb"/> 
14   
15   <!-- 物理数据库配置 -->  
16   <dataHost name="host1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native"> 
17     <heartbeat>select user();</heartbeat>  
18     <writeHost host="M1" url="192.168.153.130:3306" user="root" password="mysql"/>
19   </dataHost> 
20   <dataHost name="host2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native"> 
21     <heartbeat>select user();</heartbeat>  
22     <writeHost host="M2" url="192.168.153.131:3306" user="root" password="mysql"/> 
23   </dataHost>
24   <dataHost name="host3" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native"> 
25     <heartbeat>select user();</heartbeat>  
26     <writeHost host="M2" url="192.168.153.132:3306" user="root" password="mysql"/> 
27   </dataHost>  
28   <dataHost name="host4" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native"> 
29     <heartbeat>select user();</heartbeat>  
30     <writeHost host="M4" url="192.168.153.133:3306" user="root" password="mysql"/> 
31   </dataHost>
32 </mycat:schema>

  二、分片规则

  mycat支持多种分片策略,本文以mod-long为例,其他分片策略详见mycat官方文档:http://www.mycat.io/document/mycat-definitive-guide.pdf

  需要关注分片的规则为mod-long,由于配置schema中有四个dataHost,所以还需检查分片规则配置。

  编辑rule.xml检查名称为mod-long的分片规则设置,function中配置分片数量需与实际分片节点数保持一致。

 1   <tableRule name="mod-long"> 
 2     <rule> 
 3       <columns>id</columns>  
 4       <algorithm>mod-long</algorithm> 
 5     </rule> 
 6   </tableRule>  
 7   <function name="mod-long" class="io.mycat.route.function.PartitionByMod"> 
 8     <!-- how many data nodes -->  
 9     <property name="count">4</property> 
10   </function> 

  三、全局ID

  在实现了分库分表的情况下,数据库自增主键已无法保证在集群全局中保持唯一,mycat提供了全局sequence,并提供了本地配置、数据库配置等多种方式。本文中以本地配置文件方式为例。

  首先开启sequence本地配置文件方式主键自增策略,将server.xml中sequenceHandlerType改为1。

1 <property name="sequnceHandlerType">0</property>

  编辑sequence_conf.properties配置文件增加sequence配置:

 1 #TRAVEL_RECORD 是表名称
 2 #HISIDS 表示历史分段(一般无特殊需要则可以不配置)
 3 #MINID 最小id
 4 #MAXID 最大id
 5 #CURID 当前id
 6 
 7 TRAVEL_RECORD.HISIDS=
 8 TRAVEL_RECORD.MINID=11
 9 TRAVEL_RECORD.MAXID=2000
10 TRAVEL_RECORD.CURID=10

  四、测试

  重启mycat,执行./mycat restart。通过管理端9066端口查看数据源:mysql -uroot -pmysql -P9066 -h127.0.0.1

     

   循环插入测试数据,执行下述SQL

1 INSERT INTO travel_record(org_code,org_name) VALUES ('20180913','name1');

   插入数条数据后,命令行链接mycat查询数据落库情况如下图:

  

  各个节点130、131、132、133数据情况:

      

     

  至此mycat分库分表测试环境搭建结束。

  注意:四个节点的mysql不存在主从关系,否则会出现预期之外的分片结果和重复数据。在写上篇时我的四个mysql服务是一主三从,在本篇测试过程中忘记关闭主从复制出现了些小情况,但是观察数据后果断关闭调整,结果如上图预期。

 

posted @ 2018-09-13 16:41  德克济克Dekjike  阅读(1410)  评论(0编辑  收藏  举报