MyCat实现Mysql分表支持业务数据增长
1、Mycat介绍以及为何使用Mycat
主要是为了使得系统能够高可用,首先从业务角度对系统进行分拆是的不同业务在不同的数据库之中;把相关行为记录数据、用户数据、基础资料信息分拆开;因为用户行为记录数据、用户数据随着业务量分增长将进行几何级数的增长
为用户行为数据、用户数据进行水平分表打下坚实的基础。
2、Mycat数据库分库分表基本配置说明
2.1、下载安装包 https://github.com/MyCATApache/Mycat-download/tree/master 选择一个比较稳定版本 本次使用的1.4版本测试

2.2、安装环境
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对应的数据库)中插入了数据。


浙公网安备 33010602011771号