MySQL 主从复制部署与优化

文章目录

前言

在现代数据库管理中,MySQL 主从复制是一种关键技术,用于提高数据的可用性和性能。随着 Docker 容器技术的普及,利用 Docker 搭建 MySQL 主从复制环境已成为一种趋势,它提供了一种简便、高效且可扩展的解决方案。本文将介绍 Docker 在 MySQL 主从复制中的应用,包括搭建步骤、配置技巧以及如何避免常见的复制延迟问题。

我们将从为什么选择 Docker 进行 MySQL 主从复制开始,探讨其带来的灵活性和便利性。接着,通过详细的步骤指导,展示如何配置主从服务器并进行链接。文章还将讨论读写分离的使用场景、复制原理,以及减少同步延迟的策略。

一、为什么基于Docker搭建?

为什么基于Docker搭建?

应用场景:

二、利用Docker搭建主从服务器

首先拉取docker镜像,我们这里使用5.7版本的mysql:

docker pull mysql:5.7

然后使用此镜像启动容器,这里需要分别启动主从两个容器

Master(主):

docker run -p 3339:3306 --name master -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 

Slave(从):

docker run -p 3340:3306 --name slave -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

Master对外映射的端口是3339,Slave对外映射的端口是3340。因为docker容器是相互独立的,每个容器有其独立的ip,所以不同容器使用相同的端口并不会冲突。这里我们应该尽量使用mysql默认的3306端口,否则可能会出现无法通过ip连接docker容器内mysql的问题。

一些命令:

#停止容器
docker stop 容器名或者id
docker rm 容器名或者id
# 查看正在运行的容器
docker ps

2.1 配置Master(主)

通过docker exec -it master /bin/bash命令进入到Master容器内部,也可以通过docker exec -it 359c6039d52d /bin/bash命令进入。359c6039d52d是容器的id,而 master 是容器的名称。

然后,cd /etc/mysql切换到/etc/mysql目录下,然后vi my.cnf对my.cnf进行编辑。此时会报出bash: vi: command not found,需要我们在docker容器内部自行安装vim。使用yum install vim,apt-get install vim命令安装vim即可。

会出现如下问题:

Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package vim

执行yum install vim 即可成功安装vim。然后我们就可以使用vim编辑my.cnf,在my.cnf中添加如下配置:

[mysqld]
server-id=100  
# 开启binlog日志
log-bin=mysql-bin

配置完成之后,需要重启mysql服务使配置生效。使用service mysql restart完成重启。重启mysql服务时会使得docker容器停止,我们还需要docker start mymysql启动容器。

PS:若安装vim 仍然报错,参考下面文章:

Docker下安装vim 报错 E: Unable to locate package vim

下一步在Master数据库创建数据同步用户,授予用户 slave REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据。

mysql -uroot -p123456
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

2.2 配置Slave(从)

和配置Master(主)一样,在Slave配置文件my.cnf中添加如下配置:

[mysqld]
## 设置server_id,注意要唯一
server-id=101  
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin   
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin  

配置完成后也需要重启mysql服务和docker容器,操作和配置Master(主)一致。

2.3 链接Master(主)和Slave(从)

在Master进入mysql,执行show master status;

File和Position字段的值后面将会用到,在后面的操作完成之前,需要保证Master库不能做任何操作,否则将会引起状态变化,File和Position字段的值变化。

在Slave 中进入 mysql,执行如下命令:change master to master_host='172.17.0.3', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000005', master_log_pos= 418, master_connect_retry=30;

change master to master_host='172.17.0.3', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000005', master_log_pos= 418, master_connect_retry=30;

命令说明:

在Slave 中的mysql终端执行show slave status \G;用于查看主从同步状态。

在这里插入图片描述

正常情况下,SlaveIORunning 和 SlaveSQLRunning 都是 No,因为我们还没有开启 主从复制过程。使用start slave开启主从复制过程,然后再次查询主从同步状态show slave status \G;。

在这里插入图片描述

SlaveIORunning 和 SlaveSQLRunning 都是 Yes,说明主从复制已经开启。此时可以测试数据同步是否成功。

主从复制排错:

使用start slave开启主从复制过程后,如果SlaveIORunning一直是Connecting,则说明主从复制一直处于连接状态,这种情况一般是下面几种原因造成的,我们可以根据 Last_IO_Error提示予以排除。

Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: ‘Client requested master to start replication from position > file size’

