Mycat2 入门
发现一些用户有个普遍认知:分库分表配置繁琐,而且需要大量文档来描述配置。这个认知是错误的!
本文仅描述最核心的内容:
- 启动服务
- 添加数据源(2个SQL)
- 添加集群(1个SQL)
- 学会建库(1个SQL)
- 学会创建单表、分片表、全局表(3个SQL)
入门 Mycat2
右侧的MySQL
在Mycat2
的配置里面叫做prototype
,专门用来响应兼容性SQL和系统表SQL。
什么是兼容性SQL?
客户端或者所在应用框架运行所需必须的SQL,但是用户一般接触不到,它们会影响客户端的启动和运行。而Mycat2对于这种SQL尽可能不影响用户使用。
什么是prototype服务器?
分库分表中间件中用于处理MySQL的兼容性SQL和系统表SQL的服务器,这个配置项可以指向一个服务器,也可以是一个集群,Mycat依赖它处理非select
,insert
,update
,delete
语句。当这个服务器是与第一个存储节点是同一个服务器/集群的时候,我们一般把它称之为0号节点。
prototype.cluster.json
{
"clusterType":"MASTER_SLAVE",
"heartbeat":{
"heartbeatTimeout":1000,
"maxRetry":3,
"minSwitchTimeInterval":300,
"slaveThreshold":0
},
"masters":[
"prototypeDs"
],
"maxCon":200,
"name":"prototype",
"readBalanceType":"BALANCE_ALL",
"switchType":"SWITCH"
}
当需要进行数据分片的时候,通过扩展存储节点。
入门(按顺序把下面的SQL在客户端执行一遍)
前提:
准备两个 MySQL 服务器(prototype 服务器)
端口:3306
,3307
用户名:root
密码:123456
Mycat2
的jar包。
Mycat服务器级别配置
保证配置文件由server.json
,内容至少是:
{
"server":{
"ip":"127.0.0.1",
"mycatId":1,
"port":8066,
"serverVersion": "5.7.33-mycat-2.0" //注意设置模拟的MySQL版本,与后端,客户端版本对应
}
}
启动请参考文档安装与启动
启动的过程中,Mycat会在配置文件夹生成默认配置,加载上述的MySQL中的系统表,并建立用户名为root
,密码为123456
。
此时使用客户端登录 Mycat 即可。
创建库:
CREATE DATABASE db1
该语句执行两个操作:
- 更改 mycat 的整个库配置。
- 在 prototype 服务器执行此 SQL
Mycat可以在控制台操作。
切换逻辑库:
USE `db1`;
该语句执行两个操作:
- 更改 mycat 的整个库配置。
- 在 prototype 服务器执行此 SQL
删除逻辑库:
DROP DATABASE db1
该语句执行两个操作:
- 更改 mycat 的整个库配置。
- 在 prototype 服务器执行此 SQL
创建单表:
CREATE TABLE db1.`travelrecord` (
`id` bigint NOT NULL AUTO_INCREMENT,
`user_id` varchar(100) DEFAULT NULL,
`traveldate` date DEFAULT NULL,
`fee` decimal(10,0) DEFAULT NULL,
`days` int DEFAULT NULL,
`blob` longblob,
PRIMARY KEY (`id`),
KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
建表语句执行两个操作:
- 更改 mycat 的整个库配置。
- 在 prototype 服务器执行此 SQL
使用注释动态配置 Mycat
如果使用 MySQL 官方客户端添加 -c
参数避免客户端过滤注释。
添加存储数据库:
/*+ mycat:createDataSource{
"name":"dw0",
"url":"jdbc:mysql://127.0.0.1:3306",
"user":"root",
"password":"123456"
} */;
/*+ mycat:createDataSource{
"name":"dr0",
"url":"jdbc:mysql://127.0.0.1:3306",
"user":"root",
"password":"123456"
} */;
/*+ mycat:createDataSource{
"name":"dw1",
"url":"jdbc:mysql://127.0.0.1:3307",
"user":"root",
"password":"123456"
} */;
/*+ mycat:createDataSource{
"name":"dr1",
"url":"jdbc:mysql://127.0.0.1:3307",
"user":"root",
"password":"123456"
} */;
添加集群配置:
/*! mycat:createCluster{"name":"c0","masters":["dw0"],"replicas":["dr0"]} */;
/*! mycat:createCluster{"name":"c1","masters":["dw1"],"replicas":["dr1"]} */;
删除表:
drop table db1.travelrecord
删除语句执行两个操作:
- 更改 mycat 的整个库配置。
- 在 prototype 服务器执行此 SQL,而不会在其他存储节点执行。
创建全局表:
CREATE TABLE db1.`travelrecord` (
`id` bigint NOT NULL AUTO_INCREMENT,
`user_id` varchar(100) DEFAULT NULL,
`traveldate` date DEFAULT NULL,
`fee` decimal(10,0) DEFAULT NULL,
`days` int DEFAULT NULL,
`blob` longblob,
PRIMARY KEY (`id`),
KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 BROADCAST;
建全局表语句执行操作:
- 更改 mycat 的整个库配置。
- 在 prototype 服务器执行此 SQL。
- 根据当前集群名字首字母为
c
的集群纳入到全局表的存储节点中。 - 根据存储节点信息建立物理库、物理表。
创建分片表:
CREATE TABLE db1.`travelrecord` (
`id` bigint NOT NULL AUTO_INCREMENT,
`user_id` varchar(100) DEFAULT NULL,
`traveldate` date DEFAULT NULL,
`fee` decimal(10,0) DEFAULT NULL,
`days` int DEFAULT NULL,
`blob` longblob,
PRIMARY KEY (`id`),
KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by mod_hash(id) tbpartition by mod_hash(id) tbpartitions 2 dbpartitions 2;
建分片表语句执行操作:
- 更改 mycat 的整个库配置。
- 在 prototype 服务器执行此 SQL。
- 根据当前集群名字首字母为
c
的集群纳入到分片表的存储节点中。 - 根据存储节点信息建立物理库、物理表。
默认分片表的自增序列是雪花算法。
显示存储节点:
/*+ mycat:showDataNodes{//1.18前
"schemaName":"db1",
"tableName":"normal"
} */;
/*+ mycat:showTopology{//1.18后
"schemaName":"db1",
"tableName":"normal"
} */;
上述的原型库与c0
实际上是同一个数据库使用创建了两个数据源进行连接。
由于直接更改本地配置比较繁琐,所以 mycat2 实现了使用注解来更改配置,可以把注解携程脚本,在客户端导入此脚本就可以,Mycat2 支持多语句执行。
通过注释配置。
如果物理表不存在,在 mycat2 能正常启动的情况下,根据当前配置自动创建分片表,全局表的物理表(但不自动创建单表的物理表)。
/*+ mycat:repairPhysicalTable{} */;