数据库中间件Mycat介绍详解


下一篇: Mycat安装与启动

1. Mycat介绍

1.1. 什么是Mycat

Mycat 是基于Java语言编写的数据库中间件
Mycat也是基于阿里开源的Cobar产品而研发,具有稳定性,可靠性。
其核心功能就是分库分表,配合数据库的主从模式还可以实现读写分离。
Mycat官网:http://www.Mycat.org.cn/
Mycat下载:http://dl.Mycat.org.cn/
注:互联网大多数应用的性能瓶颈都是数据库的瓶颈,数据库要承担大量的数据交互。特别是我们的数据库还是关系型数据库,性能比较差,大数据量下性能还是非常差。(十万级别数据性能)

1.2. 使用Mycat后的结构图

在这里插入图片描述

1.3. 为什么要用Mycat?

  • Java与数据库紧耦合;
  • 高访问量高并发对数据库的压力;
  • 读写请求数据不一致。

1.4. Mycat能干什么?

1.4.1. 读写分离

原理: 需要搭建主从模式,让主数据库(Master)处理事务性增、删、改操作(INSERT、DELETE、UPDATE),而从数据库(Slave)处理查询(SELECT)操作。
Mycat配合数据库本身的复制功能,可以解决读写分离的问题。
在这里插入图片描述

1.4.2. 数据分片

数据库分布式。
分库:
在这里插入图片描述
分表:
在这里插入图片描述
一张表的数据量太大,将表中的数据进行拆分,如user表拆分成:user_1、user_2、user_3等表。这些表也不一定存放在一个数据库中,可以将它们存放在不同的数据库中。这样做也形成了新的问题,怎么去哪个数据库表中查询用户?这就需要Mycat了,我们Java代码只要访问Mycat就行,Mycat通过配置(分配规则)去处理。


垂直拆分(分库)、水平拆分(分表)、垂直+水平拆分(分库分表)
在这里插入图片描述

1.4.3. 多数据源整合

在这里插入图片描述

1.5. Mycat原理

Mycat 的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的 SQL 语句,首先对 SQL语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此 SQL 发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。
原理:
应用向Mycat发送SQL, Mycat拦截SQL,经过各种分析,然后发给相应的数据源进行处理。
数据源将处理结果再响应给Mycat,Mycat经过各种处理,最后响应给应用。

在这里插入图片描述
上图分析:
(1)应用向Mycat发送查询orders订单的SQL,条件是prov=zhejiang。
(2)Mycat经过条件分析查找满足条件的数据源dn1。
(3)dn1处理完SQL后,将处理结果响应给Mycat,Mycat再经过处理响应给应用。

这种方式把数据库的分布式从代码中解耦出来,程序员察觉不出来后台使用 Mycat 还是MySQL。

1.6. 默认端口

MySQL默认端口是:3306
Mycat默认端口是:8066
Tomcat默认端口是:8080
Oracle默认端口是:1521
nginx默认端口是:80
http协议默认端口是:80
Redis默认端口是:6379

1.7. MySQL主从模式搭建实例(重)

1.7.1. 基于Docker的MySQL主从复制搭建

为什么基于Docker搭建?

  • 资源有限;
  • 虚拟机搭建对机器配置有要求,并且安装MySQL步骤繁琐;
  • 一台机器上可以运行多个Docker容器;
  • Docker容器之间相互独立,有独立IP,互不冲突;
  • Docker使用步骤简单,启动容器在秒级别。

1.7.1.1. 拉取MySQL 5.7镜像文件
docker pull mysql:5.7
1.7.1.2. 创建和启动主从容器

设置目录:
为了使MySQL的数据保持在宿主机上,先建立数据库存储目录:

mkdir -pv /root/docker/mysql/data

建立主服务器的配置目录

mkdir -pv /root/docker/mysql/data/master 

建立从服务器的配置目录

mkdir -pv /root/docker/mysql/data/slave

Master(主):

docker run -p 3306:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

Slave(从):

docker run -p 3307:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

注: Master对外映射的端口是3306,Slave对外映射的端口是3307。因为Docker容器是相互独立的,每个容器有其独立的IP,所以不同容器使用相同的端口并不会冲突。这里我们应该尽量使用MySQL默认的3306端口,否则可能会出现无法通过IP连接Docker容器内MySQL的问题。

开放3306端口:

firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload

测试:
Docker ps查看主从MySQL,并用Navicat等工具测试连接主从MySQL。
在这里插入图片描述

1.7.1.3. 配置Master(主)

进入主容器:

docker exec -it mysql-master /bin/bash

切换到/etc/mysql目录下

cd /etc/mysql

对my.cnf进行编辑

vi my.cnf

此时会报出bash: vi: command not found,需要我们在docker容器内部自行安装vim。

apt-get install vim

在这里插入图片描述
需要先执行 apt-get update命令,这个命令的作用是:同步/etc/apt/sources.list和/etc/apt/sources.list.d中列出的源的索引,这样才能获取到最新的软件包。
在这里插入图片描述
再执行apt-get install vim,就可以安装vim了:
在这里插入图片描述
在my.cnf中添加如下配置:

