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.rhkb.cn/news/431943.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

某建筑市场爬虫数据采集逆向分析

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 目标网站 aHR0cHM6Ly9qenNjLm1vaHVyZC5nb3YuY24vZGF0YS9jb21wYW55P2NvbXBsZXhuYW1lPSVFNiVCMCVCNA 提示:以下是本篇文章正文内容,下面…

应用层 I(C/S模型、P2P模型、域名系统DNS)【★★】

(★★)代表非常重要的知识点,(★)代表重要的知识点。 一、网络应用模型 在网络边缘的端系统之间的通信方式通常可划分为两大类:客户 - 服务器方式(C/S 方式 [Client/Server] )和对等…

Linux:编译,调试和Makefile

一丶vim编译器 ### 基本概念 模式:Vim有几种不同的模式,包括: 命令/正常/普通模式:控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode 插入模…

【Vision Transformer】辅助理解笔记

注:本文主要是对 PPT 部分内容的补充与拓展,建议结合使用(当然也完全可以单看)。 一、基础知识 1、从向量表示到词嵌入 这部分主要是参考如下文章,大部分图片均来自此文:The Illustrated Word2vec – Jay…

visio 2021入门直通车(一天全搞定)

安装Visio 2021 (64bit)安装教程 1.1. 模板类型 1.2. 界面布局 1.3. 插入对象 1.4. 添加页面 1.5. 全屏演示|页面自适应|visio文件切换 1.6. 快捷键 快捷键说明 Shift 鼠标滚轮 按下shift,点击鼠标滚轮水平页面滚动 鼠标滚轮 垂直页面滚动 Ctrl 鼠标滚轮 按…

Shiro-550—漏洞分析(CVE-2016-4437)

文章目录 漏洞原理源码分析加密过程解密过程 漏洞复现 漏洞原理 Shiro-550(CVE-2016-4437)反序列化漏洞 在调试cookie加密过程的时候发现开发者将AES用来加密的密钥硬编码了,并且所以导致我们拿到密钥后可以精心构造恶意payload替换cookie,然后让后台最…

海康HIK IN客户端使用帮助说明

HIK IN客户端是海康威视推出的一款配套公司USB相机的工具客户端。该软件不仅可以轻松的帮助用户实现画面的实时预览,而且支持用户USB接口连接,同时拥有AI参数配置等功能。 HIK IN提供了丰富的相机参数设置选项,能够帮助摄影师优化相机的性能&…

Redis技术解析(基础篇)

1.初识Redis Redis是一种键值型的NoSql数据库,这里有两个关键字: 键值型 Redis-server NoSql 其中键值型,是指Redis中存储的数据都是以key、value对的形式存储,而value的形式多种多样,可以是字符串、数值、甚至jso…

ad14转cadence17.4

一、原理图转换 将原理图文件拖入到新建工程中

云栖3天,云原生+ AI 多场联动,新产品、新体验、新探索

云栖3天,云原生 AI 20场主题分享,三展互动,为开发者带来全新视听盛宴 2024.9.19-9.21 云栖大会 即将上演“云原生AI”的全球盛会 展现最新的云计算技术发展与 AI技术融合之下的 “新探索” 一起来云栖小镇 见证3天的云原生AI 前沿探索…

SpringCloud Alibaba五大组件之——Sentinel

SpringCloud Alibaba五大组件之——Sentinel(文末附有完整项目GitHub链接) 前言一、什么是Sentinel二、Sentinel控制台1.下载jar包2.自己打包3.启动控制台4.浏览器访问 三、项目中引入Sentinel1.在api-service模块的pom文件引入依赖:2.applic…

JavaEE——多线程的状态及线程安全问题

目录 一、线程的状态 1、NEW 2、 TERMINATED 3、RUNNABLE 4、TIMED_WAITING 5、 BLOCKED 6、WAITING 二、线程安全问题 1、线程不安全的原因 2、一个线程不安全的实例 3、加锁操作 4、产生线程不安全的原因 什么是内存可见性呢? 解决方案? 5、指令重排序…

精密制造与质量控制:保障滚珠丝杆重载运行精度

滚珠丝杆作为精密机械传动领域的重要零部件,能够将旋转动力精准地转化为流畅的直线运动。在数控机床、精密制造及高度自动化生产线上扮演着不可或缺的角色。在应对温度波动、负载突变及严苛环境条件的考验中,都有很好的表现。那么,应该如何确…

【多线程】面试高频考点!JUC常见类的详细总结,建议收藏!

💐个人主页:初晴~ 📚相关专栏:多线程 / javaEE初阶 JUC是“Java Util Concurrency”的缩写,指的是Java并发工具包,它位于java.util.concurrent包及其子包中。JUC包提供了大量用于构建并发应用程序的工具和…

深入解析Python 中的 sortedcontainers 库:高效的排序数据结构

在日常的 Python 编程中,列表(list)、集合(set)和字典(dict)是常用的数据结构。然而,在某些特定的场景下,我们需要对数据进行排序,并且希望在插入、删除或访问…

计算机网络32——Linux-文件io-2文件系统

1、阻塞和非阻塞 想要将文件以非阻塞方式打开,有两种方式 (1)需要将文件关闭,再用非阻塞方式打开 (2)fctnl函数,先获取旧属性,再添加一个新属性 阻塞函数 阻塞函数一直在等待输入…

从更底层的角度理解网站的访问过程

文章目录 1.示例,访问www.baidu.com是如何返回数据的1.输入www.baidu.com回车2.检查本机的C:\Windows\System32\drivers\etc\hosts配置文件夹下有没有这个域名对应的映射: 1.示例,访问www.baidu.com是如何返回数据的 1.输入www.baidu.com回车…

开源数据集网站合集

一.Google数据集 链接:https://datasetsearch.research.google.com/ 二.Huggingface数据集 链接1:GitHub - huggingface/datasets: 🤗 The largest hub of ready-to-use datasets for ML models with fast, easy-to-use and efficient dat…

深入解析:HTTP 和 HTTPS 的区别

网络安全问题正变得日益重要,而 HTTP 与 HTTPS 对用户数据的保护十分关键。本文将深入探讨这两种协议的特点、工作原理,以及保证数据安全的 HTTPS 为何变得至关重要。 认识 HTTP 与 HTTPS HTTP 的工作原理 HTTP,全称超文本传输协议&#xf…

2-103 基于matlab的光电信号下血氧饱和度计算

基于matlab的光电信号下血氧饱和度计算,光转换成电信号时,由于动脉对光的吸收有变化而其他组织对光的吸收基本不变,得到的信号就可以分为直流DC信号和交流AC信号。提取AC信号,就能反应出血液流动的特点。这种技术叫做光电容积脉搏…