柚子快报邀请码778899分享:数据库中间件Mycat介绍详解

http://yzkb.51969.com/

1. Mycat介绍1.1. 什么是Mycat1.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安装与启动

柚子快报邀请码778899分享:数据库中间件Mycat介绍详解

http://yzkb.51969.com/

相关阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: