发现一些用户有个普遍认识,分库分表配置繁琐,而且需要大量文档来描述配置.这是错误的.

1.21以后原型库不是必须的,就是没有配置原型库或者数据源配置错误错的情况下,mycat2也能够启动,但原型库的是单表的默认存储节点,所以,大部分场景是需要原型库.
本文仅描述最核心的内容
1.启动服务
2.添加数据源(2个SQL)
4.添加集群(1个SQL)
5.学会建库(1个SQL)
6.学会创建单表,分片表,全局表(3个SQL)

具体配置关系可以看
Mycat2配置映射关系(表)
[

](https://www.yuque.com/ccazhw/ml3nkf/le5tug)

入门Mycat2

image.png
右侧的MySQL在Mycat2的配置里面叫做prototype,专门用于响应兼容性SQL和系统表SQL。

什么是兼容性SQL?

客户端或者所在应用框架运行所需必须的SQL,但是用户一般接触不到,它们会影响客户端的启动,运行。而Mycat对于这种SQL尽可能不影响用户使用。

什么prototype服务器?

分库分表中间件中用于处理MySQL的兼容性SQL和系统表SQL(比如用于显示库,表的sql)的服务器,这个配置项可以指向一个服务器也可以是一个集群,Mycat依赖它处理非select,insert,update,delete语句。当这个服务器是与第一个存储节点是同一个服务器/集群的时候,人们一般叫它做0号节点。

prototype.cluster.json

  1. {
  2. "clusterType":"MASTER_SLAVE",
  3. "heartbeat":{
  4. "heartbeatTimeout":1000,
  5. "maxRetry":3,
  6. "minSwitchTimeInterval":300,
  7. "slaveThreshold":0
  8. },
  9. "masters":[
  10. "prototypeDs"
  11. ],
  12. "maxCon":200,
  13. "name":"prototype",
  14. "readBalanceType":"BALANCE_ALL",
  15. "switchType":"SWITCH"
  16. }

image.png
当需要进行数据分片的时候,通过扩展存储节点。

入门(按顺序把下面的SQL在客户端执行一遍)

前提:
准备两个MySQL服务器(prototype服务器),端口3306,3307 ,用户名:root 密码:123456
Mycat2的jar包

image.png

所以配置的顺序应该是自下而上,先建立数据源,再建立集群,最后配置表
但是做数据分布设计的时候是自上而下的,请不要混淆

Mycat服务器级别配置

保证配置文件夹有server.json,内容至少是

  1. {
  2. "server":{
  3. "ip":"127.0.0.1",
  4. "mycatId":1,
  5. "port":8066,
  6. "serverVersion": "5.7.33-mycat-2.0" //注意设置模拟的MySQL版本,与后端,客户端版本对应
  7. }
  8. }

启动请参考文档(安装与启动)
https://www.yuque.com/ccazhw/ml3nkf/1faac0f0187f3dda0acfbeeb9cc6656c
启动过程中,Mycat会在配置文件夹生成默认配置,加载上述的MySQL中的系统表,并建立用于连接mycat的用户名为
root 密码为123456
此时使用客户端登录Mycat即可
Mycat可以在控制台创建库

  1. //在mycat终端输入
  2. CREATE DATABASE db1

建库语句执行两个操作
1.更改mycat的整个库配置
2.在prototype服务器执行此SQL(1.21之后没有这个步骤)
Mycat可以在控制台操作

切换逻辑库
  1. //在mycat终端输入
  2. USE `db1`;

建表语句执行两个操作
1.更改mycat的整个库配置
2.在prototype服务器执行此SQL

删除逻辑库
  1. //在mycat终端输入
  2. DROP DATABASE db1

建表语句执行两个操作
1.更改mycat的整个库配置
2.在prototype服务器执行此SQL(1.21之后没有这个步骤)

创建单表
  1. //在mycat终端输入
  2. CREATE TABLE db1.`travelrecord` (
  3. `id` bigint NOT NULL AUTO_INCREMENT,
  4. `user_id` varchar(100) DEFAULT NULL,
  5. `traveldate` date DEFAULT NULL,
  6. `fee` decimal(10,0) DEFAULT NULL,
  7. `days` int DEFAULT NULL,
  8. `blob` longblob,
  9. PRIMARY KEY (`id`),
  10. KEY `id` (`id`)
  11. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

建表语句执行两个操作
1.更改mycat的整个库配置
2.在prototype服务器执行此SQL(1.21之后没有这个步骤)

使用注释动态配置Mycat

如果使用MySQL官方客户端添加 **-c** 参数避免客户端过滤注释

添加存储数据源
  1. //在mycat终端输入
  2. /*+ mycat:createDataSource{
  3. "name":"dw0",
  4. "url":"jdbc:mysql://127.0.0.1:3306/mysql",
  5. "user":"root",
  6. "password":"123456"
  7. } */;
  8. /*+ mycat:createDataSource{
  9. "name":"dr0",
  10. "url":"jdbc:mysql://127.0.0.1:3306/mysql",
  11. "user":"root",
  12. "password":"123456"
  13. } */;
  14. /*+ mycat:createDataSource{
  15. "name":"dw1",
  16. "url":"jdbc:mysql://127.0.0.1:3307/mysql",
  17. "user":"root",
  18. "password":"123456"
  19. } */;
  20. /*+ mycat:createDataSource{
  21. "name":"dr1",
  22. "url":"jdbc:mysql://127.0.0.1:3307/mysql",
  23. "user":"root",
  24. "password":"123456"
  25. } */;

jdbc:mysql://127.0.0.1:3306/mysql
此处的mysql按需配置
dw0与dr0,dw1与dr1是主从关系,是mysql的binlog同步数据,mycat不负责同步数据

添加集群配置
  1. //在mycat终端输入
  2. /*! mycat:createCluster{"name":"c0","masters":["dw0"],"replicas":["dr0"]} */;
  3. /*! mycat:createCluster{"name":"c1","masters":["dw1"],"replicas":["dr1"]} */;

删除表
  1. //在mycat终端输入
  2. drop table db1.travelrecord

删表语句执行两个操作
1.更改mycat的整个库配置
2.在prototype服务器执行此SQL(1.21之后没有这个步骤),而不会在其他存储节点执行

创建全局表
  1. //在mycat终端输入
  2. CREATE TABLE db1.`travelrecord` (
  3. `id` bigint NOT NULL AUTO_INCREMENT,
  4. `user_id` varchar(100) DEFAULT NULL,
  5. `traveldate` date DEFAULT NULL,
  6. `fee` decimal(10,0) DEFAULT NULL,
  7. `days` int DEFAULT NULL,
  8. `blob` longblob,
  9. PRIMARY KEY (`id`),
  10. KEY `id` (`id`)
  11. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 BROADCAST;

建全局表语句执行操作
1.更改mycat的整个库配置
2.在prototype服务器执行此SQL(1.21之后没有这个步骤,用于客户端显示逻辑表,因为此物理表与逻辑表相同名字)
3.根据当前集群名字首字母为c的集群纳入到全局表的存储节点中
4.根据存储节点信息建立物理库,物理表

创建分片表(分库分表)
  1. //在mycat终端输入
  2. CREATE TABLE db1.`travelrecord` (
  3. `id` bigint NOT NULL AUTO_INCREMENT,
  4. `user_id` varchar(100) DEFAULT NULL,
  5. `traveldate` date DEFAULT NULL,
  6. `fee` decimal(10,0) DEFAULT NULL,
  7. `days` int DEFAULT NULL,
  8. `blob` longblob,
  9. PRIMARY KEY (`id`),
  10. KEY `id` (`id`)
  11. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by mod_hash(id) tbpartition by mod_hash(id) tbpartitions 2 dbpartitions 2;

dbpartition by mod_hash(id) tbpartition by mod_hash(id) tbpartitions 2 dbpartitions 2;就是分库分表语法
建分片表语句执行操作
1.更改mycat的整个库配置
2.在prototype服务器执行此SQL(1.21之后没有这个步骤,用于客户端显示逻辑表,因为此物理表与逻辑表相同名字)
3.根据当前集群名字首字母为c的集群纳入到分片表的存储节点中
4.根据存储节点信息建立物理库,物理表
默认分片表的自增序列是雪花算法

显示存储节点,用于显示逻辑表的数据在哪里

  1. //在mycat终端输入
  2. /*+ mycat:showDataNodes{//1.18前
  3. "schemaName":"db1",
  4. "tableName":"normal"
  5. } */;
  6. /*+ mycat:showTopology{//1.18后
  7. "schemaName":"db1",
  8. "tableName":"normal"
  9. } */;

上述的原型库与c0实际上是同一个数据库使用创建了两个数据源进行连接

由于直接更改本地配置比较繁琐,所以mycat2实现了使用注解来更改配置.可以把注解写成脚本,在客户端导入此脚本就可以,Mycat2支持多语句执行
通过注解配置

在mycat2能正常启动的情况下,根据当前配置自动创建分片表,全局表的物理表(但不自动创建单表的物理表),如果物理表不存在

  1. //在mycat终端输入
  2. /*+ mycat:repairPhysicalTable{} */;//1.20-2020-7-17后,实验


检查存储节点上的表结构是否一致

  1. CHECK TABLE db1.travelrecord2;

[

上面介绍的方式是让用户从SQL操作入门Mycat2的,需要执行SQL后观察生成的配置文件是怎样的,然后理解.因为SQL的语法和表达对配置不是特别友好,实际使用上还需要调整配置文件的.如果调整过配置文件了就不要再执行SQL改表,这样会使配置被SQL生成的配置覆盖.另外Mycat的Alter语句在生产上的表是不能用的,需要用专门的软件执行Alter的.

](https://www.yuque.com/ccazhw/ml3nkf/f9f24306bbd3992c1baff00cdb0956a4)