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://www.pswp.cn/bicheng/97026.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/97026.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/97026.shtml

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

相关文章

PostgreSQL GIN 索引揭秘

文章目录什么是GIN Index?示例场景GIN Index的原理GIN Index结构MetapageEntriesLeaf PagesEntry page 和 Leaf page 的关系Posting list 和posting tree待处理列表&#xff08;Pending List&#xff09;进阶解读GIN index索引结构总结什么是GIN Index? GIN (Generalized In…

开源多模态OpenFlamingo横空出世,基于Flamingo架构实现图像文本自由对话,重塑人机交互未来

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《GPT多模态大模型与AI Agent智能体》&#xff08;跟我一起学人工智能&#xff09;【陈敬雷编著】【清华大学出版社】 清华《GPT多模态大模型与AI Agent智能体》书籍配套视频课程【陈敬雷…

电子衍射模拟:基于GPU加速的MATLAB/Julia实现

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;注册即送-H卡级别算力&#xff0c;80G大显存&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生更享专属优惠。 引言&#xff1a;电子衍射模拟的重要性与计算挑战 电子…

easyExcel动态应用案例

代码链接&#xff1a;https://download.csdn.net/download/ly1h1/919402991.案例说明&#xff1a;1.1.导入功能导入数据实现转换成 List<List<String>> headers和 List<List<String>> datas&#xff0c;后续补充可以与数据模型注解结合&#xff0c;形…

【数据结构入门】排序算法(5):计数排序

目录 1. 比较排序和非比较排序 2. 计数排序的原理 2.1 计数排序的弊端 3.代码复现 3.1 代码分析 3.2 排序核心 3.3 时间、空间复杂度 1. 比较排序和非比较排序 比较排序是根据排序元素的具体数值比较来进行排序&#xff1b;非比较排序则相反&#xff0c;非比较排序例如&…

输入3.8V~32V 输出2A 的DCDC降压芯片SCT9320

同志们&#xff0c;今天来个降压芯片SCT9320。输入3.8V~32V&#xff0c;输出最高可以达到2A。0.8V的参考电压。500k的开关频率。一共八个引脚&#xff0c;两个NC&#xff08;为什么不做成六个引脚呢&#xff1f;&#xff09;。EN引脚悬空或者接到VIN都可以直接启动&#xff0c;…

C++类和对象详解(2);初识类的默认成员函数

1.类的默认成员函数默认成员函数就是用户没有显示实现&#xff0c;编译器会自动生成的成员函数称为默认成员函数。一个类我们不写的情况下编译器会默认生成以下的6个默认成员函数。&#xff08;1&#xff09;构造函数&#xff1a;主要完成初始化的工作&#xff08;2&#xff09…

PLC通信 Tpc客户端Socket

