MySQL主从复制

1.理解MySQL主从复制原理。

1.1MySQL支持的复制类型

MySQL支持以下几种常见的复制类型:

  • 基于语句的复制(Statement-based Replication,SBR):基于语句的复制是MySQL最早支持的复制方式,它通过复制和执行SQL语句来实现数据的复制和同步,即:在主服务器上执行SQL语句,在从服务器上执行同样的语句。这种方式简单高效,但在一些特殊情况下可能会导致数据不一致。默认情况下都是基于语句的复制。
  • 基于行的复制(Row-based Replication,RBR):基于行的复制是MySQL较新支持的复制方式,它将每一行的改变记录下来,然后在备库上重放这些改变以实现数据的复制和同步,即:把改变的内容复制过去,而不是把命令在从服务器上执行一遍。这种方式可以更精确地复制数据的改变,但会增加网络传输和存储成本。从MySQL5.0开始支持。
  • 混合复制(Mixed Replication):混合复制是基于语句的复制和基于行的复制的结合,MySQL会根据具体情况自动选择使用哪种方式进行复制。默认采用基于语句的复制不行就采用基于行的复制。

1.2为什么要做主从复制

1. 提高读性能:通过设置从服务器(Slave),读操作可以被分摊到主服务器(Master)和从服务器上,从而提高整体的读取性能。主服务器负责处理写操作,从服务器负责处理读操作,从而降低主服务器的负载,提升整个系统的吞吐量。

例如:在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。

2. 数据冗余和备份:通过主从复制,从服务器上的数据是主服务器的冗余副本。在主服务器发生故障时,从服务器仍然可以提供服务,并且可以通过将某个从服务器提升为新的主服务器来快速恢复服务。此外,从服务器也可以用于定期的备份操作,以确保数据的安全性和可恢复性。

3. 高可用性:通过主从复制,可以实现数据库的故障转移和高可用性。当主服务器发生故障时,可以手动或自动将某个从服务器提升为新的主服务器,继续提供数据库服务,从而实现快速的故障恢复。

4. 数据分析和报表生成:由于从服务器可以处理读操作,可以将其用于数据库的数据分析和报表生成等工作。这样可以避免对主服务器造成额外的负载,同时提供实时的数据分析和报表服务。

5. 数据分发和跨地域部署:主从复制可以用于将数据分发到不同的地理位置的从服务器上,从而实现跨地域的数据访问和部署。这对于全球化的应用程序和多地域灾备是非常有用的。

3、架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。

1.3主从复制基本架构

主从复制是一种常用的数据备份和恢复方法。它的基本架构包括主服务器(master)和从服务器(slave)两部分。主服务器负责写操作,而从服务器负责读操作。Mysql的主从复制中主要有三个线程:master(binlog dump thread)、slave(I/O thread 、SQL thread)

1.4主从复制原理

主从复制的原理是通过基于日志的复制方式实现数据的同步。当主服务器上发生数据变更时,会将这些变更写入二进制日志(Binary Log)中。从服务器通过连接到主服务器,请求从主服务器获取二进制日志,并将这些日志应用到自己的数据库中。

主从复制的基本原理:

1. 主服务器生成二进制日志:在主服务器上,所有的写操作(例如插入、更新、删除)都会被记录在二进制日志中。这些写操作以事件(event)的形式被记录下来,二进制日志包含了数据库变更的详细信息。

2. 从服务器连接到主服务器:从服务器通过连接到主服务器,建立一个复制连接。在连接建立时,从服务器会获取到主服务器上当前的二进制日志文件名和位置,作为复制的起点。

3. 从服务器请求复制数据:从服务器会向主服务器发送一个复制请求,请求从当前的二进制日志位置之后的写操作事件。主服务器根据复制请求,将二进制日志中的事件发送给从服务器。

4. 从服务器应用复制日志:从服务器接收到主服务器发送的二进制日志后,会解析并应用这些事件到自己的数据库中。从服务器会按照事件的顺序依次执行,以保持数据的一致性。

5. 复制链路的维护和监控:主从复制过程中,主服务器会持续记录二进制日志,而从服务器会持续请求和应用这些日志。复制链路需要进行监控和维护,以确保复制的正常运行和数据的可靠性。

注:主从复制是异步的,从服务器在应用写操作之前,并不等待主服务器的确认。因此,从服务器上的数据可能会有一定的延迟。

