一、介绍

MyCat2是什么
关于MyCat,不用做过多介绍,曾经大名鼎鼎的分库分表中间件。诞生于2013年,从MyCat1.6版本之后,陷入了一段时间的沉寂。从2021年11月低开始,重新推出新版本的MyCat2,官网地址: https://www.mycat.org.cn/。

二、MyCat2安装启动

1.准备测试环境

MyCat2是基于Java开发的,所以他的运行环境是比较简单的,只需要安装JDK即可。接下来准备一台Linux机器,搭建JDK8版本。初始搭建时,建议在这台服务器上也搭建一个MySQL服务。

然后,为了上手使用MyCat2,需要搭建后端测试的MySQL服务。接下来会准备两个MySQL5.7服务实例,并搭建完成MySQL的主从同步集群。

2.下载mycat

mycat2运行环境框架:http://dl.mycat.org.cn/2.0/install-template/mycat2-install-template-1.20.zip

mycat2 jar包:http://dl.mycat.org.cn/2.0/1.21-release/mycat2-1.21-release-jar-with-dependencies-2022-3-14.jar

下载好的运行框架解压,把mycat2 jar包放在运行环境框架目录下的lib里

3.服务搭建

配置datasource.json文件

目录地址:mycat\conf\datasources下prototypeDs.datasource.json

修改以下三项,指向自己真实的物理数据库地址

配置user.json

目录地址:mycat\conf\users下root.user.json

修改mycat登录的用户名和地址,注意用户名与文件名一直,如username改成yinlt,文件名就是yinlt.user.json

3.启动mycat

windows 下直接启动mycat\bin 目录下的mycat.bat就行

linux 启动命令:bin/mycat start

服务启动后检查日志文件,里面包括很多started up.代表启动成功。

使用mysql数据库连接工具,配置Mycat远程信息,可以远程上代表已经成功。(注意:mycat默认端口是8066,非3306)

三、MyCat2主要配置文件

MyCat2定位是一个数据库中间件,他并不存储数据。MyCat2所有的功能都可以理解为通过一系列配置文件定制一系列业务规则,通过与其他数据库(目前主要是MySQL)协作,提供具体的业务功能。所以,目前MyCat2的所有功能都体现在他的配置文件当中。

主要配置文件:

其它配置文件:

server.json :服务类的配置

state.json:服务状态配置

users文件夹下:配置mycat2逻辑用户

schemas文件夹下:配置mycat2逻辑库

clusters文件夹下:集群分发配置

schemas文件夹下:配置mycat2逻辑的库

四、MyCat2读写分离

读写分离的基本原理是MyCat2将Update、Delete、Insert这一类写数据的请求转发到MySQL集群中的主节点,然后将Select类的读数据的请求转发到MySQL集群中的相关节点,主要是从节点。而MySQL的主节点与从节点之间,通常会使用MySQL的主从同步机制来进行数据同步,从而保证读请求能够读取到最新的数据结束。

1.配置真实数据源

登录MyCat2后,可以使用MyCat2提供的注解方式配置真实数据源.

# 创建数据源 # 创建dbw写库,指向集群中的master服务/*+ mycat:createDataSource{"name":"dbW","url":"jdbc:mysql://192.168.232.128:3306/mysql" />

或者修改mycat\conf\datasources下配置文件,复制新的进行修改

一共建两个

dbW:用来写

dbR:用来读

2.配置Mysql集群

创建一个集群,起名:WRSplitCluster,设置dbW为主节点,dbR为从节点

#更新集群信息,添加dr从节点/*! mycat:createCluster{"name":"WRSplitCluster","masters": ["dbW"],"replicas":["dbR"]} */; #查看配置集群信息 /*+ mycat:showClusters{} */;

或者修改/mycat/conf/clusters下配置文件,复制新的进行修改

3.配置逻辑库

--1、在mycat2的服务中声明一个逻辑库。

create database wrdb;

--2、在mycat2的部署目录下,找到对应的配置文件,conf/schema/wrdb.schema.json。在其中增加targetName:WRSplitcluster属性。指向真实的集群。

{"customTables" :{},"globalTables":{},"normalProcedures":{},"normalTables":{},"schemaName" : "wrdb","targetName":"WRSplitCluster","shardingTables":{},"views":{}}

--3、手动修改配置文件之后,需要重启MyCat2服务,让配置文件生效。

--4.进行读写分离

四、mycat2分库分表

对于分库分表功能,MyCat2提供了非常简单的配置方式。可以在MyCat2客户端直接完成配置,不需要手动调整配置文件。基础的配置方式依然是数据源 ->集群,然后在建表时指定分库分表规则。

全局表配置

1.配置数据源

#第一个写库/*+ mycat:createDataSource{"name":"dw0","url":"jdbc:mysql://10.181.211.15:3306 ","user":"root","password":"admin@123"} */;#第一个读库/*+ mycat:createDataSource{"name":"dr0","url":"jdbc:mysql://10.181.211.15:3306 ","user":"root","password":"admin@123"} */;#第二个写库/*+ mycat:createDataSource{"name":"dw1","url":"jdbc:mysql://10.181.211.12:3306 ","user":"root","password":"Admin@123"} */;#第二个读库 /*+ mycat:createDataSource{"name":"dr1","url":"jdbc:mysql://10.181.211.12:3306 ","user":"root","password":"Admin@123"} */;

