MySQL-中间件mycat(一)

article/2025/10/6 6:18:10

4b424f35f2de4fcd8480289320c2ac92.gif

目录

🍁mycat基础概念

🍁Mycat安装部署

🍃初始环境

🍃测试环境

🍃下载安装

🍃修改配置文件

🍃启动mycat

🍃测试连接


    🦐博客主页:大虾好吃吗的博客

    🦐MySQL专栏:MySQL专栏地址

        mycat目前已经出mycat2版本了,虽然还没有全面普及,但是大概这两年各大企业逐步升级mycat2,但是mycat1还是要有一定的了解。本次mycat分三章讲解,熟悉mycat1后,可以去官网下载一个mycat2学习。官网地址:上海云业网络科技有限公司

mycat基础概念

一、什么是MyCat

  1. 一个彻底开源的,面向企业应用开发的大数据库集群

  2. 支持事务、ACID,通过远程可以直接当做数据库使用

  3. 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群

  4. 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server

  5. 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品

  6. 一个新颖的数据库中间件产品

二、为什么使用MyCat

        如今随着互联网的发展,数据的量级也是撑指数的增长,从GB到TB到PB。对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求。这个时候NoSQL的出现暂时解决了这一危机。它通过降低数据的安全性,减少对事务的支持,减少对复杂查询的支持,来获取性能上的提升。但是,在有些场合NoSQL一些折衷是无法满足使用场景的,就比如有些使用场景是绝对要有事务与安全指标的。这个时候NoSQL肯定是无法满足的,所以还是需要使用关系性数据库。如何使用关系型数据库解决海量存储的问题呢?此时就需要做数据库集群,为了提高查询性能将一个数据库的数据分散到不同的数据库中存储,为应对此问题就出现了——MyCat

综上所述:Mycat作用为:能满足数据库数据大量存储;提高了查询性能。

  1. 读写分离

  2. 数据分片 垂直拆分(分库) 、 水平拆分(分表) 、 垂直+水平拆分(分库分表)

  3. 多数据源整合

三、数据库中间件对比

  1. Cobar属于阿里B2B事业群,始于2008年,在阿里服役3年多,接管3000+个MySQL数据库的schema, 集群日处理在线SQL请求50亿次以上。由于Cobar发起人的离职, Cobar停止维护。

  2. Mycat是开源社区在阿里cobar基础上进行二次开发,解决了cobar存在的问题,并且加入了许多新 的功能在其中。青出于蓝而胜于蓝。

  3. OneProxy基于MySQL官方的proxy思想利用c进行开发的, OneProxy是一款商业收费的中间件。舍 弃了一些功能,专注在性能和稳定性上。

  4. kingshard由小团队用go语言开发,还需要发展,需要不断完善。

  5. Vitess是Youtube生产在使用, 架构很复杂。不支持MySQL原生协议,使用需要大量改造成本。

  6. Atlas是360团队基于mysql proxy改写,功能还需完善,高并发下不稳定。

  7. MaxScale是mariadb(MySQL原作者维护的一个版本) 研发的中间件

  8. MySQLRoute是MySQL官方Oracle公司发布的中间件

四、支持的数据库

支持MySQL、ORACLE、SQLServer等一些主流的数据库。

五、核心技术(分库分表)

数据库分片指:通过某种特定的条件,将我们存放在一个数据库中的数据分散存放在不同的多个数据库(主机)中,这样来达到分散单台设备的负载,根据切片规则,可分为以下两种切片模式MyCAT通过定义表的分片规则来实现分片,每个表格可以捆绑一个分片规则,每个分片规则指定一个分片字段并绑定一个函数,来实现动态分片算法。

  1. Schema:逻辑库,与MySQL中的Database(数据库)对应,一个逻辑库中定义了所包括的Table。

  2. Table:逻辑表,即物理数据库中存储的某一张表,与传统数据库不同,这里的表格需要声明其所存储的逻辑数据节点DataNode。在此可以指定表的分片规则。

  3. DataNode:MyCAT的逻辑数据节点,是存放table的具体物理节点,也称之为分片节点,通过DataSource来关联到后端某个具体数据库上

  4. DataSource:定义某个物理库的访问地址,用于捆绑到Datanode上

六、分片规则

        前面讲了数据切分,一个大表被分成若干个分片表,就需要一定的规则,这样按照某种业务规则把数据分到某个分片的规则就是分片规则,数据切分选择合适的分片规则非常重要,将极大的避免后续数据处理的难。

Mycat安装部署

拓扑图如下:

c964daf97ed248868a22291a6735b5aa.png

