• 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服务是一主三从,在本篇测试过程中忘记关闭主从复制出现了些小情况,但是观察数据后果断关闭调整,结果如上图预期。

  • 相关阅读:
    cocos2d-x CCNotificationCenter一个优化想法
    【备忘】尾调用(尾递归)--来自维基百科
    [转] 关于Mongodb的全面总结,学习mongodb的人,可以从这里开始
    [转]编程修养
    DirectX11 SDK 例程报错解决方法
    unity3d Vector3.Lerp解析
    unity3d 三分钟实现简单的赛车漂移
    Unity 5.3.1 No Android/IOS module loaded
    unity3d 音频无缝循环
    unity3d 扩展NGUI Tweener —— TweenTime
  • 原文地址:https://www.cnblogs.com/ouhouki/p/9641393.html
Copyright © 2020-2023  润新知