书接上回,我们继续分库分表的实现。在上篇中已经提到的内容将不再说明,具体请参照《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服务是一主三从,在本篇测试过程中忘记关闭主从复制出现了些小情况,但是观察数据后果断关闭调整,结果如上图预期。