2.配置集群

#在mycat2终端输入#配置第一组集群/*!mycat:createCluster{"name":"c0","masters":["dw0"],"replicas":["dr0"]}*/;#配置第二组集群/*!mycat:createCluster{"name":"c1","masters":["dw1"],"replicas":["dr1"]}*/;

3.创建数据库和表

#添如数据库db1CREATE DATABASE shardingdb;#在建表语句中加上关链字 BROADCAST(广播,即为全局表)CREATE TABLE shardingdb.t_dict(`id` INT NOT NULL,`dict_id` INT,`item_id` INT,`item_value` VARCHAR ( 32 ) NULL, PRIMARY KEY (`id` ), KEY `id`(`id`) )ENGINE = INNODB DEFAULT CHARSET = utf8 BROADCAST;INSERT INTO shardingdb.t_dict VALUES(1,1,0,'正常'); INSERT INTO shardingdb.t_dict VALUES(2,1,1,'正常'); INSERT INTO shardingdb.t_dict VALUES(3,2,0,'男');INSERT INTO shardingdb.t_dict VALUES(4,2,1,'女'); INSERT INTO shardingdb.t_dict VALUES(5,3,1,'会员'); INSERT INTO shardingdb.t_dict VALUES(6,3,1,'非会员'); SELECT * FROM shardingdb.t_dict

分片表配置

 CREATE TABLE shardingdb.orders (id BIGINT NOT NULL,order_type INT,customer_id INT,amount DECIMAL ( 10,2 ),PRIMARY KEY ( id ),KEY `id` (`id` ))ENGINE = INNODB DEFAULT CHARSET = utf8dbpartition BY mod_hash ( id ) tbpartition BY mod_hash ( id ) tbpartitions 1 dbpartitions 2;INSERT INTO shardingdb.orders(id,order_type,customer_id,amount)VALUES(1,101,100,100100);INSERT INTO shardingdb.orders(id,order_type,customer_id,amount)VALUES(2,101,101,100300);INSERT INTO shardingdb.orders(id,order_type,customer_id,amount)VALUES(3,101,101,120000);INSERT INTO shardingdb.orders(id,order_type,customer_id,amount)VALUES(4,101,101,103000);INSERT INTO shardingdb.orders(id,order_type,customer_id,amount)VALUES(5,102,101,100400);INSERT INTO shardingdb.orders(id,order_type,customer_id,amount)VALUES(6,102,100,100020);

dbpartition BY mod_hash ( id ) tbpartition BY mod_hash ( id ) tbpartitions 1 dbpartitions 2; 这句代办分库分表

dbpartition:代办对库进行分片

tbpartition:代表对表进行分片

mod_hash :根据该方法指定哪个列去分区

tbpartitions:指定表有几个分区

dbpartitions:指定库有几个分区

配置关联表

关联表也成为绑定表或者ER表。表示数据逻辑上有关联性的两个或多个表,例如订单和订单详情表。对于关联表,通常希望他们能够有相同的分片规则,这样在进行关联查询时,能够快速定位到同一个数据分片中。

#在 Mycat 终端创建一个与order表关联的订单详情表CREATE TABLE shardingdb.orders_detail( `id` BIGINT NOT NULL, `detail` VARCHAR(2000), `order_id` INT,PRIMARY KEY(id))ENGINE=INNODB DEFAULT CHARSET=utf8 dbpartition BY mod_hash(order_id) tbpartition BY mod_hash(order_id) tbpartitions 1;#查看关联关系表/*+ mycat:showErGroup{}*/INSERT INTOshardingdb.orders_detail(id,detail,order_id) VALUES(1,'detail1',1);INSERT INTOshardingdb.orders_detail(id,detail,order_id) VALUES(2,'detail1',2);INSERT INTOshardingdb.orders_detail(id,detail,order_id) VALUES(3,'detail1',3);INSERT INTOshardingdb.orders_detail(id,detail,order_id) VALUES(4,'detail1',4);INSERT INTOshardingdb.orders_detail(id,detail,order_id) VALUES(5,'detail1',5);INSERT INTOshardingdb.orders_detail(id,detail,order_id) VALUES(6,'detail1',6);

补充:

1.单表分布式组件,创建表的时候设置自增ID,保持全局ID唯一性

2.MOD_HASH

如果分片值是字符串则先对字符串进行hash转换为数值类型
分库键和分表键是同键
分表下标=分片值%(分库数量*分表数量)
分库下标=分表下标/分表数量
分库键和分表键是不同键
分表下标= 分片值%分表数量
分库下标= 分片值%分库数量

3.RANGE_HASH

RANGE_HASH(字段1,字段2, 截取开始下标)
仅支持数值类型,字符串类型
当时字符串类型时候,第三个参数生效
计算时候优先选择第一个字段,找不到选择第二个字段如果是字符串则根据下标截取其后部分字符串,然后该字符串hash成数值
根据数值按分片数取余
要求截取下标不能少于实际值的长度
两个字段的数值类型要求一致

4. RIGHT_SHIFT

RIGHT_SHIFT(字段名,位移数)
仅支持数值类型
分片值右移二进制位数,然后按分片数量取余

5.YYYYMM

仅用于分库
(YYYY*12+MM)%分库数MM 是 1-12

6.YYYYWEEK 支持分库分表

(YYYY*54+WEEK)%分片数

WEEK的范围是1-53