1.PLC通信 namespace _2.PLC通信 {public partial class Form1 : Form{public Form1(){InitializeComponent();}//连接//1.型号: 跟PLC沟通 使用哪个型号的PLC//2.IP 同上//3.机台号:同上//4.插槽号:同上Plc plc new Plc(CpuType.S71200, "192.168.25.80", 0, 1);pr…

Android 开发实战:从零到一集成 espeak-ng 实现中文离线 TTS(无需账号开箱即用)

简介 在移动应用开发中,语音合成(TTS)技术是提升用户体验的重要工具。然而,许多开发者在集成 TTS 时面临依赖网络、需注册账号、功能受限等问题。本文将带你从零开始,通过开源项目 espeak-ng,实现无需账号、开箱即用的中文离线语音播报。 文章将覆盖以下核心内容: esp…

直播APP集成美颜SDK详解:智能美妆功能的开发实战

在这个“颜值即正义”的时代&#xff0c;用户对直播APP的第一印象&#xff0c;往往来自主播的画面质量。高清的视频固然重要&#xff0c;但如果缺少自然美颜和智能美妆功能&#xff0c;观众体验就会大打折扣。于是&#xff0c;美颜SDK成了直播行业的“标配”。今天&#xff0c;…

C++内存管理:new与delete的深层解析

1. 引言在C的世界里&#xff0c;动态内存管理是一个核心话题。对于从C语言过渡到C的开发者来说&#xff0c;一个常见的困惑是&#xff1a;既然C语言的malloc和free依然可以在C中使用&#xff0c;为什么C还要引入new和delete这两个操作符&#xff1f;本文将深入探讨这两对内存管…

【AI开发】【前后端全栈】[特殊字符] AI 时代的快速开发思维

&#x1f680; AI 时代的快速开发思维 —— 以 Django Vue3 为例的前后端分离快捷开发流程 一、AI 时代的开发新思路 在 AI 的加持下&#xff0c;软件开发不再是“纯体力活”&#xff0c;而是 思维工具自动化 的协作。 过去&#xff1a;需求 → 设计 → 开发 → 测试 → 上…

Day24_【深度学习(3)—PyTorch使用—张量的创建和类型转换】

一、创建张量1.张量基本创建方式torch.tensor 根据指定数据创建张量 &#xff08;最重要&#xff09;torch.Tensor 根据形状创建张量, 其也可用来创建指定数据的张量torch.IntTensor、torch.FloatTensor、torch.DoubleTensor 创建指定类型的张量1.1 torch.tensor# 方式一&…

3-12〔OSCP ◈ 研记〕❘ WEB应用攻击▸利用XSS提权

郑重声明&#xff1a; 本文所有安全知识与技术&#xff0c;仅用于探讨、研究及学习&#xff0c;严禁用于违反国家法律法规的非法活动。对于因不当使用相关内容造成的任何损失或法律责任&#xff0c;本人不承担任何责任。 如需转载&#xff0c;请注明出处且不得用于商业盈利。 …

AI 大模型赋能智慧矿山:从政策到落地的全栈解决方案

矿山行业作为能源与工业原料的核心供给端&#xff0c;长期面临 “安全生产压力大、人工效率低、技术落地难” 等痛点。随着 AI 大模型与工业互联网技术的深度融合&#xff0c;智慧矿山已从 “政策引导” 迈入 “规模化落地” 阶段。本文基于 AI 大模型智慧矿山行业解决方案&…

Node.js 项目依赖包管理

h5打开以查看 一、核心理念&#xff1a;从“能用就行”到“精细化管理” 一个规范的依赖管理体系的目标是&#xff1a; 可复现&#xff1a;在任何机器、任何时间都能安装完全一致的依赖&#xff0c;保证构建结果一致。 清晰可控&#xff1a;明确知道每个依赖为何存在&#x…

洛谷P1835素数密度 详解

题目如下&#xff1a;这里面有部分代码比较有意思&#xff1a;1&#xff0c;为何开始先遍历&#xff0c;最终值小于50000&#xff1f;因为题目要求的右边与左边差小于 10^6 &#xff0c;所以最多有10^3个素数&#xff0c;所以保存里面的素数数量大于1000&#xff0c;而50000的化…

突破限制:FileCodeBox远程文件分享新体验

文章目录【视频教程】1.Docker部署2.简单使用演示3. 安装cpolar内网穿透4. 配置公网地址5. 配置固定公网地址在隐私日益重要的今天&#xff0c;FileCodeBox与cpolar的协同为文件传输提供了安全高效的解决方案。通过消除公网IP限制和隐私顾虑&#xff0c;让每个人都能掌控自己的…

以太网链路聚合实验

一、实验目的掌握使用手动模式配置链路聚合的方法掌握使用静态 LACP 模式配置链路聚合的方法掌握控制静态 LACP 模式下活动链路的方法掌握静态 LACP 的部分特性的配置二、实验环境安装有eNSP模拟器的PC一台&#xff0c;要求PC能联网。三、实验拓扑LSW1与LSW2均为S3700交换机。L…

autMan安装教程

一、安装命令 如果你系统没安装docker&#xff0c;请看往期教程 以下为通用命令 docker run -d --name autman --restart always -p 8080:8080 -p 8081:8081 -v /root/autman:/autMan --log-opt max-size10m --log-opt max-file3 hdbjlizhe/autman:latest解释一下以上命令&…