场景描述
mycat已配置读写分离,读写分离链接:mycat+mysql实现读写分离
mycat拥有两个逻辑数据库test1、test2;
test2拥有三个逻辑表:aa、bb、cc,对应下面真实数据库的aa、bb、cc
mysql拥有三个真正的数据库test1、test2、test3
test2拥有两个真正表:aa、bb
test3拥有两个真正表:aa、cc
所有真实表都需要设置主键自增
对aa表进行分库分表
mycat分库分表配置
schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="test1" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema>
<schema name="test2" checkSQLschema="fales" sqlMaxLimit="100">
<!--
name:表名;
dataNode:数据库节点名称;
primaryKey:主键;
autoIncrement:设置主键自增
rule:分片规则
-->
<table name="aa" dataNode="dn2,dn3" primaryKey="id" autoIncrement="true" rule="auto-sharding-long"/>
<table name="bb" dataNode="dn2" primaryKey="id"/>
<table name="cc" dataNode="dn3" primaryKey="id"/>
</schema>
<!--
name:表名;
dataNode:数据库节点名称;
dataHost:dataHost名称;
database:真正数据库名
-->
<dataNode name="dn1" dataHost="localhost1" database="test1" />
<dataNode name="dn2" dataHost="localhost1" database="test2" />
<dataNode name="dn3" dataHost="localhost1" database="test3" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts 写数据库-->
<writeHost host="hostM1" url="192.168.81.129:3306" user="root" password="123456">
<!-- can have multi read hosts 读数据库-->
<readHost host="HostS1" url="192.168.81.130:3306" user="root" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>
rule.xml
这里采用范围约定,提前规划好分片字段某个范围属于哪个分片。
了解更多分片规则,参考这篇文章:Mycat分片规则详解
<tableRule name="auto-sharding-long">
<rule>
<columns>id</columns>
<algorithm>rang-long</algorithm>
</rule>
</tableRule>
<function name="rang-long" class="io.mycat.route.function.AutoPartitionByLong">
<property name="mapFile">autopartition-long.txt</property>
<property name="defaultNode">1</property>
</function>
配置说明:
- columns 标识将要分片的表字段
- algorithm 分片函数
- mapFile 标识配置文件名称
- defaultNode 超过范围后的默认分片
autopartition-long.txt
#0-500M=0
#500M-1000M=1
#1000M-1500M=2
# 以下配置说明id是0-5的,属于0节点;id是6-10的,属于1节点
0-5=0
6-10=1
sequence_conf.properties
配置全局序列号
AA.HISIDS=
AA.MINID=1
AA.MAXID=5
AA.CURID=0
配置说明:
- AA:需要分库分表的表名,必须用大写字母;需要配置多个表复制以上参数即可
- HISIDS:使用过的历史分段(一般无特殊需要可不配置)
- MINID:最小主键值
- MAXID:最大主键值
- CURID:当前主键值
注意:测试过程中如果需要重置真正数据库的主键,这边的配置也需要重置
server.xml
<!--全局序列方式: 0 为本地文件方式(读取sequence_conf.properties),1 为数据库方式,2 为时间戳序列方式,3 为分布式 ZK ID 生成器,4 为 zk 递增 id 生成 -->
<property name="sequnceHandlerType">0</property>
测试
mycat中的aa逻辑表数据:
test2真实数据库的aa真实表数据:
test3真实数据库的aa真实表数据:
结论:
mycat中拥有主键1-11的数据,test2中拥有主键1-5的数据,test3中拥有主键6-11的数据;上面配置的1-5属于0分片、6-10属于1分片,而超出的部分默认属于1分片;由此可以看出mycat分库分表成功