阅读(4213) (13)

Mycat2 入门

2021-09-08 09:42:59 更新

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

本文仅描述最核心的内容:

  1. 启动服务
  2. 添加数据源(2个SQL)
  3. 添加集群(1个SQL)
  4. 学会建库(1个SQL)
  5. 学会创建单表、分片表、全局表(3个SQL)

入门 Mycat2

右侧的MySQLMycat2的配置里面叫做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

该语句执行两个操作:

  1. 更改 mycat 的整个库配置。
  2. 在 prototype 服务器执行此 SQL

Mycat可以在控制台操作。

切换逻辑库:

USE `db1`;

该语句执行两个操作:

  1. 更改 mycat 的整个库配置。
  2. 在 prototype 服务器执行此 SQL

删除逻辑库:

DROP DATABASE db1

该语句执行两个操作:

  1. 更改 mycat 的整个库配置。
  2. 在 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;

建表语句执行两个操作:

  1. 更改 mycat 的整个库配置。
  2. 在 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

删除语句执行两个操作:

  1. 更改 mycat 的整个库配置。
  2. 在 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;

建全局表语句执行操作:

  1. 更改 mycat 的整个库配置。
  2. 在 prototype 服务器执行此 SQL。
  3. 根据当前集群名字首字母为c的集群纳入到全局表的存储节点中。
  4. 根据存储节点信息建立物理库、物理表。

创建分片表:

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;

建分片表语句执行操作:

  1. 更改 mycat 的整个库配置。
  2. 在 prototype 服务器执行此 SQL。
  3. 根据当前集群名字首字母为c的集群纳入到分片表的存储节点中。
  4. 根据存储节点信息建立物理库、物理表。

默认分片表的自增序列是雪花算法

显示存储节点:

/*+ mycat:showDataNodes{//1.18前
    "schemaName":"db1",
    "tableName":"normal"
} */;


/*+ mycat:showTopology{//1.18后
    "schemaName":"db1",
    "tableName":"normal"
} */;

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

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

通过注释配置

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

/*+ mycat:repairPhysicalTable{} */;