1.5MySQL复制常用的拓扑结构

  • 主从类型(Master-Slave)是MySQL复制中最常见和基本的拓扑结构。在主从复制中,主服务器(Master)是写入和修改数据的主要服务器,而从服务器(Slave)则是主服务器的副本。主服务器将更新的数据记录在二进制日志中,并通过网络将这些日志传输到从服务器,从服务器会将这些日志应用到自己的数据库中,使得从服务器的数据保持与主服务器一致。
  • 主主类型(Master-Master)是一种更高级的复制拓扑结构。在主主复制中,有两个或多个服务器被配置为主服务器,每个服务器既是主服务器又是从服务器。这意味着每个服务器都可以独立地接收和处理写入操作,并将更新的数据传输给其他服务器。主主复制通常用于实现高可用性和负载均衡。
  • 级联类型(Master-Slave-Slave)是一种更复杂的复制拓扑结构。在级联复制中,有一个主服务器和多个从服务器。从服务器不仅复制主服务器的数据,还充当其他从服务器的主服务器。这种拓扑结构允许级联的复制链,其中一个从服务器可以作为另一个从服务器的主服务器,以便分散读取请求的负载。

1.6如何实现主从复制

主从复制的基本架构流程:

1. 配置主服务器:在主服务器上,需要开启二进制日志(Binary Log)功能,该功能记录了主服务器上的所有写操作,包括更新、删除和插入。同时,需要配置主服务器的唯一标识(server_id)。

2. 配置从服务器:在从服务器上,需要配置正确的主服务器地址和连接参数,包括主服务器的IP地址、端口号、用户名和密码等。同时,也需要配置从服务器的唯一标识(server_id)。

3. 启动复制:在从服务器上启动复制进程,连接到主服务器并请求复制数据。主服务器将发送二进制日志文件中的写操作事件(event)给从服务器,从服务器接收并应用这些事件,将数据复制到自己的数据库。

4. 复制过程:复制过程主要包括两个步骤:从服务器请求主服务器的二进制日志,主服务器将日志发送给从服务器;从服务器解析并应用日志中的事件到自己的数据库,保持与主服务器的数据一致性。

5. 复制链路的监控和维护:可以通过监控工具或命令来查看主从服务器的复制状态和延迟情况。同时,也需要定期备份和维护从服务器,确保数据的安全性和可恢复性。

2.完成MySQL主从复制。

2.1环境准备

两台机器,一主一从。

主(master):192.168.136.134 port:3306

从(slave):192.168.136.135 port:3306

2.2主库配置

设置server-id值并开启binlog参数

[mysqld]
log_bin = mysql-bin
server_id = 120

设置完成并保存后记得重启服务 

systemctl restart mysqld

 建立同步账号

grant replication slave on *.* to 'slave_test'@'192.168.136.%' identified by '123456';
  • grant replication slave: 授予复制从服务器权限
  • on *.*: 应用于所有数据库
  • to ‘slave_test’@‘192.168.136.%’: 授权给用户名为’slave_test’,只能从IP地址为192.168.136.开头的主机访问
  • identified by ‘123456’: 设置用户的密码为’123456’

注:这里的密码为简易密码,需要更改密码策略否则会报错,可以使用上一步骤中的validate_password=off关闭密码策略(同样地方修改)。

mysql> show grants for 'slave_test'@'192.168.136.%';

 该命令用于查看用户的授权信息。

 锁表设置只读

为后面备份准备,注意生产环境要提前申请停机时间;

mysql> flush tables with read lock;
#提示:如果超过设置时间不操作会自动解锁。mysql> show variables like '%timeout%';

FLUSH TABLES WITH READ LOCK; 是一个MySQL语句,它的作用是在当前会话中锁定所有表,并使它们处于只读状态。这个命令常用于备份数据库或进行一些需要确保数据一致性的操作。

当执行这个命令时,MySQL将锁定所有的表,防止其他会话对这些表进行写入操作,从而保证了数据的一致性。只有在当前会话释放这些表的锁之后,其他会话才能对这些表进行写入操作。

需要注意的是,执行FLUSH TABLES WITH READ LOCK;之后,如果需要对表进行任何修改操作,都需要先执行UNLOCK TABLES;来释放表的锁定状态。这样其他会话才能对表进行写入操作。

SHOW VARIABLES LIKE ‘%timeout%’; 是一个MySQL查询语句,用于查看与超时相关的变量配置。执行该语句后,MySQL将返回所有包含"timeout"关键字的系统变量和它们的值。

 

查看主库状态

查看主库状态,即当前日志文件名和二进制日志偏移量

show master status;

 

备份数据库数据

