前两篇文章,我们了解了mysql的主从同步以及mycat对读写分离的管理。本文将阐述使用mycat完成分库分表。分表一般会导致分库,分表的目的就是把表一分多,提升查询效率。分表有两种方式,一是水平分表【按行】,一是垂直分表【按列】。我们先看一下水平分表。
1、前提约束
- 完成mycat的读写分离管理 https://www.jianshu.com/p/8c3e007a0550
2、修改配置文件
- 修改C:\Program Files\mycat\conf\schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="t1" primaryKey="id" dataNode="dn1,dn2" rule="role1"/>
</schema>
<dataNode name="dn1" dataHost="localhost1" database="db01" />
<dataNode name="dn2" dataHost="localhost1" database="db02" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="0" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="192.168.100.134" url="192.168.100.134:3306" user="root"
password="zhangli">
<readHost host="192.168.100.136" url="192.168.100.136:3306" user="root" password="zhangli" />
</writeHost>
</dataHost>
</mycat:schema>
注意:其中的role1就是rule.xml定义的如下内容,即对2取余
<tableRule name="role1">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">2</property>
</function>
重启mycat。
3、登录主机134,创建db02实例、创建t1表
mysql -uroot -pzhangli -h 192.168.100.134
create database db02;
use db02;
create table t1(id int,name varchar(20));
4、登录mycat、删除之前数据、加入新数据
mysql -uroot -p123456 -P8066
use TESTDB;
delete from t1;
insert into t1(id,name) values(1,'ali');
insert into t1(id,name) values(2,'zhangli');
5、登录从机136,查看db01、db02中的t1表数据
mysql -uroot -pzhangli -h 192.168.100.136
use db01;
select * from t1;
use db02;
select * from t1;
我们看到两条数据分别位于db01和db02,这就是id对2取模存储的结果。
至此,我们完成了mycat的水平分库分表。