[mysqld] 
server-id=100      ## 同一局域网内要唯一,且要小于Slave的server_id
log-bin=mysql-bin   ## 开启二进制日志功能,可以随便取(关键),会生成一个

mysql-bin.000001的日志文件,Slave就是来读取该日志文件进行同步。

重启服务:
配置完成之后,需要重启MySQL服务使配置生效。

systemctl restart mysqld

或者

service mysql restart

在这里插入图片描述

重启mysql服务时会使得docker容器停止,我们还需要启动容器

docker start mysql-master

对Slave授权同步
在Master数据库创建数据同步用户,授予用户slave的REPLICATION SLAVE权限和REPLICATION CLIENT权限(必须吗?),用于在主从库之间同步数据。
#创建slave用户及密码

CREATE USER 'slave'@'%' IDENTIFIED BY '123456';

#授权

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

#二合一

GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456';

在mysql-master中查看日志:/var/lib/mysql
在这里插入图片描述

1.7.1.4. 配置Slave(从)

和配置Master(主)一样,在Slave配置文件my.cnf中添加如下配置:

[mysqld] 
server-id=101     ## 设置server_id,且要大于主库的server_id,注意要唯一 
log-bin=mysql-slave-bin   ## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用 
relay-log=edu-mysql-relay-bin  ## relay_log配置中继日志 

配置完成后也需要重启mysql服务和docker容器,操作和配置Master(主)一致。
注:不需要开放Slave访问授权

1.7.1.5. 链接Master(主)和Slave(从)

(1)在Master进入mysql,执行:

show master status;

在这里插入图片描述
说明:File和Position字段的值后面将会用到,在后面的操作完成之前,需要保证Master库不能做任何操作,否则将会引起状态变化,File和Position字段的值变化。

(2)在Slave中进入mysql,执行:

change master to master_host='192.168.26.130', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 2830, master_connect_retry=30;

简化:

change master to master_host='192.168.186.129', 
master_user='slave', 
master_password='123456', 
master_log_file='mysql-bin.000001';

在这里插入图片描述
说明:
master_host=‘192.168.26.130’ 对应主库地址
master_user=‘slave’ 访问主库的用户名
master_password=‘123456’ 密码
master_port=3306 端口号
master_log_file=‘mysql-bin.000002’ 读取的日志文件(对应Master主机中的日志文件

命令说明:
master_host :Master的地址,指的是容器的独立ip,可以通过docker inspect
–format=‘{{.NetworkSettings.IPAddress}}’ 容器名称|容器id查询容器的ip
master_port:Master的端口号,指的是容器的端口号
master_user:用于数据同步的用户
master_password:用于同步的用户的密码
master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒。

(3)在Slave 中的mysql终端执行:

show slave status \G;   #查看主从同步状态,\G格式

正常情况下,SlaveIORunning 和 SlaveSQLRunning 都是No,因为我们还没有开启主从复制过程。
在这里插入图片描述
(4)开启主从复制命令
start slave;
#关闭主从复制:stop slave;
然后再次查询主从同步状态:show slave status \G;
在这里插入图片描述
说明: SlaveIORunning 和 SlaveSQLRunning 都是Yes,说明主从复制已经开启。
此时可以测试数据同步是否成功。

1.7.1.6.主从复制排错

使用start slave;开启主从复制过程后,如果SlaveIORunning一直是Connecting,则说明主从复制一直处于连接状态,这种情况一般是下面几种原因造成的,我们可以根据Last_IO_Error提示予以排除。

  • 网络不通——检查ip,端口
  • 密码不对——检查是否创建用于同步的用户和用户密码是否正确
  • pos不对——检查Master的 Position

注意:
如果在排错中出现Error错误是UUIDs错误,则表示主从UUIDs是相同的,最大可能性就是文件是复制的,所以产生的UUIDs是相同的。
解决:先退出mysql,再编辑:vim /var/lib/mysql/auto.cnf,修改里面的编码即可。


1.7.1.7. 测试主从复制

测试主从复制方式就十分多了,最简单的是在Master创建一个数据库,然后检查Slave是否存在此数据库。
(1)在Master主库中创建db_abc库:
在这里插入图片描述
(2)在Slave从库中查看所有数据库:
在这里插入图片描述
以上我们就实现了MySQL的主从备份功能,接下来我们开始安装Mycat。

1.7.2. 准备:在Master主库和Slave从库都需要完成

  • 防火墙都开放3306端口;(或关闭防火墙)
    #将3306加入防火墙
firewall-cmd --zone=public --add-port=3306/tcp --permanent

#关闭防火墙

systemctl stop firewalld;
  • 保证root用户可以被Mycat访问(给权限);
  • 在Mycat中通过Master主库的root用户访问Master主库。
Grant all privileges on *.* to ‘root’@’%’ identified by ‘root’ with grant option;
Flush privileges;  

下一篇:Mycat安装与启动

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值