mycat2

官网:MyCat2 (mycatone.top)

参考学习视频这可能是B站唯一把数据库中间件Mycat2讲的如此深入透彻的教程!_哔哩哔哩_bilibili

什么是mycat2?

Mycat是开源社区在阿里Cobar基础上进行二次开发的数据库中间件,也是目前最流行基于java语言编写的数据库中间件;是一个开源的分布式数据库系统,是一个实现了MySQL协议的的Server,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问(SQLyog、navicate),而其后端可以用MySQL原生(Native)协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。配合数据库的主从模式还可实现读写分离

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

在工作方式上,Mycat会部署成一个MySQL服务,程序员只需要像操作普通的单机MySQL服务一样去操作mycat,mycat再去完成分库分表功能,而后端的数据库产品,建议还是使用MySQL

为什么要用mycat2?

  1. 高访问量高并发对数据库的压力
  2. 读写请求数据不一致

功能

1.读写分离

在这里插入图片描述

2.分库分表

3.多数据源整合

原理

mycat的原理中最重要的一个动词就是拦截,它拦截了用户发送过来的SQL语句,首先按对SQL语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端真实数据库,并将返回的结果做适当的处理,最终在返回给用户。

在这里插入图片描述

相关概念

1.分库分表

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

分库:一个电商项目,分为用户库、订单库等等

分表:一张订单表数据数百万挑,达到mysql单表瓶颈,分到多个数据库中的多张表

2.逻辑库

数据库代理中的数据库,可以包含多个逻辑表

mycat里定义的表,在逻辑上存在,物理上在MySQL里并不存在,有可能是多个MySQL数据库共同组成一个逻辑库

一种映射,映射到后端真实的MySQL数据库

3.逻辑表

数据库代理中的表,可以映射代理连接的数据库中的物理表,可以一对一,可以一对多

4.物理库

MySQL真实数据库

5.物理表

MySQL真实数据库中的真实数据表

6.拆分键

分片键,描述拆分逻辑表的数据规则的字段

比如订单表可以按照归属的用户id拆分,用户id就是拆分键

7.原型库(prototype)

原型库就是mycat2后面的数据库,比如mysql库

原型库就是存储数据的真实数据库,配置数据源时必须指定原型库

安装部署

1.官网下载源码包

核心源码包jar包Index of /2.0/1.22-release/ (mycat.org.cn)

外壳zip包Index of /2.0/install-template/ (mycat.org.cn)

2.源码包整合

解压zip包,将jar包放入解压好的zip包的/mycat/lib目录下

在这里插入图片描述

3.将整合好的mycat源码包上传到linux的/usr/local目录下

[root@mysqlrouter1 lib]# ls
libwrapper-aix-ppc-32.a       libwrapper-linux-x86-32.so             libwrapper-macosx-universal-64.jnilib  mycat2-1.22-release-jar-with-dependencies-2022-10-13.jar
libwrapper-aix-ppc-64.a       libwrapper-linux-x86-64.so             libwrapper-solaris-sparc-32.so         wrapper.jar
libwrapper-hpux-parisc-64.sl  libwrapper-macosx-ppc-32.jnilib        libwrapper-solaris-sparc-64.so         wrapper-windows-x86-32.dll
libwrapper-linux-ppc-64.so    libwrapper-macosx-universal-32.jnilib  libwrapper-solaris-x86-32.so           wrapper-windows-x86-64.dll

4.修改文件权限,防止启动报错

[root@mysqlrouter1 mycat]# cd bin/
[root@mysqlrouter1 bin]# ls
mycat               wrapper-aix-ppc-64      wrapper-linux-x86-32   wrapper-macosx-universal-32  wrapper-solaris-sparc-64    wrapper-windows-x86-64.exe
mycat.bat           wrapper-hpux-parisc-64  wrapper-linux-x86-64   wrapper-macosx-universal-64  wrapper-solaris-x86-32
wrapper-aix-ppc-32  wrapper-linux-ppc-64    wrapper-macosx-ppc-32  wrapper-solaris-sparc-32     wrapper-windows-x86-32.exe
[root@mysqlrouter1 bin]# chmod 777 mycat
[root@mysqlrouter1 bin]# chmod 777 wrapper-linux-x86-64 
[root@mysqlrouter1 bin]# chmod 777 wrapper-linux-x86-32 
[root@mysqlrouter1 bin]# chmod 777 wrapper-linux-ppc-64 

在这里插入图片描述

5.mycat连接的MySQL数据库里添加授权用户

创建用户,用户名为mycat,密码为123456,赋权限·

root@(none) 01:14  mysql>create user 'mycat'@'%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)

root@(none) 01:15  mysql>grant all on *.* to 'mycat'@'%';
Query OK, 0 rows affected (0.00 sec)

root@(none) 01:16  mysql>flush privileges;
Query OK, 0 rows affected (0.00 sec)

6.修改mycat的prototype的配置

mycat2的本机mysql环境配置,因为mycat2是部署成一个mysql服务的,操作mycat2就像操作一样mysql一样

启动mycat之前需要确认prototype数据源对应的mysql数据库配置,修改对应的user用户,password密码,url中的ip

[root@mysqlrouter1 datasources]# vim prototypeDs.datasource.json 

{
        "dbType":"mysql",
        "idleTimeout":60000,
        "initSqls":[],
        "initSqlsGetConnection":true,
        "instanceType":"READ_WRITE",
        "maxCon":1000,
        "maxConnectTimeout":3000,
        "maxRetryCount":5,
        "minCon":1,
        "name":"prototypeDs",
        "password":"123456",---连接本机mysql数据库的用户密码
        "type":"JDBC",
        "url":"jdbc:mysql://192.168.31.153:3306/mydb1?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",---指定mysql主机的ip地址端口号和数据库
        "user":"mycat", ---远程连接mysql数据库的用户
        "weight":0
}

