MySQL主从复制原理与实践:从配置到故障监控

文章目录

  • 前言
  • 主从复制原理
    • 复制源
    • 主节点的工作
    • 从节点的工作
    • 复制流程的设计
  • 主从复制环境搭建
    • 一、主从节点配置
    • 二、从节点开启复制步骤
      • 1、备份主节点的数据
      • 2、将数据同步到从节点
      • 3、从节点复制参数配置
    • 三、验证复制环境
  • 主从复制故障监控
    • 监控主从复制状态
    • 监控主从复制延迟
  • 总结

前言

上文《MySQL数据被误删怎么办?》介绍了MySQL在故障或者误删数据后,可以通过备份+binlog的方式进行数据恢复。但是,当备份文件和binlog都丢失了呢?所以单节点是不可靠的,为了避免单节点故障带来的数据丢失以及MySQL服务的可用性,生产环境通常都是采用高可用或者集群模式。而在这背后则离不开主从复制技术,所以本文对主从复制的原理和操作展开介绍,从而全面了解这一技术。

主从复制原理

复制源

MySQL的主从复制主要是将主节点的数据同步到从节点,这个数据的来源就是binlog(之前的文章也有提到)。

binlog文件中的格式是这样的:

| Log_name         | Pos  | Event_type     | Server_id | End_log_pos | Info    

| mysql-bin.000004 | 3016 | Anonymous_Gtid |         1 |        3081 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                                                                                                                                                                                                 |
| mysql-bin.000004 | 3081 | Query          |         1 |        3160 | BEGIN                                                                                                                                                                                                                                                |
| mysql-bin.000004 | 3160 | Query          |         1 |        3296 | use `test`; INSERT INTO account (id, user,balance) VALUES (30, 'CCV',5000)                                                                                                                                                                           |
| mysql-bin.000004 | 3296 | Xid            |         1 |        3327 | COMMIT /* xid=1661 */    

那么,MySQL是如何将主节点的binlog同步到从节点的?

主节点的工作

通过binlog文件可以看到,每个事务提交后都会将相应的SQL语句清晰的记录在binlog中,所以在binlog新增日志的这个时机,将这些日志传输到从节点即可。

这个工作是由主节点中的「binlog dump」线程处理的。

从节点的工作

在接收到主节点的日志后,剩下的工作就由从节点来完成了。

在主从复制这件事上,从节点主要由两个线程和一个日志文件来完成该工作。

两个线程分别是「IO线程」和「SQL线程」,「IO线程」用来连接主节点、**接收日志(一些SQL语句)**并且记录到「relaylog」,「SQL线程」是用来执行「relaylog」进行SQL执行,从而达到复制目的。

复制流程的设计

直接执行SQL不行吗?为什么要两个线程+一个日志才能完成主从复制?

试想一下,如果直接执行SQL,在这过程中出现故障怎么办?执行时间过长,阻塞积压导致复制延时怎么办?所以,MySQL这样设计有两个好处:

  1. 使用两个线程可以在出现错误时起到故障隔离作用。例如,如果SQL线程遇到错误时,可以停止并等待IO线程发送下一个日志。而如果IO线程遇到错误,它可以从最后一个已知的、成功的位置重新开始拉取日志。
  2. IO 操作和 SQL 操作可以并行进行,提高复制的效率。

还有一个重要的原因就是:为了满足高一致性的需求,MySQL还提供了半同步和组复制模式,简单来讲就是主节点需要确认从节点收到数据之后才算同步成功,也就是日志落地到「relaylog」中。如果直接执行SQL再响应主节点,可想而知,复制的效率是极其低下的。

这里贴一张主从复制的工作流程图方便理解

在这里插入图片描述

主从复制环境搭建

接下来演示一下如何搭建一个主从复制环境。

一、主从节点配置

