利用Docker搭建一套Mycat2+MySQL8一主一从、读写分离的最简单集群(保姆教程)

1、Mycat介绍

1.1、mycat简介

Mycat是一套布式数据库中间件(虚拟数据库类),它本身并不存储数据库。

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2、mycat重要概念

  • 逻辑库schema、逻辑表:虚拟的逻辑上的库表
    业务开发人员通常在实际应用中并不需要知道中间件的存在,只需 要关注数据库,所以数据库中间件可以被当作一个或多个数据库集 群构成的逻辑库;逻辑库,与MySQL中的Database(数据库)对应,⼀个逻辑库中定义了所包括的Table。
  • 全局表
  • 数据源:真实的mysql数据库
  • 集群配置json

1.3、Mycat1.x与Mycat2功能对比

功能 1.6版本 2 版本
多语句 不支持 支持
blob值 支持一部分 支持
全局二级索引 不支持 支持
任意跨库join(包含复杂查询) catlet支持 支持
分片表与分片表JOIN查询 ER表支持 支持
关联子查询 不支持 支持一部分
分库同时分表 不支持 支持
存储过程 支持固定形式的 支持更多
支持逻辑视图 不支持 支持
支持物理视图 支持 支持
批量插入 不支持 支持
执行计划管理 不支持 支持
路由注释 支持 支持
集群功能 支持 支持更多集群类型
自动hash分片算法 不支持 支持
支持第三方监控 支持mycat-web 支持普罗米斯,kafka日志等监控
流式合拼结果集 支持 支持
范围查询 支持 支持
单表映射物理表 不支持 支持
XA事务 弱XA 支持,事务自动恢复
支持MySQL8 需要更改mysql8的服务器配置支持 支持
虚拟表 不支持 支持
joinClustering 不支持 支持
union all语法 不支持 支持
BKAJoin 不支持 支持
优化器注释 不支持 支持
ER表 支持 支持
全局序列号 支持 支持
保存点 不支持 支持
离线迁移 支持 支持(实验)
增量迁移 CRC32算法支持 BINLOG追平(实验)
安全停机 不支持 支持(实验)
HAProxy协议 不支持 支持
会话粘滞 update后select会粘滞 update后select会粘滞且支持设置时间
全局表插入支持全局序列号 不支持 支持
全局表插入支持主表插入自增结果作为序列号 不支持 支持
外部调用的分片算法 不支持但可定制 支持

Mycat1.x跟Mycat2的配置完全不一样了。

1.2、主从复制原理

在这里插入图片描述
重点理解:通过三个线程的运行过程原理

    1. 主服务将数据的更新记录保存到二进制日志–主服务器线程
    1. 从服务将主服务的二进制日志复制到本地中继日志–从服务IO线程
    1. 从服务读取中继日志,更新本地数据–从服务SQL线程

2、前提准备

  1. 两台Linux服务器,配置为:8c32g5m/ CentOS Linux release 7.9.2009

  2. 都安装docker,docker版本信息如下:
    在这里插入图片描述

  3. 其中一台安装配置好jdk1.8 java环境,因为mycat是用java语言编写的,运行需要jdk环境。

在这里插入图片描述

3、集群规划

主机名 公网ip 内网地址 端口号 角色 用户名 密码
newvts-a 39.xxx.xxx.232 192.168.1.93 8066 mycat root xxxxxxxx
newvts-a 39.xxx.xxx.232 192.168.1.93 3307 master root xxxxxxxx
newvts-b 39.xxx.xxx.190 192.168.1.94 3308 slave root xxxxxxxx

其中 newvts-a这台机子安装mycat2和mysql8, newvts-b只安装mysql8。

4、安装和配置mysql主从复制

4.1、master节点安装mysql8容器

  1. 拉取mysql8镜像。
#docker拉取mysql8镜像
docker pull mysql:8.0.25
  1. master节点安装mysql,容器名称为:mysql-vts-master1
docker run -p 3307:3306 --name mysql-vts-master1 \
-v /mydata/mysql-vts-master/log:/var/log/mysql \
-v /mydata/mysql-vts-master/data:/var/lib/mysql \
-v /mydata/mysql-vts-master/conf:/etc/mysql \
-v /mydata/mysql-vts-master/mysql-files:/var/lib/mysql-files \
-e MYSQL_ROOT_PASSWORD=xxxxxxx \
-d mysql:8.0.25
  1. 修改/mydata/mysql-vts-master/conf目录下的my.cnf,注意server_id为101。
vim /mydata/mysql-vts-master/conf/my.cnf
[mysqld]

## 设置server_id,同一局域网中需要唯一
server_id=101 

## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  

## 开启二进制日志功能
log-bin=mall-mysql-bin  

## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  

## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  

## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  

## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。

## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
  1. 重启mysq-vts-master1容器
docker restart mysql-vts-master1
  1. master节点的mysql数据库中新建一个数据同步用户
#进入容器
docker exec -it mysql-vts-master1 /bin/bash
mysql -uroot -p
xxxxx

