在Centos Stream 9上Docker的实操教程(七) - Docker上实现MYSQL实现主从复制

news2024/10/6 12:20:41

在这里插入图片描述

🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》本专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

在Centos Stream 9上Docker的实操教程 - Docker上实现Mysql主从复制

  • 前言
  • 主从复制原理
  • 环境准备
  • 实战大于理论
    • 一主二从Mysql安装
    • Master主库配置
    • Slave从库配置
    • 启动Slave从库复制
    • 测试验证
  • 读写分离推荐Apache ShardingSphere
  • 结语

前言

很多系统在我们日常使用中随着业务量的扩展,系统访问量增加,单台Mysql可能会负载过重,I/O频率过高等问题。轻则读写效率低,严重的可能会导致宕机数据丢失的问题,这时候就可以采用主从复制、读写分离可以提高数据库的可用性,减少单台MySQL数据库服务器的压力,提高数据库能更大的并发。

主从复制原理

在这里插入图片描述
从上图我们来了解一下Mysql主从复制的原理:主(Master)、从(salve)

  1. 客户端发起SQL操作Master数据变更(insert、update、delete)会记录到binlog中
  2. Salve从库连接Master主库创建Dump线程,随时监听binlog变化
  3. Master节点的binlog发生变化时,Dump线程会通知所有的Salve节点,并将相应的binlog内容推送给Slave节点
  4. I/O线程接收到 binlog 内容后,将内容写入到本地的 Relay-Log
  5. SQL线程读取I/O线程写入的relay-log,并且根据 relay-log 的内容对从数据库做对应的操作

实现主从复制注意要点:

主库开启binlog日志
设置server-id且主从不同
从库服务器能连通主库

MySQL主从复制的形式:

一主一从
一主多从
多主一从
双主复制
级联复制

本章节主要以Docker内容为主,Mysql主从复制相关内容就不再赘述了,感兴趣的可以关注评论,大家再一起探讨!

环境准备

大致大家有了对主从复制的一个理解后,我们开始实现Mysql一主二从;

端口号规划如下
3306(主) 数据卷 /mydata/mysql-master
3307(从) 数据卷 /mydata/mysql-slave1
3308(从) 数据卷 /mydata/mysql-slave2

实战大于理论

一主二从Mysql安装

Master主库安装

docker run -p 3306:3306 --name mysql-master \
-v /mydata/mysql-master/log:/var/log/mysql \
-v /mydata/mysql-master/data:/var/lib/mysql \
-v /mydata/mysql-master/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql

slave1从库安装

docker run -p 3307:3306 --name mysql-slave1 \
-v /mydata/mysql-slave1/log:/var/log/mysql \
-v /mydata/mysql-slave1/data:/var/lib/mysql \
-v /mydata/mysql-slave1/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql

slave2从库安装

docker run -p 3308:3306 --name mysql-slave2 \
-v /mydata/mysql-slave2/log:/var/log/mysql \
-v /mydata/mysql-slave2/data:/var/lib/mysql \
-v /mydata/mysql-slave2/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql

检测容器是否成功运行
在这里插入图片描述

Master主库配置

设置主库配置文件,在宿主机 /mydata/mysql-master/conf 目录下新建my.cnf设置如下内容

[mysql]
default-character-set=utf8mb4
[mysqld]
#设置server_id,同一局域网中需要唯一
server_id=20
#指定不需要同步的数据库名称 binlog-do-db 为需要同步的数据库
binlog-ignore-db=mysql
#开启二进制日志功能
log-bin=micro-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7

使用指令重启容器使用配置生效 docker restart mysql-master

  • 进入容器 docker exec -it mysql-master /bin/bash
  • 进入数据库 mysql -u root -p 输入密码登陆

构建从库用户账户密码

-- 创建名slave为用户供从库连接
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
-- 授权表示可以从任意ip使用此用户名和密码连接到主数据库
GRANT REPLICATION SLAVE ON *.* to 'slave'@'%';
-- 刷新配置
FLUSH PRIVILEGES;

Slave从库配置

设置从库配置文件,在宿主机 /mydata/mysql-slave1/conf 目录下新建my.cnf设置如下内容,slave2同理

[mysql]
default-character-set=utf8mb4
[mysqld]
#设置server_id
server_id=17
#指定不需要同步的数据库名称
binlog-ignore-db=mysql  
#开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=micro-mysql-slave-bin  
#设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  
#设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  
#二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  
#relay_log配置中继日志
relay_log=micro-relay-log-bin
#log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1  
#slave设置为只读(具有super权限的用户除外)
read_only=1

启动Slave从库复制

首选我们在主库执行一下 show master status; 获取binlog日志名称 和日志偏移量, 从库开启复制所需的必要参数;
在这里插入图片描述
进入对应从库,配置主从连接关系 * 注意是在从库操作 执行以下SQlL