在搭建主从复制环境前需要确保主从实例可以通信,此外,还需要注意两个事项:

  1. 需要确保主从实例的serverid不一致,如果一致需要在配置文件/etc/my.cnf进行修改。
  2. 主节点需要开启binlog,也是在/etc/my.cnf中配置。

在这里插入图片描述

除此之外,主节点需要创建两个角色供从节点使用,创建角色命令如下

-- 创建'repl'用户并授权从节点复制权限
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'repl123456';
GRANT replication slave on *.* to 'repl'@'%';

-- 创建'replroot'用户并授权从节点所有权限,使得从节点可以远程备份数据
CREATE USER 'replroot'@'%' IDENTIFIED WITH mysql_native_password BY 'root123456';
GRANT ALL on *.* to 'replroot'@'%';

二、从节点开启复制步骤

配置完成后,从节点就可以开启复制了,复制步骤如下:

1、备份主节点的数据

远程将主节点的数据备份下来。命令如下:

mysqldump -ureplroot -proot123456 -h 192.168.0.39 -P 3306 -A --master-data=2 --single-transaction -R -E --triggers >/root/full.sql

在这里插入图片描述

2、将数据同步到从节点

在从节点上执行恢复操作,使得从节点的状态最接近主节点的状态,这样的话从节点就可以基于最新的状态开始复制了。恢复命令如下:

set sql_log_bin=0;
source /root/full.sql 
set sql_log_bin=1;

命令执行后就可以在从节点看到主节点的数据了

在这里插入图片描述

3、从节点复制参数配置

数据同步过来后,可以执行以下命令查看从节点开始在哪里进行复制。

grep  "\--\ CHANGE MASTER" /root/full.sql

在这里插入图片描述

是否感觉这些操作很熟悉?没错,截止至此,以上的操作都是上文介绍的备份恢复的操作。

最后在从节点执行以下命令配置复制参数,就开启主从复制了。

--修改复制相关参数
CHANGE MASTER TO MASTER_HOST='主节点的ip', MASTER_PORT=3306, MASTER_USER='repl', MASTER_PASSWORD='repl123456',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=154,MASTER_CONNECT_RETRY=60;

--启动复制进程
start slave;

其中MASTER_LOG_FILEMASTER_LOG_POS就是从节点应该开始复制主节点的二进制日志和位置。

至此,主从复制就搭建好了,妈妈再也不用担心节点故障或数据误删了。

三、验证复制环境

怎么验证复制环境搭建好了呢?

我们可以在从节点上执行show slave status \G;命令进行查看复制进度、错误信息和复制状态等。如果有结果输出,那说明环境搭建成功了。类似下图
在这里插入图片描述

或者在主节点执行show slave hosts;命令查看从节点信息,如果有输出也说明搭建成功。类似下图

在这里插入图片描述

环境搭建好就可以看一下复制效果了。

在开启复制之前,从节点的数据状态是这样的:

在这里插入图片描述

此时,我在主节点执行两条DML命令,然后在从节点看数据是否同步过来。

INSERT INTO `account` VALUES(80,'LKJ',5000.00)
UPDATE `account`  SET balance=1000 WHERE id=1;

通过下图可以看到从节点的数据已经同步过来

在这里插入图片描述

主从复制故障监控

主从复制会不会出现故障?出现故障怎么办?

当然会出现故障,通常可以通过show slave status \G;监控复制进度、错误信息和复制状态,如果出现问题对症下药。

监控主从复制状态

重点关注Slave_IO_RunningSlave_SQL_Running 状态。这两个状态都应该显示为 “Yes”,表示复制正常运行。

Last_Errno Last_Error 字段表示错误码或错误信息,可以说明复制过程中出现了问题。比如下面这个错误:

Last_Error: Error 'ER_BAD_SLAVE: Slave I/O thread killed while reading event from master' has occurred in query: 'SELECT * FROM my_table'

这个错误意味着从节点在尝试读取事件时遇到了问题,这个时候就要看是网络问题还是权限问题。

监控主从复制延迟

