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