MyCAT

(三)MyCAT 2 从入门到实战

·使用MyCAT分布式集群中间件,可以实现分库、分表、读写分离、负载均衡、故障(屏蔽)转移。

·MyCAT支持MySQL网络协议,可以使用MySQL的客户端进行操作。MyCAT是一个传统的数据库表,支持标准的SQL语句进行数据的操作。

官网网址:http://www.mycat.org.cn/

·作用:1)能满足数据库数据大量存储;

2)提高了查询性能;

3)实现读写分离,分库分表。

·使用java语言开发,需要安装java运行环境(jdk)

MyCAT2的安装⭐⭐⭐

# 安装JDK1.8

CentOS7: yum -y install java-1.8.0-openjdk.x86_64

Ubuntu22.04: apt install openjdk-8-jdk-headless

# 测试安装,显示java版本是1.8.0则为安装成功

java -version

# 安装MyCAT2

# 创建/usr/local/src

mkdir -p /usr/local/src

# 进入/usr/local/src目录

cd /usr/local/src

# 三种下载路径(两个安装包)

# 官方下载路径(经测试,目前失效了)

# wget http://dl.mycat.org.cn/2.0/install-template/mycat2-install-template-1.21.zip

# wget http://dl.mycat.org.cn/2.0/1.21-release/mycat2-1.21-release-jar-with-dependencies.jar

# 第三方下载

# wget https://download.topunix.com/MySQL/Software-Cluster/Software-Mycat/Mycat2/mycat2-install-template-1.20.zip

# wget https://download.topunix.com/MySQL/Software-Cluster/Software-Mycat/Mycat2/mycat2-1.21-release-jar-with-dependencies.jar

# 局域网下载(192.168.56.200)

wget http://192.168.56.200/Software/mycat2-install-template-1.21.zip

wget http://192.168.56.200/Software/mycat2-1.21-release-jar-with-dependencies.jar

# 解压并移动到/usr/local目录下

# 下载解压软件,已经安装的跳过

yum -y install unzip或者apt install unzip

# 解压Mycat2

unzip mycat2-install-template-1.21.zip

mv mycat ../

# 修改权限

cd /usr/local/mycat/

chmod +x bin/*

# 把所需的jar复制到mycat/lib目录 mycat2-1.21-release-jar-with-dependencies.jar是MyCAT2依赖文件,缺失会导致MyCAT启动失败

cp /usr/local/src/mycat2-1.21-release-jar-with-dependencies.jar /usr/local/mycat/lib/

# 启动mysql并登录root,验证底层 MySQL 服务是否正常可用,然后退出

service mysqld start

mysql -uroot -proot123

\q或者exit

# 配置物理库地址

vim /usr/local/mycat/conf/datasources/prototypeDs.datasource.json

全部改成以下+++++++++++++++++++++++++++++++++++++++++++++++

{

"dbType": "mysql",

"idleTimeout": 60000 ,

"initSqls": [],

"initSqlsGetConnection": true,

"instanceType": "READ_WRITE",

"maxCon": 1000 ,

"maxConnectTimeout": 3000 ,

"maxRetryCount": 5 ,

"minCon": 1 ,

"name": "prototypeDs",

"password": " root123 ",

"type": "JDBC",

"url": "jdbc:mysql://localhost:3306?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",

"user": " root ",

"weight": 0

}

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++

# 配置MyCAT和MySQL的环境变量

vim /etc/profile

在后面添加+++++++++++++++++++++++++++++++++++++++++++++++++

export MYCAT_PATH=/usr/local/mycat

export MYSQL_PATH=/usr/local/mysql

export PATH="MYSQL_PATH/bin:MYCAT_PATH/bin:$PATH"

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++

# ESC:wq退出文件:重新加载配置文件

source /etc/profile

# 启动mycat

cd /usr/local/mycat/bin

./mycat restart

# 查看logs/wrapper.log出现一串信息证明启动成功

cat /usr/local/mycat/logs/wrapper.log

# 连接MyCAT

MyCAT的默认用户是:root

初始密码是:123456

端口号是:8066

mysql -uroot -p123456 -P8066 -h127.0.0.1 或者mycli -uroot -P8066 -h"127.0.0.1"

cd /usr/local/mycat/bin

./mycat start 启动

./mycat stop 停止

./mycat console 前台运行

./mycat install 添加到系统自动启动

./mycat remove 取消随系统自动启动

./mycat restart 重启

./mycat pause 暂停

./mycat status 查看启动状态

补充内容------配置文件常见格式

(1)ini:xx.ini/xx.conf/xx.cnf/xx.repo

mysqld

base_dir=/usr/local/mysql

date_dir=/usr/local/mysql/data

...

(2)xml:标签语言,java项目,大数据。

Apache、TomCat

<?xml version="1.0" encoding="UTF-8"?>

<config>

<database>

<host>localhost</host>

<port>3306</port>

<credentials>

<user>admin</user>

<password>123456</password>

</credentials>

</database>

</config>

(3)json:JavaScript对象表示法。API 实现前后端数据交互。

MyCAT,

json

{

"database": {

"host": "localhost",

"port": 3306,

"credentials": {

"user": "admin",

"password": "123456"

},

"tables": ["users", "orders"]

}

}

(4)yaml:采用缩进表示层级关系,语法简洁,可读性强,支持复杂数据结构,如列表、字典等.

Doctor,KBS

# 数据库配置

database:

host: localhost

port: 3306

credentials:

user: admin

password: 123456

tables:

- users

- orders

终端提示符的颜色

MyCAT概念:

数据源:MyCAT用于连接后端的MySQL数据库,连接信息

·用户名、密码、IP

·datasources:设置数据源

# 创建数据源

/*+ mycat:createDataSource{

"dbType":"mysql",

"idleTimeout":60000,

"initSqls":[],

"initSqlsGetConnection":true,

"instanceType":"READ_WRITE",

"maxCon":1000,

"maxConnectTimeout":3000,

"maxRetryCount":5,

"minCon":1,

"name":"dc1",

"password":"root123",

"type":"JDBC",

"url":"jdbc:mysql://127.0.0.1:3306?useUnicode=true&serverTimezone=UTC&characterEncoding=UTF-8",

"user":"root",

"weight":0}

*/;