reset slave会将主从同步的文件以及位置恢复到初始状态,一开始没有数据还好,有数据的话,相当于重新开始同步,可能会出现一些问题;

一般做主从同步,都是要求以后的数据实现主从同步,而对于旧的数据完全可以使用数据库同步工具先将数据库同步,完了再进行主从同步;

遇到上面的问题,正确做法是:

1.打开主服务器,进入mysql

2.执行flush logs;//这时主服务器会重新创建一个binlog文件;

3.在主服务器上执行show master status \G;显示如下:

在这里插入图片描述

4.来到从服务器的mysql;

5.stop slave;

6.change master to master_log_file='mysql-bin.000005',master_log_pos=418;//这里的file和pos都是上面主服务器master显示的。

7.start slave;//这时候就应可以了

8.show slave status \G;//结果如下:

在这里插入图片描述

总结原因:

网络不通:检查ip,端口密码不对:检查是否创建用于同步的用户和用户密码是否正确pos不对:检查Master的 Position 2.4 测试主从复制

测试主从复制方式就十分多了,最简单的是在Master创建一个数据库,然后检查Slave是否存在此数据库。(此时可以使用Navicat等工具测试连接mysql)

Master:

在这里插入图片描述

Slave:

在这里插入图片描述

三、常见问题 3.1 什么时候用读写分离?

1、你的系统写入数据不多但是存在大量的读取数据功能。

2、读写分离其实是个比较低端的处理读取并发量的操作,因为还是有对数据库的访问 操作的,但是读写分离相对于其它处理方式而言的好处在于时效性比较高和对系统要求 比较低。

3、读写分离在效率上是低于页面静态化和缓存服务的,但是好处是不用改动系统代码, 因为都是连接数据库。

4、数据量大的情况下使用的技术不是读写分离,是分表和分库,或者使用分布式存储引擎,读写分离不能解决数据量大的问题。

5、系统写入操作并发量大不适合使用读写分离,至于需要什么技术看你的具体业务需求,而且大量写入操作本身就是个难以处理的大数据问题,但是读写分离从一定程度上减轻写入操作的负担。

3.2 MySQL主从复制原理 master 将操作语句记录到 binlog 日志中salve 服务器会在一定时间间隔内对 master 二进制日志进行探测其是否发生改变,如 果发生改变salve 开启两个线程:IO 线程和 SQL 线程

1)IO 线程: 负责读取 master 的 binlog 内容到中继日志 relay log 里;

2)SQL 线程: 负责从 relay log 日志里读出 binlog 内容,并更新到 slave 的数据库里(保证数据一致)

这里有一个非常重要的一点,就是从库同步主库数据的过程是串行化的, 也就是说主库上并行的操作,在从库上会串行执行。所以这就是一个非常重要的点了,由于从库从主库拷贝日志以及串行执行 SQL 的特点,在高并发场景下,从库的数据一定会比主库慢一些,是有延时的。所以经常出现,刚写入主 库的数据可能是读不到的,要过几十毫秒,甚至几百毫秒才能读取到。

如果主库突然宕机,然后恰好数据还没同步到从库,那么有些数据可能在从库上是没有的,有些数据可能就丢失了。所以 MySQL 实际上在这一块有两个机制,一个是半同步复制,用来解决主库数据丢失问题;一个是并行复制,用来解决主从同步延时问题。这个所谓半同步复制,也叫 semi-sync 复制,指的就是主库写入 binlog 日志之后,就会强制立即将数据同步到从库,从库将日志写入自己本地 的 relay log 之后,接着会返回一个 ack 给主库,主库接收到至少一个从库 的 ack 之后才会认为写操作完成了。所谓并行复制,指的是从库开启多个线程,并行读取 relay log 中不同库的日志,然后并行重放不同库的日志,这是库级别的并行。

3.3 解决主从复制延迟有几种常见的方法? 写操作后的读操作指定发给数据库主服务器

例如,注册账号完成后,登录时读取账号的读操作也发给数据库主服务器。这种方式和业务 强绑定,对业务的侵入和影响较大,如果哪个新来的程序员不知道这样写代码,就会导致一 个 bug。读从机失败后再读一次主机