初始环境

master和slave搭建主从复制,这里就搭建一个简单地主从关系就可以。

1. master开启二进制日志、server_id

[root@master ~]# vim /etc/my.cnf
server_id=1
log_bin=mysql-bin
[root@master ~]# systemctl restart mysqld
[root@master ~]# mysql -uroot -p123             #登录mysql创建主从连接用户
#省略登录信息
mysql> grant replication slave on *.* to rep@'192.168.8.%' identified by '123';
Query OK, 0 rows affected, 1 warning (0.00 sec)
​
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000005 |      446 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

2. slave指定server_id、指定maste为8.20

[root@slave ~]# vim /etc/my.cnf 
server_id=2
[root@slave ~]# systemctl restart mysqld
[root@slave ~]# mysql -uroot -p123              #登录mysql指定主为8.20
#省略登录信息
mysql> change master to-> master_user='rep',-> master_host='192.168.8.20',-> master_port=3306,-> master_password='123',-> master_log_file='mysql-bin.000005',-> master_log_pos=446;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
​
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
​
mysql> show slave status\G
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.8.20Master_User: repMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000005Read_Master_Log_Pos: 446Relay_Log_File: slave-relay-bin.000002Relay_Log_Pos: 320Relay_Master_Log_File: mysql-bin.000005Slave_IO_Running: YesSlave_SQL_Running: Yes
#省略部分内容

测试环境

1. master创建库、表、插入数据

mysql> create database mytest character set utf8;
Query OK, 1 row affected (0.01 sec)
​
mysql> use mytest
Database changed
mysql> create table tb1(-> id int primary key,-> name varchar(20));
Query OK, 0 rows affected (0.01 sec)
​
mysql> insert into tb1 values(1,'z3');
Query OK, 1 row affected (0.08 sec)
​
mysql> grant all on *.* to root@'%' identified by '123';                #提前创建一个root的远程用户,权限可以根据需求提供,如果没有创建,mycat则没有权限查看数据
Query OK, 0 rows affected, 1 warning (0.01 sec)

2. slave查看数据

mysql> select * from mytest.tb1;
+----+------+
| id | name |
+----+------+
|  1 | z3   |
+----+------+
1 row in set (0.00 sec)

下载安装

1. 下载及安装

jdk:要求jdk必须是1.7及以上版本

Mysql:推荐mysql是5.5以上版本

Mycat:Mycat的官方网站:上海云业网络科技有限公司

下载地址: GitHub - MyCATApache/Mycat-download Mycat有windows、linux多种版本。

第一步:下载Mycat-server-xxxx-linux.tar.gz

第二步:将压缩包解压缩。建议将mycat放到/usr/local/mycat目录下。

第三步:进入mycat目录,启动mycat./mycat start 停止:./mycat stop

mycat支持的命令{ console | start | stop | restart | status |dump } Mycat的默认端口号为:8066

2. 配置文件的相关配置

①schema.xml: 定义逻辑库,表、分片节点等内容

②rule.xml: 定义分片规则

③server.xml: 定义用户以及系统相关变量,如端口等

准备好jdk、mycat软件包,解压到相应目录。

[root@mycat src]# tar zxf jdk-8u131-linux-x64.tar.gz 
[root@mycat src]# mv jdk1.8.0_131/ /usr/local/java
[root@mycat src]# tar zxf Mycat-server-1.6.7.6-release-20220524173810-linux.tar.gz 
[root@mycat src]# mv mycat/ /usr/local/mycat
[root@mycat src]# vim /etc/profile                      #添加path路径
export JAVA_HOME=/usr/local/java
export MYCAT_HOME=/usr/local/mycat
export PATH=$JAVA_HOME/bin:$PATH:$MYCAT_HOME/bin
[root@mycat src]# source /etc/profile
[root@mycat src]# java -version                         #查看jdk版本
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
[root@mycat src]# cd /usr/local/mycat/conf/

修改配置文件

1. 修改server.xml 修改用户信息,与MySQL区分, 如下:

[root@mycat conf]# vim server.xml

76d170f0cc6c4f57934cb92909fb6ec3.png

2 . 修改schema.xml,这里只需要修改IP(如下图所示),其他的注释信息也被我删掉了,方便查看。

[root@mycat conf]# vim schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
​<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1"></schema><dataNode name="dn1" dataHost="localhost1" database="mytest" /><dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100"><heartbeat>select user()</heartbeat><!-- can have multi write hosts --><writeHost host="hostM1" url="jdbc:mysql://192.168.8.20:3306" user="root"password="123"><readHost host="hostS1" url="jdbc:mysql://192.168.8.30:3306" user="root"password="123"></readHost></writeHost></dataHost>
</mycat:schema>