CHANGE MASTER TO 
MASTER_HOST='192.168.1.20',
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='micro-mysql-bin.000001',
MASTER_LOG_POS=156,
MASTER_CONNECT_RETRY=30,
MASTER_PORT=3306;

参数说明:

  • MASTER_HOST 主数据库的IP地址
  • MASTER_USER 在主库创建的同步数据用户名
  • MASTER_PASSWORD 在主库创建的同步数据用户密码
  • MASTER_LOG_FILE 主库的binlog日志名称
  • MASTER_LOG_POS binlog日志偏移量即从数据库从哪个位置开始复制数据
  • MASTER_CONNECT_RETRY 连接失败重试的时间间隔,单位为秒
  • MASTER_PORT 主库的运行端口

上述SQL执行完成开启从库复制,slave2配置和slave1一致这里就不再重复了;

-- 启动主从复制
start slave;

如需停止主从复制执行 stop slave;
如需清理掉之前的配置,重新配置 执行 reset slave all;

查看设置是否成功

-- 启动主从复制
show slave status \G; 

出现下图则证明主从复制设置成功
在这里插入图片描述
如果出现两个参数非YES的情况,注意观察 Last_IO_Error 的提示信息,如果出现
Authentication plugin ‘caching_sha2_password‘ reported error: Authentication requires sec 的异常问题,主要是因为8.0以后默认使用caching_sha2_password方式,因此需要将其改成mysql_native_password验证机制

解决思路一:修改Slave用户密码验证
ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

解决思路二:修改my.cnf 追加设置默认密码验证
default_authentication_plugin=mysql_native_password

测试验证

主库新建test表执行上一章中我们的student建表语句;

DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '学生ID',
  `name` varchar(50) NOT NULL COMMENT '学生姓名',
  `gender` varchar(10) NOT NULL COMMENT '学生性别',
  `birthday` date NOT NULL COMMENT '学生生日',
  `address` varchar(100) NOT NULL COMMENT '学生住址',
  `phone` varchar(20) NOT NULL COMMENT '学生联系方式',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='学生信息表';

INSERT INTO `student` (`id`, `name`, `gender`, `birthday`, `address`, `phone`) VALUES (1, '小明', '男', '2023-06-16', '广州', '13700137000');
INSERT INTO `student` (`id`, `name`, `gender`, `birthday`, `address`, `phone`) VALUES (2, '小羊', '女', '2023-06-16', '广州', '13800126000');

在主库mysql-master容器 show databases;
在这里插入图片描述
验证Slave1从库和Slave2从库是否已经完成复制,登陆从库mysql后 show databases;

-- 选择数据库
use test;
-- 查询表信息
select * from student;

在这里插入图片描述
看到如上数据,证明本次我们使用Docker上实现MYSQL实现主从复制已经成功了~

读写分离推荐Apache ShardingSphere

数据库完成了主从复制后,在我们JAVA开发中可以使用Apache ShardingSphere作为读写分离的解决方案,如果大家对这个框架感兴趣可以留言评论,后续考虑出一期Apache ShardingSphere的使用教程。

结语

本章节主要对Mysql主从复制使用场景、Mysql主从复制的原理,最后使用Docker实现MYSQL实现主从复制,从主库到从库的配置,再实际的业务场景中,更多的应该是两台或多台应用服务器部署的Mysql进行主从,而非一个宿主机上两个mysql容器实现主从,当然大家只要跟着博主的代码内容,了解原理都能轻松上手!最后如果本章节内容对你有用,希望点赞收藏加关注!

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

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

相关文章

第3章 作业(268EF)【网络安全】

第3章 作业【网络安全】 前言推荐第3章 作业268EF如何不用计算机计算求模 最后 前言 2023-6-19 15:49:17 以下内容源自《网络安全》 仅供学习交流使用 推荐 第2章 作业(2456)【网络安全】 第3章 作业 2 3.2什么是MAC? MAC:消息认证码…

网页设计实习周记范文5篇(合集)

网页设计实习周记(一) 本周主要是做网站维护更新。 网站要注意经常维护更新内容,保持内容的新鲜,不要一做好就放在那儿不变了,只有不断地给它补充新的内容,才能够吸引住浏览者。 通过目前的实习,在设计方面我感觉自己有…

探究设备管理系统在工业领域的应用

在现代工业领域,设备是生产过程中至关重要的组成部分。有效管理和维护设备对于保障生产的连续性、提高生产效率和降低成本至关重要。而设备管理系统的引入为企业提供了一种综合性的解决方案,能够全面监控、维护和优化设备的运行状态。本文将探讨设备管理…

Linux MySQL 备份与恢复 日志管理

数据库备份 备份策略 完全备份 每次备份都备份完整的数据库。 备份数据最大,每次都要完整备份。但是恢复最方便差异备份 只备份上一次完全备份后的更新数据。 第一次完整备份,之后备份第一次没有备份的内容增量备份 每次备份只备份上一次完全备份或增量备…

终于!Ubuntu下水“不可变”!

