MyCAT 2从入门到放弃(一)


MyCAT 2 从入门到实战(一)

img

1. 【熟悉】MyCAT2简介

1.1 什么是MyCAT

MyCAT是目前最流行的分布式数据库中间插件,是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器。前端用户可以把它看作一个数据库代理,用MySQL客户端工具和命令行访问,其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。

MyCAT发展到目前,已经不是一个单纯的MySQL代理了,它的后端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流数据库,也支持MongoDB这种新型NoSQL方式的存储。未来,它还会支持更多类型的存储。

不过,无论是哪种存储方式,在最终用户看,MyCAT里都是一个传统的数据库表,支持标准的SQL语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅降低开发难度,提升开发速度。

img

更多解释见官网: http://www.mycat.org.cn/

项目地址:源码地址

https://github.com/MyCATApache/Mycat2

https://gitee.com/MycatOne/Mycat2

1.2 为什么使用MyCAT

img

随着互联网的发展,数据的量级也是呈指数的增长,从GB到TB到PB,操作数据也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求。

而NoSQL的出现暂时解决了这一危机。

NoSQL通过降低数据的安全性,减少对事务的支持,减少对复杂查询的支持,来提升性能。 但是,NoSQL存在无法满足某些使用场景的情况,比如,有些使用场景绝对要有事务与安全指标。这时NoSQL肯定无法满足。

所以,我们还是需要使用关系型数据库。

那么,如何使用关系型数据库解决海量存储的问题呢?此时就需要做数据库集群,为了提高查询性能将一个数据库的数据分散到不同的数据库中存储,为应对该问题,MyCAT 就出现了。

我们来总结一下MyCAT的作用:

1)能满足数据库数据大量存储;

2)提高了查询性能;

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

同时,MyCAT 还可以解决如下问题。

1)解决表的容量问题:MySQL的表最大存储多少数据?500W条。

2)解决表查询的性能问题?我的表里面的数据非常多,导致我查询很慢?

3)解决表的DML的性能问题?

4)解决MySQL挂了的问题。

那么,MyCAT是怎么解决上述问题的呢?我们接着往下看。

1.3 MyCAT解决问题的思路

1.3.1 容量

img

1.3.2 查询速度

最快也是Log(n),你加什么索引都不行。

img

1.3.3 写入问题

img

1.4 MyCAT和MySQL的区别

我们可以把上层看作是对下层的抽象,例如操作系统是对各类计算机硬件的抽象。那么我们什么时候需要抽象?

假设一个项目只需要一个人完成时,我们不需要Leader,但是当需要几十人完成时,就应该有一个管理者,发挥沟通协调等作用,这个管理者对于他的上层来说就是对项目组的抽象。

同样的,当我们的应用只需要一台数据库服务器时,我们并不需要MyCAT,如果你需要分库甚至分表,这时候应用要面对很多个数据库时,这时,就需要对数据库层做一个抽象,来管理这些数据库,最上面的应用只需要面对一个数据库层的抽象或者说数据库中间件就好了,这就是MyCAT的核心作用。

所以你可以这样理解:数据库是对底层存储文件的抽象,而MyCAT是对数据库的抽象。

1.5 支持的数据库

MyCAT 支持的数据库比较多,主要有:MySQL,SQL Server,MongoDB等。

img

1.6 架构

前端用户可以把MyCAT看作是一个数据库代理,用MySQL客户端工具(如Navicat)和命令访问,而后端支持MySQL、SQL Server、Oracle等主流数据库,用MySQL Native 协议和多个MySQL服务器通信,也可用JDBC协议与大多数主流数据库服务器通信,其核心功能就是分库分表,即将一个大表水平分割为N个小表,真正的存储在后端MySQL服务器中或其他数据库中

img

MyCAT原理:可以用“拦截”一词形容,它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析,如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实数据库,并将返回的结果做适当处理,最终返回给用户。

2. 【掌握】MyCAT2名词解释

2.1 分库分表

按照一定规则把数据库中的表拆分为多个带有数据库实例、物理库、物理表访问路径的分表(重点)。

2.2 逻辑库

数据库代理中的数据库,它可以包含多个逻辑表(重点)。

2.3 逻辑表

数据库代理中的表,它可以映射代理连接的数据库中的表(物理表)(重点)。

2.4 物理库

数据库代理连接的数据库中的库,比如MySQL上的information_schema(重点)。

2.5 物理表

数据库代理连接的数据库中的表,比如MySQL上的information_schema.TABLES(重点)。