这就是通常所说的“二次读取”,二次读取和业务无绑定,只需要对底层数据库访问的 API 进 行封装即可,实现代价较小,不足之处在于如果有很多二次读取,将大大增加主机的读操作 压力。例如,黑客暴力破解账号,会导致大量的二次读取操作,主机可能顶不住读操作的压 力从而崩溃。关键业务读写操作全部指向主机,非关键业务采用读写分离

例如,对于一个用户管理系统来说,注册 + 登录的业务读写操作全部访问主机,用户的介 绍、爱好、等级等业务,可以采用读写分离,因为即使用户改了自己的自我介绍,在查询时 却看到了自我介绍还是旧的,业务影响与不能登录相比就小很多,还可以忍受。 3.4 造成 mysql 同步延迟常见原因

1、网络:

如主机或者从机的带宽打满、主从之间网络延迟很大,导致主上的 binlog 没有 全量传输到从机,造成延迟。

2)机器性能:

从机使用了烂机器?比如主机使用 SSD 而从机还是使用的 SATA。

3)从机高负载:

有很多业务会在从机上做统计,把从机服务器搞成高负载,从而造成从机延迟很大的情况

4)大事务:

比如在 RBR 模式下,执行带有大量的 delete 操作,这种通过查看 processlist 相关信息以及使用 mysqlbinlog 查看 binlog 中的 SQL 就能快速进行确认

5)锁:

锁冲突问题也可能导致从机的 SQL 线程执行慢,比如从机上有一些 select … for update 的 SQL,或者使用了 MyISAM 引擎等。

项目中使用示例:

def __init():self.conn = ....   主self.con1 = pymsql.connect....  重def findAll():self.con1def innser_to():self.conninsert updatedeleteselect 

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

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

相关文章

LED 生产电子看板实现工厂精准管理

在当今竞争激烈的制造业领域,工厂的管理效率和精度直接关系到企业的生存与发展。而 LED 生产电子看板的出现,为工厂实现精准管理带来了全新的解决方案。 一、电子看板能够实现对生产进度的精准把控 在传统的工厂管理中,生产进度的了解往往依…

协同编程的艺术:SIDE 让团队协作更上一层楼

一、协同编程的现状 在当前软件开发中,团队协作面临着诸多挑战。沟通不畅常常导致项目进度延迟,版本控制复杂使得代码合并困难重重。传统 IDE 在协同工作方面存在明显的局限性,缺乏实时协作功能,团队成员之间的沟通工具也不够完善…

个人小结(2.0)

离谱,困扰着几周的问题今天偶然发现了解决方法。 问题如下:就是对应的模块引入爆红,但是单击进入引入的文件没有问题 然后它的提示是: 无法找到模块“../views/screen/index.vue”的声明文件。“c:/Users/10834/Desktop/0716_pro…

班主任群发成绩教程,宝藏工具来减负

今天想和大家聊聊班主任的那些事儿。当班主任可真不是一件轻松的工作啊。要备课吧,得精心设计每一个教学环节,从教学目标到教学方法,从课程导入到课后作业,每个细节都得考虑周全。 还要管理班级纪律,处理同学之间的小摩…

2024年NAS个人存储完美方案(最牛方案不服来战)

成果展示 背面展示 正面展示 为什么需要nas 速度优势:使用公共云盘,速度完全依赖公网传输速度。比如家庭300Mbps宽带,使用百度网盘SVip,上传2.5MB/s,下载30MB/s。而使用家用nas,速度完全取决路由器内网性能,基本上达到千兆或2.5GE。内容优势:向公共云盘上传的文件全…

miniQMT量化软件好用吗?miniQMT策略编辑流程步骤详细解答!

miniQMT的策略编辑流程步骤主要包括以下几个方面: 一、准备工作 配置Python环境: 下载并安装Python环境,确保版本兼容。 下载迅投官方提供的xtquant包,并配置到Python的site-packages路径下,以便在Python环境中引入…

如何在Spring Boot中无缝集成LangChain4j,玩转AI大模型!

0 前言 LangChain4j 提供了用于以下功能的 Spring Boot 启动器: 常用集成声明式 AI 服务 1 常用集成的 Spring Boot starters Spring Boot 启动器帮助通过属性创建和配置 语言模型、嵌入模型、嵌入存储 和其他核心 LangChain4j 组件。 要使用 Spring Boot 启动…

mybatisplus中id生成策略