# 显示数据源

/*+ mycat:showDataSources{} */\G;

# 删除数据源

/*+ mycat:dropDataSource{

"dbType":"mysql",

"idleTimeout":60000,

"initSqls":[],

"initSqlsGetConnection":true,

"instanceType":"READ_WRITE",

"maxCon":1000,

"maxConnectTimeout":3000,

"maxRetryCount":5,

"minCon":1,

"name":"m1",

"type":"JDBC",

"weight":0}

*/;

MyCAT集群设置:

对后端MySQL进行组合设置,例如主、从、只读、读写、分库、分表

·clusters:设置集群

# 创建集群

/*! mycat:createCluster{

"clusterType":"MASTER_SLAVE",

"heartbeat":{

"heartbeatTimeout":1000,

"maxRetry":3,

"minSwitchTimeInterval":300,

"slaveThreshold":0

},

"masters":[ "dc1" //主节点 ],

"maxCon":2000,

"name":"c0",

"readBalanceType":"BALANCE_ALL",

"replicas":[ "dc2" //从节点 ],

"switchType":"SWITCH"}

*/ ;

# 显示集群

/*+ mycat:showClusters{} */;

# 删除集群

/*! mycat:dropCluster{ "name":"c0"} */;

MyCAT用户设置:users

配置文件位置/usr/local/mycat/conf/users/{用户名}.user.json。这个配置文件主要是用来配置MyCAT的登录用户的,也就是我们连接8066这个端口的用户信息。

{

"dialect": "mysql",

"ip": null,

"password": "123456",

"transactionType": "proxy",

"username": "root",

"isolation": 3

}

配置说明

1)dialect:数据库(方言)类型

2)ip:配置白名单使用,一般写null 如果要限制这个用户

3)password:配置MyCAT用户的密码(明文)

4)isolation:设置初始化的事务隔离级别

READ_UNCOMMITTED:1

READ_COMMITTED:2

REPEATED_READ:3

默认SERIALIZABLE:4

5)transactionType默认值:

proxy(本地事务,在涉及大于1个数据库的事务,commit阶段失败会导致不一致,但是兼容性最好)

可选值:xa(事务,需要确认存储节点集群类型是否支持XA) |