2.6 拆分键

即分片键,描述拆分逻辑表的数据规则的字段(重点)。

2.7 分区键

当使用等值查询的时候,能直接映射一个分区的拆分键(重点)。

2.8 物理分表

指已经进行数据拆分的,在数据库上面的物理表,是分片表的一个分区。

2.9 物理分库

一般指包含多个物理分表的库。

2.10 分库

一般指通过多个数据库拆分分片表,每个数据库一个物理分表,物理分库名字相同。

2.11 分片表、水平分片表

按照一定规则把数据拆分成多个分区的表,在分库分表语境下,它属于逻辑表的一种。

2.12 全局表(广播表)

每个数据库实例都冗余全量数据的逻辑表(重点)。

它通过表数据冗余,使分片表的分区与该表的数据在同一个数据库实例里,达到JOIN运算能够直接在该数据库实例里执行。它的数据一致一般是通过数据库代理分发SQL实现,也有基于集群日志的实现。

2.13 集群

多个数据节点组成的逻辑节点,在MyCAT2里,它是把对多个数据源地址视为一个数据源地址(名称),并提供自动故障恢复、转移、即实现高可用、负载均衡的组件。

2.14 数据源

连接后端数据库的组件,它是数据库代理中连接后端数据库的客户端。

2.15 schema(库)

在MyCAT2中配置表逻辑,视图等的配置。

3. 【掌握】MyCAT2的安装

3.1 前言

使用MyCAT 2要安装JDK,因为MyCAT 是基于JDK1.8开发的。

3.2安装JDK1.8

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

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

# 测试安装,显示java版本则为安装成功
java -version

openjdk version "1.8.0_392"
OpenJDK Runtime Environment Corretto-8.392.08.1 (build 1.8.0_392-b08)
OpenJDK 64-Bit Server VM Corretto-8.392.08.1 (build 25.392-b08, mixed mode)

3.3 安装MyCAT2

3.3.1 创建/usr/local/src

mkdir -p  /usr/local/src

3.3.2 进入/usr/local/src目录

cd /usr/local/src

3.3.3 下载

# 如果没有wget
# CentOS7安装wget
yum -y install wget

# Ubuntu22.04安装wget
apt install wget
# 官方下载路径(经测试,目前失效了)
# 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.3.200)
wget http://192.168.3.200/Software/mycat2-install-template-1.21.zip
wget http://192.168.3.200/Software/mycat2-1.21-release-jar-with-dependencies.jar

3.3.4 下载完成

img

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

# CentOS7
yum -y install unzip

# Ubuntu22.04
apt install unzip

# 解压Mycat2
unzip mycat2-install-template-1.21.zip
mv mycat ../

3.3.6 修改权限

把bin目录的文件加执行权限:

cd /usr/local/mycat/
chmod +x  bin/*

3.3.7 把所需的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/

3.4 MyCAT的目录结构

img

其中:

1)bin 执行命令的目录

2)conf 配置文件

3)lib 依赖包

4)logs 日志包

3.5 启动一个3306的MySQL

回为mycat代理连接启动时需要有一个默认的数据源,所以我们在启动的时候先为其准备一个数据源,启动mysql

service mysqld start #启动mysql服务
mysql -uroot -proot123 # 能够连接而上mysql

3.6 配置物理库地址

在启动之前我们要配置物理库的地址,要不然MyCAT启动就会报错。

配置文件位置: /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
}

3.7 启动MyCAT

cd /usr/local/mycat/bin
./mycat start 启动
./mycat stop 停止
./mycat console 前台运行
./mycat install 添加到系统自动启动
./mycat remove 取消随系统自动启动
./mycat restart 重启
./mycat pause 暂停
./mycat status 查看启动状态


## 可以配置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

3.7.1 查看logs/wrapper.log文档看错

cat /usr/local/mycat/logs/wrapper.log 如果出现下面的信息就说明启动成功了。

img

3.8 连接MyCAT

我们在外面看MyCAT,认为MyCAT 就是一个MySQL,怎么连接MySQL?

  • MyCAT的默认用户是:root
  • 初始密码是:123456
  • 端口号是:8066

1) 使用MySQL默认客户端或者mycli命令行登陆MyCAT

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

2) Navicat for MySQL 对MyCAT支持查询

image-20240911115415450

3) SQLyog 操作MyCAT更友好

img

img

如果出现上面的弹出框,说明MyCAT安装成功。