mycat2
参考学习视频这可能是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.分库分表
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服务器