• 1. Mycat介绍
    • 1.1. 什么是Mycat
    • 1.2. 使用Mycat后的结构图
    • 1.3. 为什么要用Mycat?
    • 1.4. Mycat能干什么?
      • 1.4.1. 读写分离
      • 1.4.2. 数据分片
      • 1.4.3. 多数据源整合
    • 1.5. Mycat原理
    • 1.6. 默认端口
    • 1.7. MySQL主从模式搭建实例(重)
      • 1.7.1. 基于Docker的MySQL主从复制搭建
        • 1.7.1.1. 拉取MySQL 5.7镜像文件
        • 1.7.1.2. 创建和启动主从容器
        • 1.7.1.3. 配置Master(主)
        • 1.7.1.4. 配置Slave(从)
        • 1.7.1.5. 链接Master(主)和Slave(从)
        • 1.7.1.6.主从复制排错
        • 1.7.1.7. 测试主从复制
      • 1.7.2. 准备:在Master主库和Slave从库都需要完成

下一篇: 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安装与启动

数据库中间件Mycat介绍详解相关推荐

  1. 分布式数据库中间件Mycat介绍

    从Cobar到Mycat,从闭源到开源,作为一个开源的分布式数据库中间件,Mycat已经被众多开源项目使用.本文简要介绍下Mycat的特性.基本架构以及分库分表和读写分离的配置. 1.Mycat基本介 ...

  2. 分布式数据库中间件Sharding-JDBC介绍

    前文中介绍了分布式数据库中间件Mycat的一些特性,作为对比本文简要介绍Sharding-JDBC的一些特性以及分片的实现原理,进行对比分析以了解. 1.ShardingSphere介绍 Shardi ...

  3. 分布式数据库中间件 MyCat 安装及使用

    分布式数据库中间件 MyCat 安装及使用 关于 MyCat 的铺垫文章已经写了三篇了: MySQL 只能做小项目?松哥要说几句公道话! 北冥有 Data,其名为鲲,鲲之大,一个 MySQL 放不下! ...

  4. 数据库mysql_row_MYSQL数据库mysql found_row()使用详解

    <MYSQL数据库mysql found_row()使用详解>要点: 本文介绍了MYSQL数据库mysql found_row()使用详解,希望对您有用.如果有疑问,可以联系我们. mys ...

  5. oracle tns 代理配置_oracle数据库tns配置方法详解

    TNS简要介绍与应用 Oracle中TNS的完整定义:transparence Network Substrate透明网络底层,监听服务是它重要的一部分,不是全部,不要把TNS当作只是监听器. TNS ...

  6. docker二进制安装mysql_Docker搭建MySQL读写分离主从模式 分布式数据库中间件Mycat分库分表应用...

    一.MySQL读写分离主从模式 1. 下载镜像 docker pull mysql 当前最新版本:mysql Ver 8.0.19 for Linux on x86_64 (MySQL Communi ...

  7. mysql数据库的函数_详解数据库_MySQL: mysql函数

    一.内置函数 1.数学函数 rand() round(num) ceil(num) floor(num) 随机 四舍五入 向上取整 向下取整 2.字符串函数 length() 字节长度 char_le ...

  8. Discuz3.数据库数据表字典详解(完整版)

    Discuz3.数据库数据表字典详解(完整版) 转自:https://discuzt.cr180.com/discuzcode-db.html pre_common_admincp_cmenu后台菜单 ...

  9. 开源分布式数据库中间件MyCat架构简介(一)——基于MyCat的分库分表,读写分离,水平切分和垂直切分实现原理

    目录 前言 开源分布式数据库中间件MyCat架构简介--MyCat源起 一.数据库切分概述:OLTP和OLAP 二.关系型数据库和NoSQL数据库 三.关系型数据库和NoSQL数据库的特点及优缺点 1 ...

最新文章

  1. socket通信时如何判断当前连接是否断开--select函数,心跳线程,QsocketNotifier监控socket...
  2. html导入错误 wordpress,纯代码为WordPress压缩前端html代码 附BUG修复
  3. css画带边框三角形,纯CSS画三角形(带边框)
  4. 【SDOI2013】项链【莫比乌斯反演】【Polya定理】【递推式求通项】【数论】
  5. 测试一体机ASM failgroup的相关问题处理
  6. 通过SQL直接插入、修改ArcGIS SDE空间表中的数据
  7. vj p1025题解
  8. centos中python3.9,django3.2连接mysql
  9. 23种设计模式之适配器模式代码实例
  10. Ubuntu18.04卸载QQ
  11. 新手如何使用JavaScript读取json文件
  12. Week 1——Machine learning by Pro.Andrew Ng (cousera)——notebook
  13. 感知机为什么不能表示“异或”?
  14. ARM LINUX 扩展串口
  15. Teams app 的 SSO 机制
  16. 关于以太坊公开的4个测试网络的区别:
  17. 【经验教程】京东Plus会员怎么领取赠送的京东读书VIP会员?
  18. python画图代码星星-python画星星
  19. Egret Wing3编译时“输出”显示乱码而且编译终止
  20. OpenVINO™手写字符识别模型与使用

热门文章

  1. 2016全球大数据战略版图剖析(6):应用篇下
  2. Xmanager快速连接Linux图形界面教程
  3. PE-CE P in MPLS network网络术语
  4. android 仿苹果 小组件,安卓仿ios14桌面小部件
  5. Java内部类与异常类(上机实践二)
  6. 大学物理·第7章恒定磁场
  7. 例3.2 计算存款利息。有1000元,存一年。(1)活期,年利率为r1,(2)一年期定期,年利率为r2,(3)存两年半年定期,年利率为r3。
  8. 2020-10-02
  9. HTML <table>标签(表格)
  10. 英语会话必须掌握的五种基本结构[转]