MyCat实现Mysql分表支持业务数据增长

1、Mycat介绍以及为何使用Mycat

     主要是为了使得系统能够高可用,首先从业务角度对系统进行分拆是的不同业务在不同的数据库之中;把相关行为记录数据、用户数据、基础资料信息分拆开;因为用户行为记录数据、用户数据随着业务量分增长将进行几何级数的增长

     为用户行为数据、用户数据进行水平分表打下坚实的基础。

2、Mycat数据库分库分表基本配置说明

2.1、下载安装包 https://github.com/MyCATApache/Mycat-download/tree/master 选择一个比较稳定版本 本次使用的1.4版本测试

2.2、安装环境

        系统:windows10
        JDK版本:jdk1.7.0_80
        MySql客户端:navicat
        MySQL版本:mysql-5.7.19

2.3、安装步骤

       2.3.1、首先安装jdk环境变量和mycat环境变量

       

 

      

     在Path路径下加入以下内容:;%JAVA_HOME%\bin;%MYCAT_HOME%\bin;

       

       2.3.2 修改配置文件(需要修改的配置文件都在conf文件夹中)

           

          修改wrapper.conf  配置jdk

          

         修改server.xml(定义用户以及系统相关变量,如端口等,是mycat服务器参数调整和用户授权的配置文件)

    配置mycat登录的用户名和密码

         

        2.3.3、修改schema.xml (定义逻辑库,表、分片节点等内容)

    配置的一个全局表 company ,一个分库表 travelrecord ,分库规则是sharding-by-murmur(在rule.xml中定义)

    配置了三个数据库db1,db2,db3

        

 

       2.3.4  修改rule.xml

  在上面schema.xml文件中定义了一个分库表T_USER_LABEL,分库规则是sharding-by-murmur,所以要修改对应分库字段

      

     同时上面定义了三个分库,所以修改

     

    

注:简单介绍一下Mycat分库规则

  MYCAT常用的分片规则如下,另外还有一些其他分片方式这里不全部列举:

    (1)分片枚举:        sharding-by-intfile

    (2)主键范围约定:    auto-sharding-long    此分片适用于,提前规划好分片字段某个范围属于哪个分片

    (3)一致性hash:    sharding-by-murmur

    (4)字符串hash解析:  sharding-by-stringhash

    (5)按日期(天)分片:sharding-by-date

    (6)按单月小时拆分:   sharding-by-hour

    (7)自然月分片:         sharding-by-month

    (8)取模:      mod-long  此规则为对分片字段求摸运算

    (9)取模范围约束:      sharding-by-pattern 此种规则是取模运算与范围约束的结合,主要为了后续数据迁移做准备,即可以自主决定取模后数据的节点分布

  

     3 启动mycat

  (1)在原数据库中新建3个数据库db1,db2,db3

  (2)启动和停止服务

    进入cmd.切换到./mycat/bin/

    注:安装mycat服务 :mycat install 

      启动mycat服务 :mycat start

      停止mycat服务 :mycat stop

      注意:当修改配置文件后,需要重启mycat服务

      mysql -h[IP] - u[userName] -p[password] -P8066

 

4、创建数据库

 按照schema.xml配置中的示例,我们需要建立分别名为db1、db2、db3的数据库。链接mysql,建立相关的数据库:这个数据库 localhost:3307

mysql -uroot -proot;
create database db1 character set utf8;
create database db2 character set utf8;
create database db3 character set utf8;

5、连接Mycat 数据库

使用数据库链接工具或命令。本文使用navicat链接数据库。使用navicat链接数据库时的主要参数配置如下:

端口号:8066  用户名和密码可以查看mycat conf目录中的server.xml中的定义,本文使用的是默认的用户名: mycat,密码:mycat来连接,连接成功后只能操作名为TESTDB的数据库;

6、全局表的测试

       使用navicat打开命令列界面。输入如下命令创建数据表:

       

USE TESTDB;
create table company(id int not null primary key,name varchar(100),sharding_id int not null);

之后使用如下命令查看创建表命令的执行状态:

explain create table company(id int not null primary key,name varchar(100),sharding_id int not null);

因为company在schema.xml中北定义为了全局表,所以正常情况下可以看到如下类似结果:

+-----------+----------------------------------------------------------------------------------------------+
| DATA_NODE | SQL                                                                                          |
+-----------+----------------------------------------------------------------------------------------------+
| dn1       | create table company(id int not null primary key,name varchar(100),sharding_id int not null) |
| dn2       | create table company(id int not null primary key,name varchar(100),sharding_id int not null) |
| dn3       | create table company(id int not null primary key,name varchar(100),sharding_id int not null) |
+-----------+----------------------------------------------------------------------------------------------+
3 rows in set

紧接着我们尝试执行如下命令执行一条插入数据的操作:

insert into company(id,name,sharding_id) values(1,'leader us',10000); 

然后类似执行explain命令查看insert命令的执行状态:

explain insert into company(id,name,sharding_id) values(1,'leader us',10000);

正常情况下我们会看到如下结果:

+-----------+----------------------------------------------------------------------+
| DATA_NODE | SQL                                                                  |
+-----------+----------------------------------------------------------------------+
| dn1       | insert into company(id,name,sharding_id) values(1,'leader us',10000) |
| dn2       | insert into company(id,name,sharding_id) values(1,'leader us',10000) |
| dn3       | insert into company(id,name,sharding_id) values(1,'leader us',10000) |
+-----------+----------------------------------------------------------------------+
3 rows in set

之后我们直接登录到mysql服务器分别查看db1、db2、db3三个数据库,可以看到数据库中都创建了名为company的数据表,同时表中都插入了名为leader us的数据。

7、水平分表测试

如上面的操作。我们在navicat的命令列窗口中执行如下命令创建travelrecord表:

create table travelrecord(id int not null primary key,name varchar(100)); 

之后使用explain查看:

explain create table travelrecord(id int not null primary key,name varchar(100)); 

结果如下:

+-----------+--------------------------------------------------------------------------+
| DATA_NODE | SQL                                                                      |
+-----------+--------------------------------------------------------------------------+
| dn1       | create table travelrecord(id int not null primary key,name varchar(100)) |
| dn2       | create table travelrecord(id int not null primary key,name varchar(100)) |
| dn3       | create table travelrecord(id int not null primary key,name varchar(100)) |
+-----------+--------------------------------------------------------------------------+
3 rows in set

然后执行如下命令插入一条数据:

insert into travelrecord(id,name) values(1,'hp');  

执行explain查看执行结果:

explain insert into travelrecord(id,name) values(1,'hp');  

结果如下:

+-----------+--------------------------------------------------+
| DATA_NODE | SQL                                              |
+-----------+--------------------------------------------------+
| dn1       | insert into travelrecord(id,name) values(1,'hp') |
+-----------+--------------------------------------------------+
1 row in set

可以登录到数据库分别查看,三个数据库中都创建了travelrecord的数据表,但是仅db1(dn1对应的数据库)中插入了数据

 

 

 

         

posted @ 2017-08-19 18:51  蜀山剑侠  阅读(284)  评论(0)    收藏  举报