当前位置: 首页 > news >正文

从异步到半同步:全面解读MySQL复制的数据一致性保障方案

MySQL 主从复制(Replication)是其最核心的高可用性和扩展性功能之一。它的原理是将一个 MySQL 实例(称为主库 Master)的数据变更,自动同步到另一个或多个 MySQL 实例(称为从库 Slave)的过程。

下面我将详细解析其工作原理、核心组件和流程。

一、 核心架构与组件

MySQL 主从复制是一个 “异步” 的、基于日志的复制系统,主要涉及三个线程和两种日志:

角色

组件

说明

主库 (Master)

Binary Log (binlog)

核心。记录所有对数据库结构和内容进行修改的 SQL 语句(或实际数据行变更)。

Binlog Dump Thread

主库上的一个线程,负责读取 binlog 并将其发送给从库的 I/O 线程。

从库 (Slave)

I/O Thread

从库上的线程,负责连接主库,请求和接收 binlog 数据,并将其写入本地的中继日志。

Relay Log

从库上的一个日志文件,作为主库 binlog 的临时中转站和缓冲区。

SQL Thread

从库上的线程,负责读取中继日志中的内容,并解析执行其中的 SQL 语句,最终使从库数据与主库保持一致。

二、 主从复制的工作原理(三步流程)

整个过程可以清晰地分为三个步骤,下图直观地展示了这一流程:

flowchart TD
A[Client Write Request] --> B[Master Database]subgraph Master[Master Server]B --> C[Write Data<br>Update/Insert/Delete]C --> D[Write Binary Log<br>[binlog]]D --> E[Binlog Dump Thread]
endE -- "Binlog Events" --> F[I/O Thread]subgraph Slave[Slave Server]F --> G[Write Relay Log<br>[relay log]]G --> H[SQL Thread]H --> I[Replay Events]I --> J[Slave Data Updated]
end

步骤一:主库记录二进制日志 (Binary Log)

  1. 应用程序向主库发起数据变更请求(如 ​​INSERT​​, ​​UPDATE​​, ​​DELETE​​)。
  2. 主库执行完这些事务后,并不会立即返回,而是将这些更改事件按照一定的格式(​​STATEMENT​​, ​​ROW​​, ​​MIXED​​)写入到自己的 Binary Log 文件中。
  • 注意:只有写操作会被记录,读操作不会。

步骤二:从库请求并接收日志 (I/O Thread)

  1. 从库的 I/O 线程会启动一个到主库的客户端连接。
  2. I/O 线程向主库的 Binlog Dump 线程发送一个请求,指定从哪个 binlog 文件的哪个位置开始同步。
  3. 主库的 Binlog Dump 线程读取 binlog 内容,并通过之前建立的连接发送给从库。
  4. 从库的 I/O 线程接收到这些 binlog 事件后,会将其顺序地写入到本地的 Relay Log 文件中。

步骤三:从库重放中继日志 (SQL Thread)

  1. 从库的 SQL 线程会不断地读取 Relay Log 文件中的事件。
  2. SQL 线程会解析并执行这些事件中的 SQL 语句(或者在 ​​ROW​​ 格式下,直接应用数据行的变化),从而在从库上重现主库上的操作。
  3. 一旦 SQL 线程执行完一个事件,它就会更新自己的 ​​master.info​​ 和 ​​relay-log.info​​ 文件,记录当前读取到的主库 binlog 位置,以便中断后能从正确的位置继续复制。

总结来说,从库通过两个线程实现了“接收日志”和“执行日志”的解耦:I/O 线程负责从主库拉取数据,SQL 线程负责消费这些数据。Relay Log 作为中间的缓冲区,使得两个线程可以独立工作,提高了复制的效率和稳定性。

三、 复制的格式 (Binlog Format)

这是理解复制行为和排查问题的关键。主库记录 binlog 有三种格式:

格式

原理

优点

缺点

STATEMENT (SBR)

记录原始的 SQL 语句。

日志文件小,节省磁盘和网络 I/O。

可能因上下文信息(如系统变量、触发器)导致主从数据不一致。

ROW (RBR)

记录每行数据如何被修改(修改前镜像/修改后镜像)。

安全可靠,几乎可以保证主从数据绝对一致。这是默认推荐的格式。

日志文件大(例如一条 ​​UPDATE​​ 更新了100万行,会记录100万条日志)。

MIXED (MBR)

混合模式。一般情况下使用 STATEMENT,但在可能造成不一致的场景下(如使用 ​​UUID()​​ 函数),自动切换为 ROW 格式。

兼顾了安全性和性能。

仍存在极小的不确定性。

四、 半同步复制 (Semi-Synchronous Replication)

上述默认的复制是完全异步的。这意味着:

  1. 主库提交事务并写入binlog后,立即返回给客户端成功。
  2. binlog 通过异步的方式发送给从库。

风险:如果主库在返回成功后、binlog还未发送到任何从库时就宕机了,虽然客户端认为成功了,但这个事务实际上丢失了。