mysqldump -uroot -p -A -B | gzip > /backup/mysql_bak.$(date +%F).sql.gz
  • mysqldump: 是一个MySQL提供的工具,用于导出数据库结构和数据。
  • -uroot: 指定了MySQL的用户名为"root",用于授权访问数据库。
  • -p: 告诉mysqldump以交互方式提示输入密码。
  • -A: 表示导出所有数据库。
  • -B: 表示导出全部表结构和数据。
  • |: 管道操作符,将前一个命令的输出作为后一个命令的输入。
  • gzip: 使用gzip工具对数据进行压缩。
  • > : 重定向操作符,将输出结果保存到指定的文件中。
  • /backup/mysql_bak.$(date +%F).sql.gz: 指定了备份文件的路径和名称,其中使用了date命令的参数+%F表示当前日期的完整格式(例如:2023-07-25),以保证每次备份都有唯一的文件名。

解锁

释放表的锁定状态。这样其他会话才能对表进行写入操作。

mysql> unlock tables;

主库备份数据上传到从库

scp /backup/mysql_bak.2023-07-17.sql.gz 192.168.136.135:/backups/
  • scp: 是一个用于在不同主机之间安全地进行文件传输的命令。
  • /backup/mysql_bak.2023-07-17.sql.gz: 是本地的要传输的文件路径和名称。
  • 192.168.136.135: 是远程服务器的IP地址或主机名。
  • :/backups/: 是远程服务器上接收文件的目录路径。

 

2.3从库上设置

设置server-id值并关闭binlog参数


[mysqld]server-id=130

我这里是新开的虚拟机还没设置bin_log参数所以没有关闭,有的话只需要注释掉即可。 

 

还原从主库备份数据

cd /server/backup/
gzip -d mysql_bak.2015-11-18.sql.gz
mysql -uroot -p < mysql_bak.2015-11-18.sql
#检查还原:
mysql -uroot -p -e 'show databases;'

 主库的数据库如下:

 

 从库的数据库:

 

 

设定从主库同步

mysql> change master to
MASTER_HOST='192.168.136.134',
MASTER_PORT=3306,
MASTER_USER='slave_test',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=455;

 

 

启动从库同步开关

mysql> start slave;
# 检查状态:
mysql> show slave status\G

 

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

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

相关文章

CSS3 实现边框圆角渐变色渐变文字效果