通过比较主从节点上的时间戳、数据版本等信息,可以检测到复制延迟。

比如,Seconds_Behind_Master字段表示从节点落后主节点的秒数,如果这个值持续较高,可能存在复制延迟问题。

这个时候就要排查是不是 主从节点有网络延时 \color{blue}{主从节点有网络延时} 主从节点有网络延时,需不需要增加网络带宽? 是不是主库并发事务高 \color{blue}{是不是主库并发事务高} 是不是主库并发事务高,需不需要修改成复制模式组复制? 还是从库刷盘慢 \color{blue}{还是从库刷盘慢} 还是从库刷盘慢,需不需要增加从节点的复制线程数?具体情况具体分析。

当然,还有很多故障情况,可以使用一些开源的监控工具,如Zabbix、Prometheus、pt-slave-delay等实时监控主从复制的状态和性能指标。这些工具通常都会提供告警功能,当出现异常时可以及时发现并处理。

总结

不管是备份恢复还是主从复制,其目的都是为了提高MySQL的可靠性、可用性等。两者本质上就是对数据的copy+传输,前者是为了故障恢复,后者更多是为了高可用、故障转移、读写分离等需求。

在复制基础上可以使用MHA、MMM、ProxySQL、MyCAT等中间件实现高可用、读写分离等需求。

当然,现在大多数公司更倾向于现成的云上高可用、集群数据库。即便这样,还是要知其然,知其所以然,以备不时之需。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Improving Generative Modelling in VAEs Using Multimodal Prior

local representation vector r, ϵ \epsilon ϵ is i.i.d Gaussian 额外信息 作者未提供代码

【机组】时序与启停实验的解密与实战

​🌈个人主页:Sarapines Programmer🔥 系列专栏:《机组 | 模块单元实验》⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。 ​ 目录 🌺一、 实验目…

ABAP IDOC 相关报表

上代码 干货来了 *&---------------------------------------------------------------------* *& REPORT ZRPT_FI_IDOC_R *& *&---------------------------------------------------------------------* *& author ABAP02 *& date 20240103 *&…

K8S-YAML

一、Kubernetes对象的描述 kubernetes中资源可以使用YAML描述(如果您对YAML格式不了解,可以参考YAML语法),也可以使用JSON。其内容可以分为如下四个部分: typeMeta:对象类型的元信息,声明对象…

共同学习|Spring Cloud Alibaba一一Nacos介绍

接着上篇我们介绍的Spring Cloud Alibaba,下面来继续学习构建云原生应用的动态服务发现、配置管理和服务管理平台——Nacos介绍。 共同学习|Spring Cloud Alibaba一一简介篇-CSDN博客 3、Nacos介绍 Redirecting to: https://nacos.io/ 什么是nacos? …

高级RAG(八): 自动合并检索(Auto-merging Retrieval)

自动合并检索(Auto-merging Retrieval)是LlamaIndex的另外一种高级RAG技术,它有点类似与我们之间介绍的从小到大的检索,不过自动合并检索要比“从小到大的检索”稍微复杂一些,它首先将文档按一定的层次结构进行切割,然后在检索的时…

Docker 安装 MongoDb4

Docker 安装mongoDb 获取mongodb安装问题汇总参考 获取mongodb 注意: WARNING: MongoDB 5.0 requires a CPU with AVX support, and your current system does not appear to have that! **hub官网(需要梯子):**https://hub.dock…

医生都是越老越吃香,为啥程序员却不是?

知乎上有个问题:明明是工作经验越久越吃香,为什么程序员却不是? 仔细一想,好像确实是这样啊。 你们看,大家去医院挂号的时候,都喜欢挂年纪大一点的医生,因为年纪大的经验更丰富。 我们装修选设…

常见问答解析:人工智能在智能时代的潜力与挑战