MyCAT逻辑库设置:schemas

·作用:配置MyCAT里面和MySQL对应的逻辑表。

配置位置:mycat/conf/schemas/{库名}.schema.json

{

"customTables": {},

"globalTables": {},

"normalTables": {},

"schemaName": "test",

"shardingTables": {},

"targetName": "prototype"

}

配置说明

1)customTables:自定义表

2)globalTables:全局表

3)normalTables:默认表

4)schemaName:库名

5)shardingTables:分片表

6)targetName:数据源名,也可以是集群名

MyCAT注释指令:

# 清空mycat所有配置

/*+ mycat:resetConfig{} */ ;

# 创建用户

/*+ mycat:createUser{

"username":"chen",

"password":"123456",

"ip":null,

"transactionType":"xa"}

*/;

# 查看用户

/*+ mycat:showUsers */;

# 删除用户

/*+ mycat:dropUser{ "username":"user"} */;

MyCAT2的主从配置⭐⭐⭐(在mycat操作)

前提,先搭建好MySQL的主从配置【如果恢复了先前配置好的主从复制,就在主服务器输入show master status;查看端口号和地址,再在从服务器上停止slave,重新同步】,登录MyCAT 2在MyCAT2里面操作,也就是连接8066这个端口。

# 重置配置

/*+ mycat:resetConfig{} */;

# 添加主库读写的数据源

/*+ mycat:createDataSource

{

"dbType": "mysql",

"idleTimeout": 60000,

"initSqls": [],

"initSqlsGetConnection": true,

"instanceType": "READ_WRITE",

"maxCon": 1000,

"maxConnectTimeout": 3000,

"maxRetryCount": 5,

"minCon": 1,

"name": "m1",

"password": "root123",

"type": "JDBC",

"url": "jdbc:mysql://192.168.221.20:3306?useUnicode=true&serverTimezone=UTC&characterEncoding=UTF-8",

"user": "root",

"weight": 0

}

*/;

# 添加从库读的数据源

/*+ mycat:createDataSource

{

"dbType": "mysql",

"idleTimeout": 60000,

"initSqls": [],

"initSqlsGetConnection": true,

"instanceType": "READ",

"maxCon": 1000,

"maxConnectTimeout": 3000,

"maxRetryCount": 5,

"minCon": 1,

"name": "m1s1",

"password": "root123",

"type": "JDBC",

"url": "jdbc:mysql://192.168.221.30:3306?useUnicode=true&serverTimezone=UTC&characterEncoding=UTF-8",

"user": "root",

"weight": 0

}

*/;

# 查询数据源

/*+ mycat:showDataSources{} */\G;

# 创建集群

/*! mycat:createCluster{

"clusterType":"MASTER_SLAVE",

"heartbeat":{

"heartbeatTimeout":1000,

"maxRetry":3,

"minSwitchTimeInterval":300,

"slaveThreshold":0

},

"masters":[

"m1"

],

"maxCon":2000,

"name":"prototype",

"readBalanceType":"BALANCE_ALL",

"replicas":[

"m1s1"

],

"switchType":"SWITCH"

} */;

# 查询集群

/*! mycat:showClusters{} */\G;

由于后面无法在db1里添加表,所以后面又删了重新创建库和表

------------------------------------------这步开始我省略------------------------------------------------------

# # 创建逻辑库

CREATE DATABASE db1 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

# # 退出mycat

exit;

# # 在conf/schemas/db1.schema.json里修改逻辑库的数据源

vim /usr/local/mycat/conf/schemas/db1.schema.json

## 在里面添加集群的名称,作用是让该集群生成并管理这个库的物理库

"targetName":"prototype",

------------------------------------------截止到这步我省略------------------------------------------------------

# 重启mycat

cd /usr/local/mycat/bin

./mycat restart

mysql -uroot -p123456 -P8066 -h127.0.0.1

# 查看数据库

show databases;

# 创建db2数据库,进入db2,创建表,添加数据

create database db2;

use db2;

create table sys_user(id bigint primary key, username varchar(200) not null, address varchar(500));

insert into sys_user(id,username,address) values(1,"xiaoming","wuhan");

# 主库、从库重复查看库和表的操作,同步就说明步骤正确