.boder-txt {width: 80px;height: 30px; line-height: 30px;padding: 5px;text-align: center;border-radius: 10px;border: 6rpx solid transparent;background-clip: padding-box, border-box;background-origin: padding-box, border-box;/*第一个linear-gradient表示内填充…

C++动态内存管理

目录 C语言中的动态内存管理C动态内存管理动态管理内置类型动态管理自定义类型 new和delete的实现原理operator new和operator delete函数new和delete对内置类型的实现原理new和delete对自定义类型的实现原理 malloc/free和new/delete区别 C语言中的动态内存管理 之前学习了C语…

Nginx系列之 一 负载均衡

目录 一、Nginx概述 1.1 负载均衡概述 1.2 负载均衡的作用 1.3 四/七层负载均衡 1.3.1 网络模型简介 1.3.2 四层和七层负载均衡对比 1.3.3 Nginx七层负载均衡实现 1.4 Nginx负载均衡配置 1.5 Nginx负载均衡状态 1.6 Nginx负载均衡策略 二、负载均衡实战 2.1 测试服…

算法通关村第一关——链表白银挑战笔记

文章目录 两个链表的第一个重合节点判断回文链表 两个链表的第一个重合节点 同LeetCode 160.相交链表 解法一&#xff1a;Hash和Set(集合&#xff09;&#xff0c;此处用Set合适。 把其中一个链表的所有节点引用放入set&#xff0c;再从头遍历另一个链表第一次重合的地方就是答…

Android性能优化之SharedPreference卡顿优化

下面的源码都是基于Android api 31 1、SharedPreference使用 val sharePref getPreferences(Context.MODE_PRIVATE) with(sharePref.edit()) { putBoolean("isLogin", true)putInt("age", 18)apply() } val isLogin sharePref.getBoolean("isLogi…

windows环境下docker数据迁移到其他盘

docker安装在C盘&#xff0c;使用一段时间后&#xff0c;C盘爆满。因此想把C盘中的数据迁移到其他盘&#xff0c;以释放C盘空间。分为以下步骤&#xff1a; 1、启动docker软件&#xff0c;打开PowerShell并切换到Docker Compose配置文件的目录。 Docker Compose配置文件的目录…

通过社区参与解锁早期增长:Maven 远程医疗平台概览

Maven通过用户导向的渐进式验证&#xff0c;找到了一个被忽视的巨大女性医疗服务市场&#xff0c;作为女性医疗保健的先行者&#xff0c;已服务超过1500万用户&#xff0c;目前估值已达$14亿。本文将深入探索Maven实现产品市场匹配的三个阶段&#xff0c;从如何验证初始的市场机…

Vue2基础十、Vuex

零、文章目录 Vue2基础十、Vuex 1、vuex概述 &#xff08;1&#xff09;vuex是什么 vuex 是一个 vue 的 状态管理工具&#xff0c;状态就是数据。大白话&#xff1a;vuex 是一个插件&#xff0c;可以帮我们管理 vue 通用的数据 (多组件共享的数据) 例如&#xff1a;购物车数…

Linux安装部署Nacos和sentinel

1.将nacos安装包下载到本地后上传到linux中 2.进入nacos的/bin目录,输入命令启动nacos [rootlocalhost bin]# sh startup.sh -m standalone注:使用第二种方式启动,同时增加日志记录的功能 2.2 startup.sh文件是不具备足够的权限,否则不能操作 给文件赋予执行权限 [rootlocalh…

【lesson5】linux vim介绍及使用

文章目录 vim的基本介绍vim的基本操作vim常见的命令命令模式下的命令yypnyynpuctrlrGggnG$^wbh,j,k,lddnddnddp~shiftrrnrxnx 底行模式下的命令set nuset nonuvs 源文件wq!command&#xff08;命令&#xff09; vim配置解决无法使用sudo问题 vim的基本介绍 首先vim是linux下的…

十、数据结构——链式队列

数据结构中的链式队列 目录 一、链式队列的定义 二、链式队列的实现 三、链式队列的基本操作 ①初始化 ②判空 ③入队 ④出队 ⑤获取长度 ⑥打印 四、循环队列的应用 五、总结 六、全部代码 七、结果 在数据结构中&#xff0c;队列&#xff08;Queue&#xff09;是一种常见…

react-router-dom和react-router的区别

react-router-dom和react-router的区别 前言 在使用react-router-dom的时候&#xff0c;经常会和react-router搞混了&#xff0c;搞不清楚它们哪个跟哪&#xff0c;到底有什么关系&#xff0c;今天来总结一下。 结论 react-router-dom是在react-router的基础上开发的&#…

变现:利用 chatgpt + midjourney 制作微信表情包

1、利用gpt生成提示词&#xff0c;当然也可以直接翻译 生成基础提示词&#xff0c; 比如&#xff1a; an anime image with a white kawaii character in it, in the style of light green and brown, minimalist detail, animated gifs, cranberrycore, 1860–1969, babyco…

C#实现数字验证码

开发环境&#xff1a;VS2019&#xff0c;.NET Core 3.1&#xff0c;ASP.NET Core API 1、建立一个验证码控制器 新建两个方法Create和Check&#xff0c;Create用于创建验证码&#xff0c;Check用于验证它是否有效。 声明一个静态类变量存放列表&#xff0c;列表中存放包含令…

python selenium爬虫自动登录实例

拷贝地址&#xff1a;python selenium爬虫自动登录实例_python selenium登录_Ustiniano的博客-CSDN博客 一、概述 我们要先安装selenium这个库&#xff0c;使用pip install selenium 命令安装&#xff0c;selenium这个库相当于机器模仿人的行为去点击浏览器上的元素&#xff0…

Android ANR触发机制之Service ANR

一、前言 在Service组件StartService()方式启动流程分析文章中&#xff0c;针对Context#startService()启动Service流程分析了源码&#xff0c;其实关于Service启动还有一个比较重要的点是Service启动的ANR&#xff0c;因为因为线上出现了上百例的"executing service &quo…

R-并行计算

本文介绍在计算机多核上通过parallel包进行并行计算。 并行计算运算步骤&#xff1a; 加载并行计算包&#xff0c;如library(parallel)。创建几个“workers”,通常一个workers一个核&#xff08;core&#xff09;&#xff1b;这些workers什么都不知道&#xff0c;它们的全局环…

c++学习(位图)[22]

位图 位图&#xff08;Bitmap&#xff09;是一种数据结构&#xff0c;用于表示一个固定范围的布尔值&#xff08;通常是0或1&#xff09;。它使用一个二进制位来表示一个布尔值&#xff0c;其中每个位的值表示对应位置的元素是否存在或满足某种条件。 位图可以用于解决一些特…

利用MATLAB制作DEM山体阴影

在地理绘图中&#xff0c;我们使用的DEM数据添加山体阴影使得绘制的图件显得更加的美观。 GIS中使用ArcGIS软件就可以达到这一目的&#xff0c;或者使用GMT&#xff0c;同样可以得到山体阴影的效果。 本文提供了一个MATLAB的函数&#xff0c;可以得到山体阴影。 clear all;c…

《面试1v1》如何能从Kafka得到准确的信息

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…