MySQL篇6——MySQL深度揭秘:主从复制原理、流程与同步方式详解

在分布式数据库架构中,MySQL 的主从复制(Master-Slave Replication)是一项最基础也最重要的功能。无论是为了实现读写分离以提升性能,还是为了数据备份以保障安全,理解主从复制的原理都是后端开发者的必修课。

本文将深入探讨 MySQL 主从复制的核心定义、底层线程交互流程以及三种常见的复制模式。

一、 什么是主从复制?

简单来说,MySQL 的主从复制是指将主数据库(Master)的 DDL(数据定义语言,如建表)和 DML(数据操作语言,如增删改)操作,通过**二进制日志(Binlog)**传输到从数据库(Slave)中。

从库在接收到这些日志后,会在自己的服务器上对这些日志记录的操作进行重新执行(重做),从而使得从库的数据与主库保持同步。

通俗理解 ------ "抄作业"模式 主从复制不是简单的"复制粘贴文件",而是**"动作回放"**。

二、 主从复制的底层原理与流程

MySQL 的主从复制并不是简单的文件拷贝,而是一个涉及多线程协作的复杂过程。主要涉及 3 个核心线程2 个关键日志

1. 复制开启后的线程创建

当从服务器开启主从复制(执行 START SLAVE)后,系统会创建两个关键线程:

  • I/O 线程(运行在从库)

  • SQL 线程(运行在从库)

同时,当从库尝试连接主库时,主库也会创建一个专门的线程:

  • Binlog Dump 线程(运行在主库)

2. 详细交互流程

整个复制过程可以拆解为以下几个步骤:

  1. 连接与请求 : 从服务器的 I/O 线程 启动后,会与主服务器建立连接。它会主动告诉主服务器的 Binlog Dump 线程 :"我需要同步数据,请从 Binlog 的指定位置(文件名 + 偏移量)开始发给我。"(从库的IO线程和主库Binlog Dump线程连接,并要求Binlog Dump线程将指定位置发给从库)

  2. 主库发送日志 : 主服务器在处理更新操作时,会将变更记录顺序写入自己的 Binlog 中。 当 Binlog Dump 线程 检测到 Binlog 发生变化时,会读取指定位置之后的新内容,并将其发送给从服务器的 I/O 线程。(Binlog Dump线程把自己Binlog中的改变发给从库IO线程)

  3. 从库拉取与存储(Relay Log) : 从服务器的 I/O 线程 接收到主库发送过来的数据后,并不会立即执行,而是会将这些内容写入到本地的一个临时日志文件中,即 中继日志(Relay Log)注意:这是一个"拉(Pull)"的模式,允许从库根据自己的性能自行管理同步进度。(IO线程拿到后把它放进中继日志中)

  4. 解析与重做 : 从服务器的 SQL 线程 会实时监测中继日志。一旦发现有新内容,它就会读取 Relay Log,将其解析为具体的 SQL 操作,并在从库的数据表中重新执行一遍。(SQL线程检查中继日志并执行)

至此,主库的变更就完全同步到了从库。其实可以发现它有点像是只穿了sql语句的感觉,但是这个sql语句并不是真的就是sql语句,它取决于binlog的格式(statement,row,mixed)。

三、 MySQL 的三种复制方式

为了平衡"数据安全性"和"系统性能",MySQL 支持多种复制模式。

1. 异步复制(Asynchronous Replication)

这是 MySQL 的默认复制方式

  • 工作机制 :主库在执行完事务提交后,会立刻将结果返回给客户端。它不关心从库是否接收到了 binlog,也不关心从库是否执行成功。

  • 场景举例:你(客户端)去寄快递(写数据)。快递员(主库)收了你的货,立刻给你一张单子说"好了,寄出去了",然后你就可以走了。快递员之后什么时候把货送到分站(从库),你不关心,他也不保证立刻送到。

  • 优缺点

    • 优点:性能最高,主库没有额外的等待时间。

    • 缺点:存在数据丢失风险。如果主库在事务提交后立刻宕机,而此时 Binlog 还没来得及传给从库,那么当从库升级为主库时,这部分数据就永久丢失了。

2. 全同步复制(Fully Synchronous Replication)

  • 工作机制 :当主库提交一个事务后,它必须等待所有的从库都接收并处理完该事务,才会给客户端返回成功响应。

  • 场景举例:你寄快递。快递员收了货,让你在柜台等着。他必须把货送到所有的分站,并且确认每一个分站都收到了,才回头给你单子说"好了,寄成功了"。

  • 优缺点

    • 优点:数据安全性极高,保证强一致性。

    • 缺点:性能最差。只要有一个从库网络延迟或处理缓慢,整个主库的写操作就会被阻塞。如果从库数量多,系统几乎不可用。

3. 半同步复制(Semi-Synchronous Replication)

这是一种介于"异步"和"全同步"之间的折中方案,常用于对数据一致性有一定要求的生产环境。

  • 工作机制 :主库在提交事务后,不会立刻返回,也不会等待所有从库。它只需要等待至少一个从库接收到了 Binlog(并写入 Relay Log),主库就会给客户端返回成功。

  • 场景举例:你寄快递。快递员收了货,让你稍等。他把货发出去,只要收到至少一个分站的电话说"我收到了",他就立刻给你单子让你走。他不需要等所有分站都确认。

  • 优缺点

    • 优点:比全同步快,比异步安全。即便主库挂了,只要有一个从库收到了数据,数据就不会丢。

    • 缺点:相比异步复制,依然会有微小的性能损耗(主要是网络往返的延迟)。


总结

  • 核心机制:主库写 Binlog -> 从库 I/O 线程拉取并写 Relay Log -> 从库 SQL 线程重放。

  • 选择策略 :大多数互联网业务使用异步复制 以追求高性能;金融或支付类核心业务通常使用半同步复制以保障数据不丢失。

相关推荐
蠢货爱好者1 小时前
MySQL小练习
数据库·mysql
蒲公英源码1 小时前
基于PHP+Nginx+Redis+MySQL社区生活服务平台
javascript·vue.js·mysql·php
头发那是一根不剩了1 小时前
MySQL 数据目录迁移
运维·服务器·mysql
头发那是一根不剩了2 小时前
MySQL 启动、连接问题汇总
数据库·mysql·adb
雪域迷影3 小时前
完整的后端课程 | NodeJS、ExpressJS、JWT、Prisma、PostgreSQL
数据库·postgresql·node.js·express·prisma
一颗宁檬不酸10 小时前
文件管理知识点
数据库
11 小时前
达梦数据库-事务
数据库·达梦数据库·dm
网硕互联的小客服11 小时前
MYSQL数据库和MSSQL数据库有什么区别?分别适用于什么脚本程序?
数据库·mysql·sqlserver
weixin_4624462312 小时前
【原创实践】python 获取节假日列表 并保存为excel
数据库·python·excel