使用Tableld(value,type) 1.typeIdType.AUTO自增主键 2.typeIdType.ASSIGN,雪花算法生成 mybatisplus id生成策略全局配置 配置表前缀以及id生成策略 mybatis-plus:global-config:db-config:id-type: autotable-prefix: :t_

OpenAi assistant run always fails when called from PHP

题意:从 PHP 调用时,OpenAI 助理运行总是失败。 问题背景: The runs I create with the openai-php library fail direct in 100% of cases. What am I doing wrong? I do not have much experience with php but this is the test script.…

VS2019配置C++版本的GDAL

VS2019配置GDAL教程 【特别注意】 vs2019编译好的GDAL库是可以在VS2022上面使用的,我这边做项目已经测试过没有问题,所以vs2022使用vs2019编译的gdal没有问题。 【编译版本介绍】 由于GDAL在vs2019源码流程有点复杂,因此我们在这不做讲解…

【Git必看系列】—— 2024年前后端开发必须要知道的GitFlow工作流

自从 Linux 之父Linus Torvalds对当时的版本控制工具感到不满,亲自动手创造了 Git 以来,Git 已经逐渐在版本控制领域占据了主导地位。不论你的代码仓库托管在 GitHub 还是 GitLab,不论你用的是 SourceTree、GitKraken 这样的图形界面&#xf…

华为 HCIP-Datacom H12-821 题库 (25)

🐣博客最下方微信公众号回复题库,领取题库和教学资源 🐤诚挚欢迎IT交流有兴趣的公众号回复交流群 🦘公众号会持续更新网络小知识😼 1.以下哪些事件会导致 IS-IS 产生一个新的 LSP? A、邻接 Up 或Down B、引入的 IP 路由发送变…

吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)2.1-2.2

目录 第四门课 卷积神经网络(Convolutional Neural Networks)第二周 深度卷积网络:实例探究(Deep convolutional models: case studies)2.1 为什么要进行实例探究?(Why look at case studies?&…

PyTorch深度学习快速入门教程【土堆】基础知识篇

Juptyer 版本: Python 3.9.19Pytorch 2.4.1 (pytorch0) C:\Users\25694>conda install nb_conda_kernels(pytorch0) C:\Users\25694>jupyter notebook使用conda环境的pytorch: 成功解决python.exe无法找到程序入口 无法定位程序输入点 shifte…

【Python语言初识(一)】

一、python简史 1.1、python的历史 1989年圣诞节:Guido von Rossum开始写Python语言的编译器。1991年2月:第一个Python编译器(同时也是解释器)诞生,它是用C语言实现的(后面),可以调…

茶思屋直播|TinyEngine+AI:聚焦主航道,在实践中探索低代码技术黑土地

低代码引擎使能开发者定制低代码平台。它是低代码平台的底座,提供可视化搭建页面等基础能力,既可以通过线上搭配组合,也可以通过cli创建个人工程进行二次开发,实时定制出自己的低代码平台。适用于多场景的低代码平台开发&#xff…

【C++ 学习】多态的基础和原理(10)

目录 前言1. 概念2. 多态的定义及实现2.1 多态的构成条件2.2 虚函数2.3 虚函数重写2.4 虚函数重写的例外2.4.1 协变2.4.1 析构函数的重写 2.5 多态调用和普通调用2.6 函数重写/函数隐藏/函数重载 的对比2.6.1 函数重写2.6.2 函数隐藏2.6.3 函数重载 2.7 C11 final 和override 3…

领域驱动DDD三种架构-分层架构、洋葱架构、六边形架构

博主介绍: 大家好,我是想成为Super的Yuperman,互联网宇宙厂经验,17年医疗健康行业的码拉松奔跑者,曾担任技术专家、架构师、研发总监负责和主导多个应用架构。 技术范围: 目前专注java体系,以及…

作为HR,如何考察候选人的沟通能力

如何考察候选人的沟通能力。沟通能力,这个听起来简单,实际上却是一个非常复杂的技能,它关乎到一个人能否有效地传递信息,理解他人,并且在团队中发挥积极的作用。 作为HR,我们应该怎样才能精准地把握住候选…

【Python语言初识(二)】

一、分支结构 1.1、if语句 在Python中,要构造分支结构可以使用if、elif和else关键字。所谓关键字就是有特殊含义的单词,像if和else就是专门用于构造分支结构的关键字,很显然你不能够使用它作为变量名(事实上,用作其他…