当前位置: 首页 > news >正文

使用Docker 实现 MySQL 循环复制(三)

系列文章

使用Docker 实现 MySQL 循环复制(一)
使用Docker 实现 MySQL 循环复制(二)


目录

  • 系列文章
  • 1. 在主机上安装MySQL客户端
  • 2. 配置循环复制拓扑
    • 2.1 进入容器
    • 2.2 创建复制用户并授予复制权限
    • 2.3 复位二进制日志
    • 2.4 配置环形复制拓扑
    • 2.5 导入测试数据并测试复制功能
    • 2.6 研究一下 GTID 在 MySQL 复制中的重要作用
  • 3. 常见出错与解决方法


1. 在主机上安装MySQL客户端

dnf install -y mysql

在这里插入图片描述

在主机验证三个 mysql 容器,功能正常:

mysql -uroot -poracle -hdocker-host --port=3306 -e "show variables like 'server_id';" 
mysql -uroot -poracle -hdocker-host --port=3307 -e "show variables like 'server_id';"
mysql -uroot -poracle -hdocker-host --port=3308 -e "show variables like 'server_id';"
  • 通过命令行连接到 MySQL 数据库并查询 server_id 参数的值
  • -h docker-host 表示连接到本地主机,docker-host 是主机名
  • --port=3308 表示使用 3308 端口连接
  • -e 后面跟的是 SQL 查询语句,这里是 show variables like 'server_id',用于查看 server_id 参数的值
    在这里插入图片描述

2. 配置循环复制拓扑

分别进入三个 MySQL 容器内,配置循环复制拓扑。循环复制拓扑里,每个主机既是主服务器又是从属服务器。 要在主服务器上做的操作是:

  1. 创建用于执行复制的 repl 数据库用户
  2. 授予用户 replacation slave权限

要在从属服务器上做的操作是:

  1. 修改角色为slave
  2. 启动复制线程

2.1 进入容器

分别进入三个 MySQL 容器内:

docker exec -it mysql-3-mysql1-1 /bin/bash
docker exec -it mysql-3-mysql2-1 /bin/bash
docker exec -it mysql-3-mysql3-1 /bin/bash

在这里插入图片描述
然后连接MySQL服务器,并修改提示符:

mysql -uroot -p
prompt mysql-1>;	

在这里插入图片描述

2.2 创建复制用户并授予复制权限

在三个 mysql 上分别创建用于执行复制的 repl 数据库用户,口令为 oracle,并授予replacation slave权限。

  • 每个从服务器需要一个合法的账户来连接主服务器并拉取二进制日志(binlog)事件。创建一个专用的复制用户可以提供一个安全的身份验证机制,确保只有授权的从服务器可以连接到主服务器
  • REPLICATION SLAVE权限是必要的,因为它允许复制用户从主服务器读取二进制日志,这是复制过程的基础。没有这个权限,从服务器将无法从主服务器获取更新
CREATE USER 'repl' IDENTIFIED WITH mysql_native_password BY 'oracle';
GRANT REPLICATION SLAVE ON *.* TO 'repl';

在这里插入图片描述

2.3 复位二进制日志

然后分别在三个 mysql 数据库上执行 reset master;复位二进制日志,以防止重复创建 repl 用户:

RESET MASTER;

在这里插入图片描述

2.4 配置环形复制拓扑

配置mysql2 为 mysql1 的从属服务器;mysql3 为 mysql 2 的从属服务器;mysql1 为 mysql 3 的从属服务器。这样就形成了一个环形的复制拓扑结构。

所以要分别在三个MySQL里执行语句去修改角色为slave并启动复制线程。

mysql 1:

CHANGE MASTER TO 
master_host='192.168.30.128', 
MASTER_PORT=3308, 
MASTER_AUTO_POSITION=1; 
START SLAVE USER='repl' PASSWORD='oracle';

在这里插入图片描述

mysql 2:

CHANGE MASTER TO 
master_host='192.168.30.128', 
MASTER_PORT=3306, 
MASTER_AUTO_POSITION=1; 
START SLAVE USER='repl' PASSWORD='oracle';

在这里插入图片描述

mysql 3:

CHANGE MASTER TO 
master_host='192.168.30.128', 
MASTER_PORT=3307, 
MASTER_AUTO_POSITION=1; 
START SLAVE USER='repl' PASSWORD='oracle';

在这里插入图片描述

启动线程后检查从属服务器的状态:

show slave status\G

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

2.5 导入测试数据并测试复制功能