来源丨51CTO技术栈(ID:blog51cto) 要说今年Linux哪个概念火?肯定少不了“不可变”。Ubuntu也终于按捺不住了。 就在6月初,Ubuntu的母公司Canonical宣布:将很快加入不可变的发行版潮流。 虽然一开始Snap的首…

Spring学习笔记——从配置文件到注解开发 创建对象+成员变量赋值 增强方法

目录 引出Spring入门案例初识Spring入门案例1----用配置文件实现 Druid JDBCTemplate dao1.之前的方式:new对象2.用配置文件的方法把new对象交给Spring3.如果要用对象,从spring的容器中获取ac.getBean("userDao");4.实体类和dao层的代码--问…

【Leetcode60天带刷】day11栈与队列——20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值

题目: 20. 有效的括号 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个…

ARM存储器概论

一、ARM指令集概述 1.指令集 指令 (1)能够指示处理器执行某种运算的命令称为指令(如加、减、乘 ...) (2)指令在内存中以机器码(二进制)的方式存在 (3)每…

奉加微电子蓝牙芯片SDK例程怎么用

摘要:本文以定时器例程为例,介绍奉加微电子蓝牙芯片PHY6222的例程怎么样打开,怎么样编译,怎么样烧录。 硬件如上图,软件使用了两个,一个是keil5,另一个是PhyPlusKit(奉加微电子的烧录…

直到我买了服务器才知道有个自己的服务器有多爽!

一、我为什么要买服务器 我在大学时候就买了一个自己的小服务器,其实就是电视盒子刷的centos,当时还花了两百多大洋呢!当时那个服务器只是用来放自己的博客,但是那个服务器性能太垃圾了,也就只能放个网页了&#xff0…

《向量数据库》——Milvus 数据迁移指南

目录 Milvus 数据迁移指南 第 1 步:关闭当前版本 Milvus 第 2 步:下载配置文件 第 3 步:确认、更新 MySQL/SQLite 服务端地址 第 4 步:下载并启动新版 Milvus 第 5 步:安装对应版本的 Python SDK 第 6 步&#…

数据库表的操作

目录 前言 1.创建表 2.查看表 2.1查看表结构 2.2查看表中插入的数据 3.修改表 4.删除表 总结 前言 前面已经介绍了对数据库的操作,今天我们介绍的是数据库表的操作,数据库表简单可以理解为存储数据的介质。有了这个认识之后,下面我们…

[保姆级] Vue3 开发文档

大家好,我是沐华。最近一个粉丝公司项目由 Vue2 升级到 Vue3 了,他一下子不适应,有好多不会用的,所以我就写了这篇开发文档,包含了 Vue3 项目开发中使用的所有语法,希望所有像他一样还不熟的伙伴快速上手 V…

电子版个人简历模板范文十篇

电子版个人简历模板范文篇1 基本信息 真实姓名:__性别:男 年龄:25岁身高:170CM 婚姻状况:未婚户籍所在:贵州盘县 学历:中专工作经验:1-3年 联系地址:贵州贵阳 求职意向 最…

不是吧,你们对交换机的误解也太深了!

我的网工朋友大家好。 交换机和路由器系列,在我们这个公众号里可谓是C位选手,写过的内容有很多,从0基础小白都看得懂的趣味解读,到老网工最爱的实用命令,一应俱全。 但是好像从来没分析过,关于交换机&…

paraview调整color map文字颜色

paraview默认的背景颜色一般是灰色的,color map的数字及文字默认是白色的,如下: 然而,当我们将背景改为白色,往外输出图片时,color map的文字就看不见了,因此需要调整color map的文字为其他颜色…

<Linux开发>驱动开发 -之-Linux INPUT 子系统

<Linux开发>驱动开发 -之-Linux INPUT 子系统 交叉编译环境搭建: <Linux开发> linux开发工具-之-交叉编译环境搭建 uboot移植可参考以下: <Linux开发> -之-系统移植 uboot移植过程…

LNMP (Nginx网站服务)

目录 1.1 Nginx的简介 1.2 Apache与Nginx的区别 Nginx对比Apache的优势: 1.3 Nginx的进程 Nginx的两个进程: 同步,异步,阻塞,非阻塞的概念补充 阻塞与非阻塞 同步和异步 2.1 编译安装Nginx 2.1 .1 关闭防火墙…

mysql索引优化系列(二)

一、limit优化 之前的member会员表,联合索引为KEY idx_name_age_address (name,age,address),表里插入了十万条数据,一般情况下分页查询的sql语句: select * from member limit 90000,10; explain select * from member limit 9…

MapReduce分布式计算(二)

MapReduce工作流程 原始数据File 1T数据被切分成块存放在HDFS上,每一个块有128M大小 数据块Block hdfs上数据存储的一个单元,同一个文件中块的大小都是相同的 因为数据存储到HDFS上不可变,所以有可能块的数量和集群的计算能力不匹配 我们需要一个动态…