#新建一个数据同步用户,用户名为vts_slave
CREATE USER 'vts_slave'@'%' IDENTIFIED BY 'xxxxxx';
#给这个用户授予权限
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'vts_slave'@'%';
#考虑到我的MySQL8 ,密码密码必须修改为mysql_native_password的plugin才能被连接,不然无法连接
ALTER USER 'vts_slave'@'%' IDENTIFIED WITH mysql_native_password BY 'xxxxxx';
  1. 通过navicat连接master-mysql

测试连接成功!
在这里插入图片描述

4.2、slave节点安装mysql8容器

  1. 运行slave节点mysql8容器,端口号为3308;容器名:mysql-vts-slave1。
docker run -p 3308:3306 --name mysql-vts-slave1 \
-v /mydata/mysql-vts-slave/log:/var/log/mysql \
-v /mydata/mysql-vts-slave/data:/var/lib/mysql \
-v /mydata/mysql-vts-slave/conf:/etc/mysql \
-v /mydata/mysql-vts-slave/mysql-files:/var/lib/mysql-files \
-e MYSQL_ROOT_PASSWORD=xxxx \
-d mysql:8.0.25
  1. 修改/mydata/mysql-vts-slave/conf目录下的my.cnf,注意server_id为102
vim /mydata/mysql-vts-slave/conf/my.cnf
[mysqld]

## 设置server_id,同一局域网中需要唯一
server_id=102

## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  

## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin  

## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  

## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  

## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  

## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。

## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062  

## relay_log配置中继日志
relay_log=mall-mysql-relay-bin  

## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1  

## slave设置为只读(具有super权限的用户除外)
read_only=1
  1. 重启mysq-vts-slave1
docker restart mysql-vts-slave1
  1. navicat连接slave节点的mysql8
    测试连接成功!!

在这里插入图片描述

4.2、配置主从复制

  1. 进入主数据库 master容器,查看日志文件信息和位置标号。
#进入主数据库 master容器
docker exec -it mysql-vts-master1 /bin/bash
mysql -uroot -p
# xxxxxx

#在主数据库master容器中查看主从状态
show master status;

#记着下面两个值
# File mall-mysql-bin.000001
# Postion 1005

在这里插入图片描述

  1. 进入从数据库 slave容器 .在从数据库里面配置主从复制
#进入主数据库 slave
docker exec -it mysql-vts-slave1 /bin/bash
mysql -uroot -p
# xxxxxx

#在从数据库里面配置主从复制
change master to master_host='192.168.1.93', master_user='vts_slave', master_password='xxxxx', master_port=3307, master_log_file='mall-mysql-bin.000001', master_log_pos=1005, master_connect_retry=30;
  1. 在从数据库slave中开启主从同步、查看主从状态
#在从数据库中查看主从同步状态:
show slave status \G
#在从数据库中开启主从同步
start slave;
#在从数据库中查看主从同步状态:
show slave status \G

在这里插入图片描述

         Slave_IO_Running: Yes
        Slave_SQL_Running: Yes

这两个线程为yes,证明主从复制配置成功。

4.3、测试主从复制配置

  1. 在主数据库中创建库和表,从数据库中也相应自动创建跟主数据库一样的库和表;
  2. 主数据库中的表操作更新,删除,新增时,从数据库中的表也自动更新;
  3. 从数据库操作更新,删除,新增操作时,主数据库不会发生变化。

5、安装mycat2和配置读写分离集群

5.1、docker部署mycat2

mycat2镜像我使用的是docker仓库中的zhangyx1619/mycat2:mysql-1.2.1,再次感谢张同学分享的mycat2镜像,我用着很不错。

#拉取镜像
docker pull zhangyx1619/mycat2:mysql-1.2.1
#查看镜像信息,主要查看环境变量的信息
docker inspect zhangyx1619/mycat2:mysql-1.2.1

在这里插入图片描述

拥有以下环境变量需要根据实际情况进行设置

                "DATA_SOURCE_URL=jdbc:mysql://127.0.0.1:6606/mysql?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
                "DATA_SOURCE_USER=mycat",
                "DATA_SOURCE_PASSWORD=!@#123",
                "MYCAT_ROOT_PASSWORD=!@#123",
                "MYCAT_HOME=/usr/local/mycat"

这里我们先通过一下方式运行一个mycat2容器,然后进入此容器拷贝配置文件目录到宿主机

#首先运行一个mycat容器
docker run -d -p 8066:8066 -e DATA_SOURCE_URL=jdbc:mysql://192.168.1.93:3307/mysql  -e DATA_SOURCE_USER=root -e DATA_SOURCE_PASSWORD=xxxxx  -e MYCAT_ROOT_PASSWORD=xxxxx  --name mycat2  zhangyx1619/mycat2:mysql-1.2.1

#进入容器
docker exec -it 自己的容器id /bin/bash