在 mysql-3-mysql1-1 容器上创建 world 库:
在这里插入图片描述
因为复制拓扑已经建立,所以另外两个容器上的MySQL数据库会同步数据,所以现在三个容器上都有world数据库了,下面在 mysql-3-mysql2-1 容器上导入 world 数据库,下载 world.sql 转储文件,在第三个容器(3308 端口)导入,并在三个数据库中检查数据是都同步。
我们先退出容器,然后下载world.sql 转储文件:

wget https://github.com/memories198/mysql-3/releases/download/mysql/world.sql

在这里插入图片描述
在第三个容器(3308 端口)导入:

mysql -u root -poracle -hdocker-host --port=3308 world < world.sql;

在这里插入图片描述
然后分别进入3个容器中查看数据是否同步:
在这里插入图片描述
在第二个容器中删除大于 4070 的行,检查三个数据库的数据一致性:
在这里插入图片描述

2.6 研究一下 GTID 在 MySQL 复制中的重要作用

GTID (Global Transaction ID) 是一种用于唯一标识数据库事务的方法。它由两部分组成:源服务器 ID 和一个递增的序列号。当一个事务被提交时,MySQL 自动为这个事务分配一个新的 GTID,并将其添加到 Executed_Gtid_Set 变量中。
Retrieved_Gtid_Set 表示已经从其他服务器接收并应用的 GTID,而 Executed_Gtid_Set 则表示在这个服务器上已经执行过的 GTID。

使用GTID的好处;

  1. 简化复制配置:使用 GTID 后,不再需要手动跟踪二进制日志文件名和位置,只需要指定主从关系即可。这大大简化了复制配置过程。
  2. 支持复杂的复制拓扑:GTID 允许更灵活的复制拓扑结构,如多源复制、环形复制等。这是因为 GTID 能够确保每个事务在整个集群中都是唯一的。
  3. 提高故障恢复效率:如果某个节点发生故障,可以快速找到最后一个已处理的 GTID,从而确定需要重新同步的数据范围,提高故障恢复效率。

在这里插入图片描述

3. 常见出错与解决方法

IO线程未正常启动:

  • 检查机器/容器之间的连通性
  • 检查配置文件是否写错
  • stop slave 停掉复制线程,然后resert master 复位二进制日志,在此之前先使拓扑里的数据库数据一致。然后重新建立主从关系

SQL线程未正常启动:

  • 因为是学习环境,所以直接stop slave 停掉复制线程,然后resert master 复位二进制日志,然后重新建立主从关系。注意在此之前先使拓扑里的数据库数据一致

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 持续集成08--Jenkins邮箱发送构建信息及测试报告
  • js vue axios post 数组请求参数获取转换, 后端go参数解析(gin框架)全流程示例
  • Docker-compose单机容器集群编排
  • 记录一下在Hyper-v中动态磁盘在Ubuntu中不完全用到的问题(扩展根目录)
  • 41 QOS技术(服务质量)
  • <数据集>光伏板缺陷检测数据集<目标检测>
  • 双非一本嵌入式方向怎么学?
  • 逻辑门的题目怎么做?
  • 探索.NET内存之海:垃圾回收的艺术与实践
  • MongoDB教程(九):java集成mongoDB
  • 4. docker镜像、Dockerfile
  • 自动驾驶系列—智能巡航辅助功能中的横向避让功能介绍
  • 设计模式第一天|了解设计模式、设计模式七大原则
  • HTML+JS+CSS计算练习
  • Go语言并发编程-Context上下文
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • chrome扩展demo1-小时钟
  • download使用浅析
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • Facebook AccountKit 接入的坑点
  • JavaScript标准库系列——Math对象和Date对象(二)
  • Java知识点总结(JavaIO-打印流)
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • mysql 数据库四种事务隔离级别
  • Spring Boot快速入门(一):Hello Spring Boot
  • 阿里云应用高可用服务公测发布
  • 面试总结JavaScript篇
  • 前端代码风格自动化系列(二)之Commitlint
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 日剧·日综资源集合(建议收藏)
  • 我看到的前端
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • #ifdef 的技巧用法
  • (1)bark-ml
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (C语言)二分查找 超详细
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)springboot教学评价 毕业设计 641310
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (一)Linux+Windows下安装ffmpeg
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .apk 成为历史!
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .equals()到底是什么意思?
  • .Net Core和.Net Standard直观理解
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET分布式缓存Memcached从入门到实战
  • .NET运行机制
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • @AutoConfigurationPackage的使用