mycat分库分表

一、目标

我们准备建立两个数据库: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的值

 

之后,我们便可以按照单实例的数据库一样测试了

 

posted @ 2018-05-13 00:30  __lay  阅读(325)  评论(0编辑  收藏  举报