#拷贝容器内部的mycat配置目录到宿主机
docker cp 03f518d53daf:/usr/local/mycat /usr/local/mycat2

#查看宿主机mycat2目录下的文件,确保conf logs两个文件夹的存在


#删除刚运行的容器
docker rm -f 03f518d53daf

#挂载数据卷(mycat2相应目录)重新运行zhangyx1619/mycat2:mysql-1.2.1,命令如下:
docker run -d -p 8066:8066 -e DATA_SOURCE_URL=jdbc:mysql://192.168.1.93:3307/mysql  -e DATA_SOURCE_USER=root -e DATA_SOURCE_PASSWORD=xxxxx -e MYCAT_ROOT_PASSWORD=xxxxx  -v /usr/local/mycat2/conf/:/usr/local/mycat/conf/ -v /usr/local/mycat2/logs/:/usr/local/mycat/logs/ --name mycat2  zhangyx1619/mycat2:mysql-1.2.1

#查看运行的容器
docker ps -a

在这里插入图片描述
mycat2容器运行了,再次查看logs下的wrapper.log

tail -f /usr/local/mycat2/logs/wrapper.log 

显示successful standlone,证明mycat2启动成功!

5.2、navicat连接mycat2

在这里插入图片描述

查看数据库,mycat2中能看到逻辑库了
在这里插入图片描述

5.3、配置主从集群信息实现读写分离

  1. mycat2中创建逻辑库
-- 创建逻辑库
CREATE  DATABASE vts_info_sys;

在这里插入图片描述

此时查看 /usr/local/mycat2/conf/schemas/ 发现mycat自动创建了配置文件vts_info_sys.schema.json

ll  /usr/local/mycat2/conf/schemas/

在这里插入图片描述

  • customTables放置的是mycat默认的表的配置
  • globalTables放置的是全局表的配置
  • shardingTables放置分片表的配置
  • normalTables放置普通表的配置
  1. 修改逻辑库json
-- 修改逻辑库 指定vts_info_sys逻辑库默认的targetName, mycat会自动加载vts_info_sys下已经有的物理表或者视图作为单表.
/*+ mycat:createSchema{
    
    
  "customTables":{
    
    },
  "globalTables":{
    
    },
  "normalTables":{
    
    },
  "schemaName":"vts_info_sys",
  "shardingTables":{
    
    },
  "targetName":"prototype"
} */;
  1. 创建数据源、查看数据源
#添加数据源
/*+mycat:createDataSource{
    
    "name":"vts_master1","url":"jdbc:mysql://192.168.1.93:3307/?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true","user":"root","password":"xxxx" } */;

/*+mycat:createDataSource{
    
    "name":"vts_slave1","url":"jdbc:mysql://192.168.1.94:3308/?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true","user":"root","password":"xxxx" } */;

#查看数据源
/*+ mycat:showDataSources{
    
    } */;

在这里插入图片描述

  1. 创建修改集群
#创建集群
/*!mycat:createCluster{
    
    "name":"vts_info_sys_rw_c","masters":["vts_master1"],"replicas":["vts_slave1"]} */;

#查看集群
/*+ mycat:showClusters{
    
    } */;

在这里插入图片描述

  1. 查询负载均衡策略readBalanceType
  • BALANCE_ALL( 默认值 ):获取集群中所有数据源
  • BALANCE_ALL_READ:获取集群中允许读的数据源
  • BALANCE_READ_WRITE:获取集群中允许读写的数据源 , 但允许读的数据源优先
  • BALANCE_NONE:获取集群中允许写数据源 , 即主节点中选择
  • switchType
    NOT_SWITCH: 不进行主从切换
    SWITCH: 进行主从切换
  1. 在逻辑库中配置数据源(集群名称)
vim  /usr/local/mycat2/conf/schemas/vts_info_sys.schema.json

在这里插入图片描述
重启Mycat

docker restart mycat2

6、测试

验证读写分离(登录Mycat)

首先,在mycat2中插入4条数据

#插入4条数据
INSERT INTO vts_info_sys.sys VALUES(1, "hh1");
INSERT INTO vts_info_sys.sys VALUES(2, "hh2");
INSERT INTO vts_info_sys.sys VALUES(3, "hh3");
INSERT INTO vts_info_sys.sys VALUES(4, "hh4");

在这里插入图片描述

然后,查看主数据库master1和从数据库slave1中,同时也直接了4条相同的数据

在这里插入图片描述
在这里插入图片描述
此时,我修改从数据库slave1中的第4条数据为hh444,主数据库master1中的数据不会发生改变(这符合主从复制的原理)
在这里插入图片描述

这时,我在mycat2中进行查询操作,可以看到查询语句在主从二个主机间切换;

在这里插入图片描述
在这里插入图片描述

至此,使用MyCat2搭建一主二从数据库集群完成。

在这里插入图片描述


平庸的人用热闹填补空虚,优秀的人则用独处成就自己。


猜你喜欢

转载自blog.csdn.net/weixin_43025151/article/details/143088381