7.测试连接远程用户

[root@mysqlrouter1 datasources]# mysql -umycat -p'123456' -h 192.168.31.111
[root@mysqlrouter1 datasources]# mysql -umycat -p'123456' -h 192.168.31.153

8.启动mycat

[root@mysqlrouter1 bin]# pwd
/usr/local/mycat/bin
[root@mysqlrouter1 bin]# ./mycat start
Starting mycat2...

配置文件

1、服务( server)

服务相关配置 (1) 所在目录 mycat/conf 默认配置即可

2、用户( user)

配置用户相关信息 (1) 所在目录 mycat/conf/users (2) 命名方式 {用户名}.user.json (3) 配置内容

vim mycat/conf/users/root.user.json
{
"ip":null,
"password":"123456",
"transactionType":"xa",
"username":"root",
"isolation":3
}

#字段含义 #ip:访问本机mycat2客户端的ip,建议为空,填写后会对客户端的ip进行限制,只有本机的任意ip可以登录

username:用户名,默认为root

password:密码,默认为123456

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

READ_UNCOMMITTED:1 READ_COMMITTED:2 REPEATED_READ:3,默认 SERIALIZABLE:4

transactionType:事务类型

可选值: proxy 本地事务,在涉及大于 1 个数据库的事务,commit 阶段失败会导致不一致,但是兼容 性最好 xa 事务,需要确认存储节点集群类型是否支持 XA 可以通过语句实现切换 set transaction_policy = 'xa' set transaction_policy = 'proxy' 可以通过语句查询 SELECT @@transaction_policy

3、数据源( datasource)

配置Mycat连接的数据源信息

所在目录

mycat/conf/datasources

命名方式

{数据源名字}.datasource.json

配置内容
vim mycat/conf/datasources/ prototype. datasources.json
{
"dbType": "mysql",
"idleTimeout": 60000,
"initSqls": [],
"initSqlsGetConnection": true,
"instanceType": "READ_WRITE",
"maxCon": 1000,
"maxConnectTimeout": 3000,
"maxRetryCount": 5,
"minCon": 1,
"name": "prototype",
"password": "123456",
"type": "JDBC",
"url":
"jdbc:mysql://127.0.0.1:3306/mysql?useUnicode=true&serverTimezone=UTC",
"user": "root",
"weight": 0,
"queryTimeout":30,//mills
}
字段含义

dbType:数据库类型,mysql

name:数据源名称,在集群中加入数据源时会用到

password:连接后端真实数据库的用户密码

type:数据源类型,默认 JDBC

url:访问数据库地址,ip+端口+具体库表(也可以不接)

idleTimeout:空闲连接超时时间

initSqls:初始化sql

initSqlsGetConnection:对于 jdbc 每次获取连接是否都执行 initSqls

instanceType:配置实例只读还是读写

注意:在mycat2里,在集群中添加数据源信息时,数据源instanceType为读写时,设置为master节点,那么它可以读写;如果设置为slave,那么它只能读不能写。就是说instanceType不管配置成什么,如果该数据源作为从节点,那么只能读写。

可选值: READ_WRITE,READ,WRITE weight :负载均衡权重

连接相关配置

"maxCon": 1000, "maxConnectTimeout": 3000, "maxRetryCount": 5, "minCon": 1,

4、集群( cluster)

配置集群信息

所在目录

mycat/conf/clusters

命名方式

{集群名字}.cluster.json

配置内容
vim mycat/conf/clusters/prototype.cluster.json
{
"clusterType":"MASTER_SLAVE",
"heartbeat":{
"heartbeatTimeout":1000,
"maxRetryCount":3,//2021-6-4前是maxRetry,后更正为
maxRetryCount
"minSwitchTimeInterval":300,
"slaveThreshold":0
},
"masters":[ //配置多个主节点,在主挂的时候会选一个检测存活的数据源作
为主节点
"prototypeDs"
],
"replicas":[//配置多个从节点
"xxxx"
],
"maxCon":200,
"name":"prototype",
"readBalanceType":"BALANCE_ALL",
"switchType":"SWITCH"
////////////////////////////////////可选
//////////////////////////////////
,
"timer":{ //MySQL集群心跳周期,配置则开启集群心跳,Mycat主动检测主从延迟以
及高可用主从切换
"initialDelay": 30,
"period":5,
"timeUnit":"SECONDS"
},
//readBalanceName:"BALANCE_ALL",
//writeBalanceName:"BALANCE_ALL",
}
字段含义

clusterType:集群类型

可选值: SINGLE_NODE:单一节点 MASTER_SLAVE:普通主从 GARELA_CLUSTER:garela cluster/PXC 集群 MHA:MHA 集群 MGR:MGR 集群

readBalanceType:查询负载均衡策略

可选值: BALANCE_ALL(默认值) 获取集群中所有数据源 BALANCE_ALL_READ 获取集群中允许读的数据源 BALANCE_READ_WRITE 获取集群中允许读写的数据源,但允许读的数据源优先 BALANCE_NONE 获取集群中允许写数据源,即主节点中选择

switchType:切换类型

可选值: NOT_SWITCH:不进行主从切换 SWITCH:进行主从切换

4、逻辑库表( schema)

配置逻辑库表,实现分库分表

所在目录

mycat/conf/schemas

命名方式

{库名}.schema.json

配置内容
vim mycat/conf/schemas/mydb1.schema.json
#库配置
{
"schemaName": "mydb",
"targetName": "prototype"
}

schemaName:逻辑库名

targetName:目的数据源或集群

targetName自动从prototype目标加载test库下的物理表或者视图作为单表,prototype 必须是mysql服务器