半同步复制 为了解决这个问题而诞生:

  1. 主库在提交事务时,会等待至少一个从库的 I/O 线程确认已经接收到了这个事件的 binlog。
  2. 只有在收到确认后,主库才会返回成功给客户端。
  3. 如果超时(可配置)还未收到确认,复制会降级为异步模式,之后一旦有从库恢复,又会自动升级回半同步。

这就在性能和数据一致性之间提供了一个很好的折衷,确保了数据的冗余性。

五、 主从复制的应用场景

  1. 读写分离:主库处理写操作和实时性要求高的读操作,从库处理大量的分析报表类读操作,显著提升系统整体性能。
  2. 数据备份:在从库上进行备份,不会对主库造成任何压力。
  3. 高可用性和故障切换:主库宕机后,可以快速将一个从库提升为新的主库,减少系统停机时间。
  4. 地理分布:将数据同步到不同地理位置的从库,供当地用户访问,提升访问速度。

六、 总结与核心要点

  • 基础原理:基于 Binlog,采用 “拉” 的异步模式。
  • 三个线程:主库的 Binlog Dump,从库的 I/O 和 SQL。
  • 两个日志:主库的 Binary Log,从库的 Relay Log。
  • 核心流程:主库写Binlog -> 从库I/O线程拉取并写Relay Log -> 从库SQL线程重放Relay Log。
  • 格式选择:推荐使用 ROW 格式,以保证数据一致性。
  • 数据安全:对数据可靠性要求极高的场景,可使用半同步复制。

另外搭配便捷的MYSQL备份工具,可定时备份、异地备份,MYSQL导出导入。可本地连接LINUX里的MYSQL,简单便捷。可以大大地提高工作效率喔。


文章转载自:

http://F8zQd81i.kpmxn.cn
http://T28Lz0bb.kpmxn.cn
http://dnWoYVDx.kpmxn.cn
http://aOiTbGDP.kpmxn.cn
http://KczMhtD7.kpmxn.cn
http://UO4HFhUX.kpmxn.cn
http://8RuV9bmq.kpmxn.cn
http://uGLVkF2n.kpmxn.cn
http://88oTxSq2.kpmxn.cn
http://dIPdW1u3.kpmxn.cn
http://NNRyvULc.kpmxn.cn
http://1c7cw35H.kpmxn.cn
http://IxRywwYJ.kpmxn.cn
http://gKpVPmWT.kpmxn.cn
http://PSOVFvQF.kpmxn.cn
http://A3K4drLg.kpmxn.cn
http://ZwxzJY6u.kpmxn.cn
http://Lv9fTdxh.kpmxn.cn
http://ECjDEKpl.kpmxn.cn
http://fHaZZOJ6.kpmxn.cn
http://qlXExaUB.kpmxn.cn
http://T0lINeQz.kpmxn.cn
http://5wMyXUQF.kpmxn.cn
http://IUInOWBM.kpmxn.cn
http://Pb7prT99.kpmxn.cn
http://I8qHGe2i.kpmxn.cn
http://1cwPSzYz.kpmxn.cn
http://YjCXzavu.kpmxn.cn
http://xF6rc4TS.kpmxn.cn
http://8WbiDUba.kpmxn.cn
http://www.dtcms.com/a/384754.html

相关文章:

  • 项目工程中库使用Debug与release
  • IntelliJ IDEA 初学者指南:从零创建并运行 Java 项目
  • 虚拟线程和普通线程的区别
  • 微软发布高危漏洞更新,涉及 Windows、Office、SQL Server 等多款产品
  • IDEA-MyBatis动态sql关联映射
  • 【学习】【js】栈数据结构
  • Coze源码分析-资源库-创建知识库-后端源码-核心技术与总结
  • ArcGIS Pro实现基于 Excel 表格批量创建标准地理数据库(GDB)——高效数据库建库解决方案
  • 在openEuler系统 上安装Go语言开发环境
  • 奈奎斯特频率和采样定理的解释
  • 直播APP集成美颜SDK详解:智能美妆功能的开发实战
  • 基于Matlab GUI的心电信号QRS波群检测与心率分析系统
  • 贪心算法应用:5G网络切片问题详解
  • 【117】基于51单片机GSM智能拐杖老人防跌倒报警器【Keil程序+报告+原理图】
  • Rancher 社区双周报|聚焦 Harvester 新特性:网络、存储与虚拟化全面升级
  • CSS视差旋转动效实战
  • Java 设计模式——单例模式6种写法:从原理到 SpringBoot 落地
  • 【自存】懒汉式单例模式中的多线程经典问题
  • 【第五章:计算机视觉-项目实战之图像分类实战】1.经典卷积神经网络模型Backbone与图像-(4)经典卷积神经网络ResNet的架构讲解
  • 区块链:搭建简单以太坊Geth私有链
  • 数据分析:函数
  • 《投资-57》元宇宙的价值
  • Linux任务调度全攻略
  • 基于springboot的毕业旅游一站式定制系统
  • 创建其他服务器账号
  • 前端-详解ref和$refs
  • C++---变量的多维分类
  • Vue 3 前端工程化规范
  • NLP Subword 之 WordPiece 算法原理
  • 【SQL】MySQL中空值处理COALESCE函数