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等中间件实现高可用、读写分离等需求。

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

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

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

相关文章

FastSpeech2——TTS论文阅读

笔记地址:https://flowus.cn/share/1683b50b-1469-4d57-bef0-7631d39ac8f0 【FlowUs 息流】FastSpeech2 论文地址:lFastSpeech 2: Fast and High-Quality End-to-End Text to Speechhttps://arxiv.org/abs/2006.04558 Abstract: tacotron→…

从0开始python算法工程师(一):安装conda

1.为什么要安装conda 主要是为了在命令行使用conda命令管理虚拟环境。 2.两种conda Windows用户,一般建议初学者都安装anaconda(省事);Windows用户,熟练的安装者则安装miniconda(省存储空间)…

Microchip Studio修改工程名

打开工程后,右键选择重命名 右键工程重命名 关闭后回到工程下的文件夹 再次打开工程软件会显示加载失败,此时是找不到路径了 菜单栏打开工程 选择修改文件夹名字的路径下的cproj文件 然后点击关闭,会显示保存新的atsln文件,此时将…

安全基础~攻防特性3

文章目录 SSTI(模板注入)1. 简介2. 成因3. 常见框架存在注入4. 判断存在SSTI SSTI(模板注入) 1. 简介 (Server-Side Template Injection) 服务端模板注入 1、使用框架(MVC的模式),如python的flask,php的tp,java的sp…

实战内网穿透NPS搭建过程

前提条件 首先你要有个公网IP的服务器,既然是内网穿透,那必然是通过公网IP或者域名访问本地服务。 官网下载地址 https://github.com/ehang-io/nps/releases 服务端 选择linux_amd64_server.tar.gz 客户端 选择windows_amd64_client.tar.gz 服…

Centos 7 单机部署 consul

一、下载安装 参考官网文档 Install | Consul | HashiCorp Developer 进入Centos 执行下面命令 sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo sudo yum -y install consul 这种方法安装完成…

Spring MVC精解:技术内幕与最佳实践

第1章:引言 大家好,我是小黑,咱们今天来聊聊Spring MVC,它是Spring的一个模块,专门用来构建Web应用程序。提供了一种轻量级的方式来构建动态网页。就像小黑我刚开始接触Java时候一样,可能对这些听起来很高…

梁山泊国潮风礼盒,传承经典,贺礼新春

在春节来临之际,梁山泊隆重推出新年中国红礼盒酒,为您传递新年的祝福与关爱。这款酒以其独特的魅力,为您带来美好的祝愿和愉悦的享受。中国风国潮礼盒采用中国传统红色为主色调,象征着吉祥、喜庆和繁荣。红色的背景上,…

安科瑞Acrel-2000Z型电力监控系统在常州恒生工业园光伏项目上的的设计与应用——安科瑞赵嘉敏

概述 针对用户屋顶光伏发电电力监测,通过微机保护装置、开关柜综合测控装置、电气接点无线测温产品、电能质量在线监测装置、配电室环境监设备、弧光保护装置等设备组成综合自动化的综合监控系统,实现了变电、配电、用电的安全运行和管理。监控范围包括…

Linux:软件包管理器 yum

提示:以下指令均在Xshell 7 中进行 什么是软件包? 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序。 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安 装程序)放…

新手入门Java 继承概念及使用,final修饰符的详细介绍(有实例)

第四章 继承 课前回顾 1.如何进行封装 首先将类中定义的成员属性全部修改为private修饰 然后对每一个属性提供一个对外访问的方法,也就是生成getter/setter方法 最后再对外访问的方法(getter/setter)中加入属性值验证 2.封装的好处 提…

[优雅的面试]MySQL与Redis双写一致性方案

前言 由于缓存的高并发和高性能已经在各种项目中被广泛使用,在读取缓存这方面基本都是一致的,大概都是按照下图的流程进行操作: 但是在更新缓存方面,是更新完数据库再更新缓存还是直接删除缓存呢?又或者是先删除缓存再…

项目管理十大知识领域之项目沟通管理

一、项目沟通管理概述 项目沟通管理是项目管理中的重要组成部分,它涉及到对项目信息的收集、处理、存档和传递。一个成功的项目沟通管理可以确保团队成员、利益相关者以及其他相关方之间的信息交流畅通无阻,从而推动项目顺利进行。沟通管理涉及的内容不…

《Linux高性能服务器编程》笔记02

Linux高性能服务器编程 参考 Linux高性能服务器编程源码: https://github.com/raichen/LinuxServerCodes 豆瓣: Linux高性能服务器编程 文章目录 Linux高性能服务器编程第06章 高级I/O函数6.1 pipe函数6.2 dup函数和dup2函数6.3 readv 函数和writev 函数6.4 sendfile 函数6.…

TypeScript语法总结

JavaScript 与 TypeScript 的区别 TypeScript 是 JavaScript 的超集,扩展了 JavaScript 的语法,因此现有的 JavaScript 代码可与 TypeScript 一起工作无需任何修改,TypeScript 通过类型注解提供编译时的静态类型检查。 TypeScript 可处理已…

从数据角度分析年龄与NBA球员赛场表现的关系【数据分析项目分享】

好久不见朋友们,今天给大家分享一个我自己很感兴趣的话题分析——NBA球员表现跟年龄关系到底大不大?数据来源于Kaggle,感兴趣的朋友可以点赞评论留言,我会将数据同代码一起发送给你。 目录 NBA球员表现的探索性数据分析导入Python…

【 Qt 快速上手】-①- Qt 背景介绍与发展前景

文章目录 1.1 什么是 Qt1.2 Qt 的发展史1.3 Qt 支持的平台1.4 Qt 版本1.5 Qt 的优点1.6 Qt的应用场景1.7 Qt的成功案例1.8 Qt的发展前景及就业分析行业发展方向就业方面的发展前景 1.1 什么是 Qt Qt 是一个跨平台的 C 图形用户界面应用程序框架。它为应用程序开发者提供了建立…

DBA技术栈MongoDB:简介

1.1 什么是MongoDB? MongoDB是一个可扩展、开源、表结构自由、用C语言编写且面向文档的数据库,旨在为Web应用程序提供高性能、高可用性且易扩展的数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当…

linux下USB抓包和分析流程

linux下USB抓包和分析流程 在windows下抓取usb包时可以通过wireshark安装时安装USBpcap来实现usb抓包,linux下如何操作呢? 是基于usbmon,本博客简单描述基于usbmon在linux系统上对通过usb口进行发送和接收的数据的抓包流程,分别描…

SCI期刊查询利器:影响因子和分区情况一站式查询

参考 本文仅作为学术分享,如果侵权,会删文处理 期刊的影响因子,最传统也最靠谱的方法就是去 Journal Citation Reports 官方平台上面查询,JCR 平台直接输入期刊名称检索,或者按照类别查找期刊:如果在校外没有访问JCR的权限,可以购买80图书馆的WOS套餐,仅需38元,不到一…