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

news2024/10/23 21:23:12

文章目录

    • 1、Mycat介绍
      • 1.1、mycat简介
      • 1.2、mycat重要概念
      • 1.3、Mycat1.x与Mycat2功能对比
      • 1.2、主从复制原理
    • 2、前提准备
    • 3、集群规划
    • 4、安装和配置mysql主从复制
      • 4.1、master节点安装mysql8容器
      • 4.2、slave节点安装mysql8容器
      • 4.2、配置主从复制
      • 4.3、测试主从复制配置
    • 5、安装mycat2和配置读写分离集群
      • 5.1、docker部署mycat2
      • 5.2、navicat连接mycat2
      • 5.3、配置主从集群信息实现读写分离
    • 6、测试

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-a39.xxx.xxx.232192.168.1.938066mycatrootxxxxxxxx
newvts-a39.xxx.xxx.232192.168.1.933307masterrootxxxxxxxx
newvts-b39.xxx.xxx.190192.168.1.943308slaverootxxxxxxxx

其中 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搭建一主二从数据库集群完成。

在这里插入图片描述


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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2221881.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【TDA】持续同调的矢量化方法

Topological deep learning: a review of an emerging paradigm 持续同调与深度学习协同下的3D点云分类_苏潇 Applications of Topology to Data Analysis Computational Topology: An Introduction 持续同调对于特征的方式有条形码PB和持续图表PD两种形式,它们包含了持续同调的…

Qt开发技巧(十八):新窗口控件用智能指针,将一些配置类变量封装起来,Qt窗体的Z序叠放,子窗体的释放,Qt中的事件发送,Qt的全局头文件

继续讲一些Qt开发中的技巧操作: 1.新窗口控件用智能指针 通过对Qt自带Examples的源码研究你会发现,越往后的版本,越喜欢用智能指针QScopedPointer来定义对象,这样有个好处就是用的地方只管new就行,一直new下去&#xf…

2025 年最佳的 Retool 开源替代方案

自 2017 年推出以来,Retool 已迅速成为开发者的热门选择。 Retool 的出现,填补了当时企业在快速构建内部工具上的空白。传统的应用开发往往需要耗费大量时间和资源,尤其是对于定制的内部业务应用。而 Retool 提供了一个灵活的平台&#xff0…

element设置时间和日期框早于现在的时间和日期禁用

效果: 今日此时此刻之前的日期、时间禁止选用,切换日期和时间为“2024-10-19 00:00:00",再切换为”2024-10-18 00:00:00"时, 会给form.time默认赋值为今日此时此刻(日期时间少于今日此时此刻则重新赋值) 安…

datax连接池泄漏问题排查及解决

1、问题描述 频繁调用datax服务(从oracle同步到mysql)出现报错,获取不到连接 oracle读取时报错信息 "errorMessage": "Code:[DBUtilErrorCode-10], Description:[连接数据库失败. 请检查您的 账号、密码、数据库名称、IP、…

print_hex_dump调试内核,嘎嘎香

本文首发于我的公众号 皮塞作坊 专注于干货分享,号欢迎大家关注,二维码文末可以扫。 公众号: 使用print_hex_dump调试内核/驱动,太香了 最近在验证芯片功能的过程中发现了一个好用的内核调试接口,print_hex_dump,除了直接打印16…

【AIGC】关键词智能匹配:AI驱动的RAG知识库检索技术全解析

随着大语言模型的快速发展,AI在知识获取和生成中的应用越发广泛。RAG(Retrieval-Augmented Generation)模型通过结合外部知识库,提升了生成文本的质量与准确性,而关键词搜索是其关键组成部分。本文将深入探讨AI如何通过…

【java】数组(超详细总结)

目录 一.一维数组的定义 1.创建数组 2.初始化数组 二.数组的使用 1.访问数组 2.遍历数组 3.修改数据内容 三.有关数组方法的使用 1.toString 2. copyOf 四.查找数组中的元素 1.顺序查找 2.二分查找binarySearch 五.数组排序 1.冒泡排序 2.排序方法sort 六.数组逆置…

