一、目标
我们准备建立两个数据库:test、test2。
test包含两张表:1)t_user; 2) t_class
test2包含一张表:2)t_user
如上,我们打算把t_user的数据均匀的分布到test和test2两个数据库里面,而t_class的数据仅分布到test一个数据库里面;
二、准备
1、数据库
1)创建mysql数据库: test
1)建表t_user
CREATE TABLE `t_user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
2) 建表t_class
CREATE TABLE `t_class` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
2) 创建mysql数据库:test2
1)建表 t_user
CREATE TABLE `t_user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
2、中间件mycat
mycat安装参考:http://www.cnblogs.com/lay2017/p/9030042.html
三、配置server.xml
设置如下:
用户:root
密码:root
逻辑库名称:mycatdb
<!-- mycat测试数据库 --> <user name="root"> <property name="password">root</property> <property name="schemas">mycatdb</property> <property name="readOnly">false</property> </user>
四、配置schema.xml
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <!-- 配置逻辑库 --> <schema name="mycatdb" checkSQLschema="true" sqlMaxLimit="100"> <!-- t_user表分到两个节点上 --> <table name="t_user" primaryKey="id" autoIncrement="true" dataNode="dataNode2,dataNode1" rule="mod-long"/> <!-- t_class表分到一个节点上 --> <table name="t_class" primaryKey="id" dataNode="dataNode1"/> </schema> <!-- 配置分片节点 --> <dataNode name="dataNode1" dataHost="dataHost1" database="test" /> <dataNode name="dataNode2" dataHost="dataHost1" database="test2" /> <!-- 配置节点主机 --> <dataHost name="dataHost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native"> <!-- 心跳 --> <heartbeat>select user()</heartbeat> <!-- 读写配置 --> <writeHost host="host1" url="数据库所在IP地址:3306" user="账户" password="密码"></writeHost> </dataHost> </mycat:schema>
如上:
1)checkSQLschema设置为true:表示不检查库名,否则如navicat中无法打开表查看数据;
2)t_user表分配了两个节点,分片规则为mod-long。这里需要到rule.xml里面配置分片规则
找到rule.xml并打开,更改mod-long规则的function的count为2(因为t_user分到了两个节点):
<function name="mod-long" class="io.mycat.route.function.PartitionByMod"> <!-- how many data nodes --> <property name="count">2</property> </function>
这样,t_user的数据就会均匀分布到两个数据库
3)primaryKey="id" autoIncrement="true" 表示主键采用序列自增(如果不配置autoIncrement那么将采用数据库自增)
4)注意:如果不在schema里面设置的table那么在navicat中是不显示的,但是功能可以正常使用;
五、启动
配置完毕,我们可以启动mycat,进入mycat的bin目录,执行
./mycat start
启动是否成功我们可以查看wrapper.log日志,如果有问题会有报错信息(mycat.log可以查看mycat使用过程中出现的异常)
注意:如果报错是mysql连接不上,请查看是否mysql允许了远程连接
六、查看mycat数据源
如上,我们配置好了分库以及分表,我们可以查看一下数据源的信息,如下命令:
./mysql -uroot -proot -P9066 -h127.0.0.1
mysql> show @@datasource
我们看到:
+-----------+-------+-------+---------------+------+------+--------+------+------+---------+-----------+------------+
| DATANODE | NAME | TYPE | HOST | PORT | W/R | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD |
+-----------+-------+-------+---------------+------+------+--------+------+------+---------+-----------+------------+
| dataNode1 | host1 | mysql | 服务器IP地址 | 3306 | W | 0 | 10 | 1000 | 65 | 29 | 0 |
| dataNode2 | host1 | mysql | 服务器IP地址 | 3306 | W | 0 | 10 | 1000 | 65 | 29 | 0 |
+-----------+-------+-------+---------------+------+------+--------+------+------+---------+-----------+------------+
mycat中包含了两个节点,分别对应到我们配置的两个数据库实例
七、navicat连接
我们可以像一般数据库连接一样用navicat连接
IP:即mycat安装的地址
端口:8066
用户名:user的name
密码:user的password的值
之后,我们便可以按照单实例的数据库一样测试了