06c985df6d584e0a9e38c37bec74fcf5.png

启动mycat

[root@mycat conf]# mycat console
或者
[root@mycat conf]# mycat start

测试连接

slave测试等mycat,用户名为mycat,密码默认为123456,端口8066.

[root@slave ~]# mysql -umycat -p123456 -h 192.168.8.10 -P8066
#省略登录信息
mysql> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB   |
+----------+
1 row in set (0.00 sec)mysql> use TESTDB
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql> show tables;
+------------------+
| Tables_in_mytest |
+------------------+
| tb1              |
+------------------+
1 row in set (0.01 sec)mysql> select * from tb1;
+------+------+
| id   | name |
+------+------+
|    1 | z3   |
+------+------+
1 row in set (0.49 sec)

至此mycat部署完成,后面还将针对文件的详细信息,详细讲解。


http://chatgpt.dhexx.cn/article/Z2A5CdSb.shtml

相关文章

MySQL 分表方案及中间件介绍

背景 什么情况下需要分表&#xff1f;这里归纳了3点&#xff1a; (1)某个表被操作的频率过于频繁的时候&#xff08;可以查看某个表的访问频繁&#xff09;&#xff0c;在流量越来越大的时&#xff0c;可以考虑分表。 (2)某个表的数据量过于庞大的时候&#xff08;我给自己设…

中间件之MYSQL

体系结构 server层 负责建立连接、分析和执行 SQL 连接器&#xff1a;与客户端进行TCP三次握手&#xff1b;校验用户名和密码&#xff1b;读取权限。查询缓存&#xff1a;key-value缓存在mysql8.0后默认将其关闭&#xff1b;高级版本默认采用页缓存。解析器&#xff1a;词法…

mysql优化——mycat数据库中间件

文章目录 目录 文章目录 前言 一、mycat原理 二、mycat完成读写分离 2.1搭建MySQL的主从模式 2.2实现读写分离 三、mycat垂直分库 四、水平分表 五、水平拆分表的连表操作 六、全局表 总结 前言 Mycat是数据库中间件,所谓中间件,是一类连接软件组件和应用的计算机软件,以…

mysql中间件汇总

一、写在前面 mysql作为互联网公司都会用到的数据库&#xff0c;在使用过程中。会用主从复制来提高性能。会用分库分表解决写入问题。以下介绍mysql中间件的一些实现方案 二、Atlas Atlas时 360 公司开发维护的一个基于MySQL协议的数据中间层项目。 2.1 atlas架构 Atlas是一…

makfile的编译选项:CFLAGS、CPPFLAGS、LDFLAGS、LIBS

1、LDFLAGS & LIBS 关于makefile的依赖规则以及目标生成的步骤&#xff0c;这篇先不介绍&#xff0c;这里主要关注我在看makefile时遇到的一堆CFLAGS与LDFLAGS定义进行说明。 费了牛劲&#xff0c;才查到GNUmake中文手册中关于CFLAGS与LDFLAGS的说明&#xff0c;他们都是…

Makefile 编译与链接选项及CFLAGS与LDFLAGS说明

CFLAGS与LDFLAGS的说明&#xff0c;他们都是是隐含规则的变量&#xff0c;且是一种命令参数变量&#xff0e; makefile内嵌隐含规则的命令中&#xff0c;所使用的变量都是预定义的变量。我们将这些变量称为“隐含变量”。这些变量允许对它进行修改&#xff1a;在Makefile中、通…

Go新项目-项目添加版本说明,以及参数传递:ldflags、gcflags,外加stripped说明(5)

在Go项目中&#xff0c;会存在展示该项目的版本信息&#xff0c;以及打包日期&#xff0c;项目版本&#xff0c;Go版本等&#xff1b;继Go新项目-编译项目的细节&#xff08;4&#xff09;以后再记录下编译优化方向&#xff0c;刚好也有项目版本输出的需求。 关键词&#xff1…

linux编译参数CPPFLAGS、CFLAGS、LDFLAGS参数的理解

参考到下面博客&#xff0c;把编译步骤分解的很细 linuxC编译参数CPPFLAGS、CFLAGS、LDFLAGS参数的理解 - yongfengnice - 博客园 CPPFLAGS : 预处理器需要的选项 如&#xff1a;-I (大写i指定头文件路径) CFLAGS&#xff1a;编译的时候使用的参数 –Wall –g -c LDFLAGS &…