LabVIEW伺服压机是如何实现压力位移的精度?

LabVIEW伺服压机通过精确的压力和位移控制,实现了高精度的压装操作。为了达到这种精度,系统通常依赖于多个硬件和软件模块的协同工作,包括伺服电机、压力传感器、位移传感器以及LabVIEW的实时控制和数据处理功能。以下是LabVIEW伺服压机如何实…

Linux修改npm的镜像源为淘宝镜像

起因:使用官方镜像源下载软件包速度太慢 1.查看npm当前镜像源命令 npm get registry 执行结果 2.还原为官方镜像源命令 npm config set registry https://registry.npmjs.org/ 3.修改为淘宝镜像命令 npm config set registry https://registry.npmmirror.com …

【你也能从零基础学会网站开发】 SQL Server结构化查询语言数据操作应用--DML篇 delete语句数据删除操作的使用方法

🚀 个人主页 极客小俊 ✍🏻 作者简介:程序猿、设计师、技术分享 🐋 希望大家多多支持, 我们一起学习和进步! 🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注 delete介绍与语…

关于武汉芯景科技有限公司的限流开关芯片XJ6288开发指南(兼容SY6288)

一、芯片引脚介绍 1.芯片引脚 二、系统结构图 三、功能描述 1.EN引脚控制IN和OUT引脚的通断 2.OCB引脚指示状态 3.过流自动断开

NC 单据模板自定义项 设置参照,比如部门参照、自定义参照等

NC 单据模板自定义项 设置参照(自定义参照) 一、如图下图,NC 单据模板自定义项 设置自定义参照: 1、选择需要设置参照的自定义字段,选择高级属性页签,在类型设置中,数据类型选择参照信息&#…

使用JUC包的AtomicXxxFieldUpdater实现更新的原子性

写在前面 本文一起来看下使用JUC包的AtomicXxxxFieldUpdater实现更新的原子性。代码位置如下: 当前有针对int,long,ref三种类型的支持。如果你需要其他类型的支持的话,也可以照葫芦画瓢。 1:例子 1.1:普…

Maven的进阶

目录 一、pom.xml文件 二、坐标 2.1 坐标的概念 2.2 坐标的意义 2.3 坐标的含义 2.4 在IDEA中查看项目的坐标 三、依赖 3.1 依赖的意义 3.2 依赖的使用 3.3 第三方依赖的查找使用方法 3.4 依赖的范围 3.5 依赖传递和可选依赖 3.5.1 依赖传递 3.5.2 依赖范围对传…

【前端】如何制作自己的网站(7)

以下内容接上文。 结合图片的超链接 将img元素作为内容,放在a元素中。即可为图片添加一个超链接。 例如右边的代码,点击头像就会打开“aboutme.html“。 点击右边的图片试试~ 两个非文本元素——图片与超链接。 从现在开始&#xff0…

蘑菇书(EasyRL)学习笔记(1)

1、强化学习概述 强化学习(reinforcement learning,RL)讨论的问题是智能体(agent)怎么在复杂、不确定的环 境(environment)里面去最大化它能获得的奖励。如下图所示,强化学习…

【Petri网导论学习笔记】Petri网导论入门学习(七) —— 1.5 并发与冲突

导航 1.5 并发与冲突1.5.1 并发定义 1.14定义 1.15 1.5.2 冲突定义 1.17 1.5.3 一般Petri网系统中的并发与冲突定义 1.18一般网系统中无冲撞概念阻塞(有容量函数K的P/T系统,类似于冲撞)一般Petri网中并发与冲突共存情况 1.5 并发与冲突 Petr…

计算机导论

概述 计算机简史 1935年代,英国数学家图灵(Alan Turing)提出“图灵机”,奠定了计算机的理论基础。 1952年,冯诺依曼确定了计算机由运算器、控制器、存储器、输入、输出等5部分组成(Von Neumann 体系结构)。 60年代…