MySQL-中间件mycat(一)

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: MySQL-中间件mycat(一)

      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安装部署

拓扑图如下:

 

初始环境

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

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

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

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

1. [root@slave ~]# vim /etc/my.cnf 
2. server_id=2
3. [root@slave ~]# systemctl restart mysqld
4. [root@slave ~]# mysql -uroot -p123              #登录mysql指定主为8.20
5. #省略登录信息
6. mysql> change master to
7.     -> master_user='rep',
8.     -> master_host='192.168.8.20',
9.     -> master_port=3306,
10.     -> master_password='123',
11.     -> master_log_file='mysql-bin.000005',
12.     -> master_log_pos=446;
13. Query OK, 0 rows affected, 2 warnings (0.02 sec)
14. 
15. mysql> start slave;
16. Query OK, 0 rows affected (0.01 sec)
17. 
18. mysql> show slave status\G
19. *************************** 1. row ***************************
20.                Slave_IO_State: Waiting for master to send event
21.                   Master_Host: 192.168.8.20
22.                   Master_User: rep
23.                   Master_Port: 3306
24.                 Connect_Retry: 60
25.               Master_Log_File: mysql-bin.000005
26.           Read_Master_Log_Pos: 446
27.                Relay_Log_File: slave-relay-bin.000002
28.                 Relay_Log_Pos: 320
29.         Relay_Master_Log_File: mysql-bin.000005
30.              Slave_IO_Running: Yes
31.             Slave_SQL_Running: Yes
32. #省略部分内容

测试环境

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

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

2. slave查看数据

1. mysql> select * from mytest.tb1;
2. +----+------+
3. | id | name |
4. +----+------+
5. |  1 | z3   |
6. +----+------+
7. 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软件包,解压到相应目录。

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

修改配置文件

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

[root@mycat conf]# vim server.xml

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

1. [root@mycat conf]# vim schema.xml
2. <?xml version="1.0"?>
3. <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
4. <mycat:schema xmlns:mycat="http://io.mycat/">
5. 
6.         <schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
7.         </schema>
8.         <dataNode name="dn1" dataHost="localhost1" database="mytest" />
9.         <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
10.                           writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
11.                 <heartbeat>select user()</heartbeat>
12.                 <!-- can have multi write hosts -->
13.                 <writeHost host="hostM1" url="jdbc:mysql://192.168.8.20:3306" user="root"
14.                                    password="123">
15.                 <readHost host="hostS1" url="jdbc:mysql://192.168.8.30:3306" user="root"
16.                                    password="123"></readHost>
17.                 </writeHost>
18.                
19.         </dataHost>
20. </mycat:schema>

 

启动mycat

1. [root@mycat conf]# mycat console
2. 或者
3. [root@mycat conf]# mycat start

测试连接

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

1. [root@slave ~]# mysql -umycat -p123456 -h 192.168.8.10 -P8066
2. #省略登录信息
3. mysql> show databases;
4. +----------+
5. | DATABASE |
6. +----------+
7. | TESTDB   |
8. +----------+
9. 1 row in set (0.00 sec)
10. 
11. mysql> use TESTDB
12. Reading table information for completion of table and column names
13. You can turn off this feature to get a quicker startup with -A
14. 
15. Database changed
16. mysql> show tables;
17. +------------------+
18. | Tables_in_mytest |
19. +------------------+
20. | tb1              |
21. +------------------+
22. 1 row in set (0.01 sec)
23. 
24. mysql> select * from tb1;
25. +------+------+
26. | id   | name |
27. +------+------+
28. |    1 | z3   |
29. +------+------+
30. 1 row in set (0.49 sec)

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

 

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
SQL 关系型数据库 MySQL
②⑩① 【MySQL】什么是分库分表?拆分策略有什么?什么是MyCat?
②⑩① 【MySQL】什么是分库分表?拆分策略有什么?什么是MyCat?
46 0
|
2月前
|
关系型数据库 MySQL Java
MySQL单表膨胀优化之MyCat分库分表
MySQL单表膨胀优化之MyCat分库分表
35 0
|
4月前
|
关系型数据库 MySQL 中间件
企业实战(10)基于Maxscale中间件实现Mysql读写分离实战
企业实战(10)基于Maxscale中间件实现Mysql读写分离实战
|
4月前
|
关系型数据库 MySQL Java
为了把MySQL分库分表:MyCAT学明白,我花了近一个月的时间!
MySQL分库分表:MyCAT-问题描述 随着数据库存储的内容越来越多,MySQL主从复制也开始无法存储更多的数据,此时就需要切割表,把一张过大的表切割后分别存储在不同的MySQL中,以便存储更多的内容,承载更多的用户。此阶段出现的典型问题如下: (1)随着互联网的发展,数据的量级也呈指数级增长,从GB到TB再到PB。对数据的各种操作也愈加困难,传统的关系数据库已经无法满足快速查询与插入数据的需求。如何使单表数据量存储更大?甚至期望单表数据量可以“无限扩大”。 (2)MySQL本身是不支持读写分离的,MySQL只支持主从数据复制,读写功能需要重新开发,。有没有一种办法可以不用一次次重写这部
|
4月前
|
消息中间件 NoSQL 关系型数据库
【Kubernetes部署Shardingsphere、Mycat、Mysql、Redis、中间件Rocketmq、Rabbitmq、Nacos】
【Kubernetes部署Shardingsphere、Mycat、Mysql、Redis、中间件Rocketmq、Rabbitmq、Nacos】
|
4月前
|
关系型数据库 MySQL 中间件
MySQL实现分库分表代码实战(Mango中间件)
MySQL实现分库分表代码实战(Mango中间件)
|
5月前
|
监控 中间件 关系型数据库
MyCAT、ShardingSphere和Mocc这三个中间件的优缺点对比
MyCAT、ShardingSphere和Mocc这三个中间件的优缺点对比
|
7月前
|
SQL 网络协议 关系型数据库
mysql主从和mycat读写分离的安装及验证
最近需要将公司的d、t、p环境的mysql集群做梳理工作,所以就促使了自己对于mysql主从以及mycat读写分离的安装做了如下总结
|
7月前
|
关系型数据库 MySQL 中间件
mysql 中间件 mycat2 的详细安装及配置步骤
右上角下载里面有个文件下载服务,点进去发现无法访问
|
6月前
|
NoSQL Java Redis
阿里Java高级岗中间件二面:GC+IO+JVM+多线程+Redis+数据库+源码
虽然“钱多、事少、离家近”的工作可能离技术人比较远,但是找到一份合适的工作,其实并不像想象中那么难。但是,有些技术人确实是认真努力工作,但在面试时表现出的能力水平却不足以通过面试,或拿到高薪,其实不外乎以下 2 个原因: