用mycat进行了简单的分库练习.我是基于docker 的mycat 使用.

思路:

在mycat 控制的两个mysql 节点下, 有 同名 的db,但是对这个db 进行了拆分, 有些table 的数据存放在某个指定的节点.
先修改配置文件 schema.xml(建议用hbuild 来修改),要指定被分出去的表的表名, 和对应的节点, 取消主从复制, 把balance改成0 ,
然后重启mycat 容器

schema.xml 文件示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
<table name="baidu" dataNode="dn2" ></table>
</schema>
<dataNode name="dn1" dataHost="host1" database="DBA" />
<dataNode name="dn2" dataHost="host2" database="DBA" />
<dataHost name="host1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="172.17.0.3:3306" user="root"
password="654321">
</writeHost>
</dataHost>
<dataHost name="host2" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM2" url="172.17.0.4:3306" user="root"
password="654321">
</writeHost>
</dataHost>
</mycat:schema>

注意事项:

不能改了配置就立刻启动mycat , 这个逻辑库对应的新物理库, 需要手动去mysql上主动创建database.(如果mysql 配置了主从复制, 那么在主机上创建database 就可以了). 但是建库之后的建表,就必须要用mycat 来执行.
因为mycat 通过拦截请求, 就判断哪些库被指定了节点, 就去建到对应的节点上.

mysql 环境的注意事项

最好把xml 文件里引用到的mysql 服务器解除主从复制的关系, 不然很可能会影响到数据分库.
比如我上面的schema.xml 文件里, 把baidu 这个表放在了已经有主从关系的mysql 从机这个节点里. 此时这个baidu 表的数据, 就不会存在主从关系的主机里. 但是此时,如果我们通过mycat 在主机上新建表和插入数据, 依然会由于主从复制的原因,会把主机的数据同步到从机上. 而且如果把baidu 这个表放在主机上, 从机一样能通过主从复制拿到数据.
因此, 最好是多个mysql 之间没有主从关系, 或者根据特定的需求, 让某台mysql 服务器需要针对某个主机进行全盘备份的时候就可以这样使用.