首页 > 数据库 >MySQL学习笔记:mycat2原理与实现

MySQL学习笔记:mycat2原理与实现

时间:2023-05-14 22:31:44浏览次数:48  
标签:数据源 mycat2 mysql 笔记 mycat wrapper MySQL root 数据库

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服务器

标签:数据源,mycat2,mysql,笔记,mycat,wrapper,MySQL,root,数据库
From: https://blog.51cto.com/u_16070827/6275240

相关文章

  • LabVIEW数据库Mysql数据库操作;增加-删除-更新-查询;数据管理程序,完整案例,可移植。
    LabVIEW数据库Mysql数据库操作;增加-删除-更新-查询;数据管理程序,完整案例,可移植。ID:9299673612213945......
  • MySQL学习日志十一,常用函数,聚合函数及分组过滤,数据库级别的MD5加密
    点我跳转到菜鸟的函数总结在这里举几个例子吧--数学运算SELECTABS(-52)--取绝对值SELECTCEILING(5.4160)--向上取整SELECTFLOOR(4631.449613)--向下取整SELECTRAND()--返回一个0-1之间的随机数SELECTSIGN(-4510)--判断数字的正负,正数返回1,负数返回-1一堆......
  • 01构建之法阅读笔记
    《构建之法》一书深入浅出地解释了软件构建的重要性,并详细介绍了如何构建高质量、易于维护和可扩展的软件。书中提到,软件构建有许多方面,包括编码、测试、文档和版本控制等,而这些方面都有着各自的最佳实践和技巧,需要程序员不断学习和实践。此外,本书还介绍了敏捷开发、持续集成、代......
  • C基础笔记(数组)
    数组 声明一个数组,需要指定元素的类型和元素的数量数组都是以0作为它们第一个元素的索引,即0作为第一位存储数据数组是用来存储一系列数据(相同类型的变量)语法: 数组类型 数组名称[整型常量]#include<stdio.h>intmain(){intcj[10];//数组的定义cj......
  • pwn刷题笔记
    jarvisoj_level2(ret2text)checksec检查保护机制,开启了NX。vulnerable_function函数处存在栈溢出漏洞:buf只能存放0x88个字节,但可以读入0x100个字节。system函数plt地址:0x8048320ida查看字串,“/bin/sh”地址:0x804A024构造payload#!/usr/bin/envpython3frompwnimport*io......
  • 【MySQL--08】复合查询
    【MySQL--08】复合查询在之前我们对表的查询都是对一张表进行查询,再实际开发中这还远远不够。我们仍然使用雇员信息表scott_data.sql--使用source加上sql文件路径就可以讲表加入到数据库内--mysql>source/home/Lxy/mysql/mysql/lesson8/scott.sqlQueryOK,0rowsaffected......
  • 【2023 · CANN训练营第一季】进阶班笔记1
    1.在AscendCL中,关于媒体数据处理V1版本中的内存申请/释放接口acldvppMalloc/acldvppFree:该接口主要用于分配内存给Device侧媒体数据处理时使用,申请的大页内存满足数据处理的要求(例如,内存首地址128字节对齐)。调用该接口申请内存后,如果内存不使用,需及时调用acldvppFree接口释放内存频......
  • MySQL学习日志十,子查询和嵌套查询
    子查询where(这个值是计算出来的)先执行where里面的语句,之后执行外面的语句本质:where里面嵌套一个子查询语句查询参加高等数学考试的学生(学号,姓名。科目编号,成绩),降序排列--方式一:连接查询SELECTs.studentno,studentname,r.subjectno,studentresultFROMstudentsINNER......
  • Unreal Engine 大象无形学习笔记 (第一部分:虚幻C++编程)
    Q1.什么时候继承自UObject类,什么时候声明纯C++类?UObject自带功能:1.垃圾收集:继承自UObject并被标记为UProperty的变量,会被引擎自动进行生命周期管理。2.Referenceupdating引用自动更新3.反射4.序列化:纯C++类也可以手动实现5.Automaticupdatingofdefaultproperty......
  • 03-面试必会-Mysql篇
    1.Mysql查询语句的书写顺序Select[distinct]<字段名称>from表1[<join类型>join表2on<join条件>]where<where条件>groupby<字段>having<having条件>orderby<排序字段>limit<起始偏移量,行数>2.Mysql查询语句的执行顺序(8)Select(9)di......