【Java位运算】异或运算的使用

异或运算有个特性&#xff1a;两个相同的数做异或运算&#xff0c;结果为0。 n ^ n 0;常用的方式是查找数组中只出现一次的数字。 例如&#xff1a;在一个数组中&#xff0c;只有一个数字出现了一次&#xff0c;其余数字都出现了两次。 求这个数字。利用异或运算的特性进行计…

java中与运算,或运算,异或运算

Java的位运算符详解实例——与&#xff08;&&#xff09;、非&#xff08;~&#xff09;、或&#xff08;|&#xff09;、异或&#xff08;^&#xff09; 位运算符主要针对二进制&#xff0c;它包括了&#xff1a;“与”、“非”、“或”、“异或”。从表面上看似乎有点像逻…

Java中的与、或、非以及异或( | ~ ^)运算符的运算原理

首先&#xff0c;我们要知道Java存储数据是保存的补码&#xff0c;如果对原码、反码以及补码不太懂&#xff0c;可以参考我的另一篇博客。 1. Java的 与( & ) 运算 所有的逻辑运算都是按位计算的&#xff0c;所以第一步就是先把数据转成二进制&#xff0c;然后相应位进行…

java运算符 与()、非(~)、或(|)、异或(^)

欢迎大家关注我的公众号【老周聊架构】&#xff0c;Java后端主流技术栈的原理、源码分析、架构以及各种互联网高并发、高性能、高可用的解决方案。 位运算符主要针对二进制&#xff0c;它包括了&#xff1a;“与”、“非”、“或”、“异或”。从表面上看似乎有点像逻辑运算符&…

java中的异或非运算

一、java 与或非 操作 与&#xff08;&&#xff09;、非&#xff08;~&#xff09;、或&#xff08;|&#xff09;、异或&#xff08;^&#xff09; 1&#xff0e;与运算符 与运算符用符号“&”表示&#xff0c;其使用规律如下&#xff1a; 两个操作数中位都为1&#x…

java运算符异或(^)的用法

Java中的位运算符中有一个叫做异或的运算符&#xff0c;符号为&#xff08;^&#xff09;,其主要是对两个操作数进行位的异或运算&#xff0c;相同取0&#xff0c;相反取1。即两操作数相同时&#xff0c;互相抵消。 试例&#xff1a;13 与15 两个整数的异或 public static void…

一文搞懂 位运算 异或(Java实现)

提起异或想必很多小伙伴们既熟悉又陌生&#xff0c;熟悉是因为好像在离散数学或者学某个编程语言 时听过这个东西&#xff0c;而陌生呢&#xff0c;则是因为自己平时并没有用过&#xff0c;以至于当在某个场景 &#xff08;我猜是在看 题解或者某篇博客时&#xff09; 看到这…

java中异或运算的应用

java中异或运算(^)的应用 异或运算法则 1. a ^ b b ^ a   2. a ^ b ^ c a ^ (b ^ c) (a ^ b) ^ c;   3. d a ^ b ^ c 可以推出 a d ^ b ^ c.   4. a ^ b ^ a b. 异或运算 1、异或是一个数学运算符。应用于逻辑运算。   2、例如&#xff1a;真异或假的结果是…

java的异或运算

一、题目 输入两个数&#xff0c;交换后输出 二、解题思路 一开始学习的语言是c语言&#xff0c;里面非常有特色的是指针&#xff0c;通过传引用可以直接交换两个数。但java无法达成这种操作&#xff0c;翻阅资料找到了一种有趣的解法&#xff1a;异或! 异或原理&#xff1a; …

java基础-异或运算

小伙伴们&#xff0c;你们好呀&#xff01;我是老寇&#xff01; 异或运算主要用于判断两个值是否一样 异或运算的3个性质&#xff1a; 1.任何数和0进行异或运算&#xff0c;结果是原来的数&#xff0c;即b⊕0b 2.任何数和其自身进行异或运算&#xff0c;结果为0&#xff0c;即…

Java中的异或运算符^

Testpublic void test2() {int a2;int b3;aa^b;ba^b;aa^b;System.out.println("a"a",b"b);}第一种&#xff1a;用真实值计算 ^是异或运算符&#xff0c;异或的规则是转换成二进制比较&#xff0c;相同为0&#xff0c;不同为1. 一个数a与另一个数b异或的结果…

java中的异或运算

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是Rockey&#xff0c;不知名企业的不知名Java开发工程师 &#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&#x1f44d;一下博主哦 &#x1f4dd;联系方式&#xff1a;he18339193956&…