在智能时代,人工智能(AI)被视为推动社会和科技进步的关键引擎。让我们通过问答的形式,深入探讨人工智能的潜力与面临的挑战。 问:人工智能在当前社会中扮演什么角色? 答:人工智能已成为现代科技…

Java-NIO篇章(4)——Selector选择器详解

Selector介绍 选择器(Selector)是什么呢?选择器和通道的关系又是什么?这里详细说明,假设不用选择器,那么一个客户端请求数据传输那就需要建立一个连接,为了避免线程阻塞,那么每个客…

一文说明白 MySQL 的 ACID 和 几种日志的关系

1、简介 我们对于MySQL 很熟悉,关于其特性都有一定的了解,但是关于一些具体的实现原理,有的小伙伴可能不太熟悉,而且这部分知识在我们互联网大厂面试中是经常涉及的,因此,本文将带你深入底层,顺…

实验笔记之——基于TUM-RGBD数据集的SplaTAM测试

之前博客对SplaTAM进行了配置,并对其源码进行解读。 学习笔记之——3D Gaussian SLAM,SplaTAM配置(Linux)与源码解读-CSDN博客SplaTAM全称是《SplaTAM: Splat, Track & Map 3D Gaussians for Dense RGB-D SLAM》,…

c JPEG 1D DCT

步骤: 1. 对yuv 88 数据 8行分别1D DCT 2, 用8行 1D DCT 得到的数据生成中间88 块 Zj 3,对Zj 的8列再 1D DCT 后生成8列,用这8列组合成8*8的2D DCT 系数 准备用此1D DCT程序代替以前写的2D DCT,看能减少多少编码时间。 看网上文章,ffmpeg用…

【AI预测】破晓未来教育市场:如何精准定位、精选师资并启动高潜力培训项目

在当前全球化和技术快速迭代的背景下,各行业正面临巨大的人才缺口和新的发展机遇。 全球化浪潮,各行业如同搭乘上了一列高速列车,不断深入探索并广泛应用AI技术以提升产业效率、创新服务模式。在智能制造领域,工业4.0时代犹如给…

【Java 设计模式】结构型之适配器模式

文章目录 1. 定义2. 应用场景3. 代码实现结语 适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成客户端期望的另一个接口。这种模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。在本文中,我…

骨传导蓝牙耳机怎么使用?使用骨传导耳机对人体有没有伤害?

骨传导蓝牙耳机的使用方法和传统的入耳式蓝牙耳机使用方法相差无几,都是通过蓝牙来进行连接使用,但骨传导耳机会自带内存,所以在此前提上可以存储音乐独立使用,比传统的入耳式蓝牙耳机使用更方便一些。 那么使用骨传导耳机会不会对…

[一]ffmpeg音视频解码

[一]ffmpeg音视频解码 一.编译ffmpeg1.安装vmware虚拟机2.vmware虚拟机安装linux操作系统3.安装ftp和fshell软件4.在Ubuntu(Linux)中编译Android平台的FFmpeg( arm和x86 )5.解压FFmpeg6.Android编译脚本(1)…

Spring Security工作原理(一)

过滤器 Spring Security的Servlet支持是基于Servlet过滤器的,因此首先了解过滤器的一般作用是很有帮助的。下图显示了单个HTTP请求处理程序的典型分层结构。 处理客户端发送的请求时,容器创建一个FilterChain,其中包含Filter实例和Servlet&a…

Rust-泄漏

在C中,如果引用计数智能指针出现了循环引用,就会导致内存泄漏。而Rust中也一样存在引用计数智能指针Rc,那么Rust中是否可能制造出内存泄漏呢? 内存泄漏 首先,我们设计一个Node类型,它里面包含一个指针,可以指向其他…

C++类与对象【友元】

🌈个人主页:godspeed_lucip 🔥 系列专栏:C从基础到进阶 🎄1 友元🥑1.1 全局函数做友元🥑1.2 类做友元🥑1.3 成员函数做友元 🕮2 总结 🎄1 友元 生活中你的家…