数据库中间件Mycat介绍详解
- 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介绍详解相关推荐
- 分布式数据库中间件Mycat介绍
从Cobar到Mycat,从闭源到开源,作为一个开源的分布式数据库中间件,Mycat已经被众多开源项目使用.本文简要介绍下Mycat的特性.基本架构以及分库分表和读写分离的配置. 1.Mycat基本介 ...
- 分布式数据库中间件Sharding-JDBC介绍
前文中介绍了分布式数据库中间件Mycat的一些特性,作为对比本文简要介绍Sharding-JDBC的一些特性以及分片的实现原理,进行对比分析以了解. 1.ShardingSphere介绍 Shardi ...
- 分布式数据库中间件 MyCat 安装及使用
分布式数据库中间件 MyCat 安装及使用 关于 MyCat 的铺垫文章已经写了三篇了: MySQL 只能做小项目?松哥要说几句公道话! 北冥有 Data,其名为鲲,鲲之大,一个 MySQL 放不下! ...
- 数据库mysql_row_MYSQL数据库mysql found_row()使用详解
<MYSQL数据库mysql found_row()使用详解>要点: 本文介绍了MYSQL数据库mysql found_row()使用详解,希望对您有用.如果有疑问,可以联系我们. mys ...
- oracle tns 代理配置_oracle数据库tns配置方法详解
TNS简要介绍与应用 Oracle中TNS的完整定义:transparence Network Substrate透明网络底层,监听服务是它重要的一部分,不是全部,不要把TNS当作只是监听器. TNS ...
- docker二进制安装mysql_Docker搭建MySQL读写分离主从模式 分布式数据库中间件Mycat分库分表应用...
一.MySQL读写分离主从模式 1. 下载镜像 docker pull mysql 当前最新版本:mysql Ver 8.0.19 for Linux on x86_64 (MySQL Communi ...
- mysql数据库的函数_详解数据库_MySQL: mysql函数
一.内置函数 1.数学函数 rand() round(num) ceil(num) floor(num) 随机 四舍五入 向上取整 向下取整 2.字符串函数 length() 字节长度 char_le ...
- Discuz3.数据库数据表字典详解(完整版)
Discuz3.数据库数据表字典详解(完整版) 转自:https://discuzt.cr180.com/discuzcode-db.html pre_common_admincp_cmenu后台菜单 ...
- 开源分布式数据库中间件MyCat架构简介(一)——基于MyCat的分库分表,读写分离,水平切分和垂直切分实现原理
目录 前言 开源分布式数据库中间件MyCat架构简介--MyCat源起 一.数据库切分概述:OLTP和OLAP 二.关系型数据库和NoSQL数据库 三.关系型数据库和NoSQL数据库的特点及优缺点 1 ...
最新文章
- socket通信时如何判断当前连接是否断开--select函数,心跳线程,QsocketNotifier监控socket...
- html导入错误 wordpress,纯代码为WordPress压缩前端html代码 附BUG修复
- css画带边框三角形,纯CSS画三角形(带边框)
- 【SDOI2013】项链【莫比乌斯反演】【Polya定理】【递推式求通项】【数论】
- 测试一体机ASM failgroup的相关问题处理
- 通过SQL直接插入、修改ArcGIS SDE空间表中的数据
- vj p1025题解
- centos中python3.9,django3.2连接mysql
- 23种设计模式之适配器模式代码实例
- Ubuntu18.04卸载QQ
- 新手如何使用JavaScript读取json文件
- Week 1——Machine learning by Pro.Andrew Ng (cousera)——notebook
- 感知机为什么不能表示“异或”?
- ARM LINUX 扩展串口
- Teams app 的 SSO 机制
- 关于以太坊公开的4个测试网络的区别:
- 【经验教程】京东Plus会员怎么领取赠送的京东读书VIP会员?
- python画图代码星星-python画星星
- Egret Wing3编译时“输出”显示乱码而且编译终止
- OpenVINO™手写字符识别模型与使用
热门文章
- 2016全球大数据战略版图剖析(6):应用篇下
- Xmanager快速连接Linux图形界面教程
- PE-CE P in MPLS network网络术语
- android 仿苹果 小组件,安卓仿ios14桌面小部件
- Java内部类与异常类(上机实践二)
- 大学物理·第7章恒定磁场
- 例3.2 计算存款利息。有1000元,存一年。(1)活期,年利率为r1,(2)一年期定期,年利率为r2,(3)存两年半年定期,年利率为r3。
- 2020-10-02
- HTML <table>标签(表格)
- 英语会话必须掌握的五种基本结构[转]