MySQL篇(五)MySQL主从同步原理深度剖析
MySQL篇(五)MySQL主从同步原理深度剖析
- MySQL篇(五)MySQL主从同步原理深度剖析
- 一、引言
- 二、MySQL主从同步基础概念
- 主库(Master)
- 从库(Slave)
- 二进制日志(Binary Log)
- 中继日志(Relay Log)
- 三、MySQL主从同步的具体流程
- 主库操作记录阶段
- 从库连接与获取日志阶段
- 从库重放执行阶段
- 四、关键线程与日志的协同工作
- I/O线程的作用与工作细节
- SQL线程的作用与工作细节
- 二进制日志与中继日志的关联
- 五、MySQL主从同步的几种模式
- 基于语句的复制(Statement - Based Replication,SBR)
- 基于行的复制(Row - Based Replication,RBR)
- 混合模式的复制(Mixed - Based Replication,MBR)
- 六、主从同步中的常见问题与解决思路
- 主从数据延迟问题
- 主从同步中断问题
- 数据一致性问题
- 七、总结
MySQL篇(五)MySQL主从同步原理深度剖析
一、引言
在当今数据驱动的时代,数据库的高可用性和性能扩展至关重要。MySQL主从同步作为一种广泛应用的技术手段,能够有效地实现数据冗余备份、读写分离以提升系统整体性能等功能。深入理解MySQL主从同步原理,对于数据库管理员进行系统架构设计、故障排查以及性能优化都有着不可忽视的意义。接下来,我们将逐步揭开MySQL主从同步原理的神秘面纱。
二、MySQL主从同步基础概念
主库(Master)
主库是数据写入的源头,负责处理客户端的写操作请求,如INSERT、UPDATE、DELETE等语句。在主从同步架构中,主库将自身执行的写操作记录下来,以便后续能传递给从库,确保从库的数据与主库保持一致。
从库(Slave)
从库主要承担数据读取的任务,它通过与主库建立连接,接收主库发送过来的写操作记录,并在本地进行重放执行,从而实现与主库数据的同步。从库可以有多个,它们可以分担主库的读压力,提高整个系统的并发读取能力。
二进制日志(Binary Log)
二进制日志是MySQL主库中非常关键的一个组件,它记录了主库上所有的写操作事件。这些事件按照时间顺序依次记录,包括操作的类型(如插入、更新、删除)、涉及的表、具体的操作数据等信息。二进制日志是主从同步过程中主库向从库传递数据变更信息的核心载体。
中继日志(Relay Log)
中继日志是从库特有的日志文件。从库在接收到主库发送过来的二进制日志内容后,会先将其写入到中继日志中。中继日志起到一个缓冲和中转的作用,从库的SQL线程会从中继日志中读取事件并在本地执行,进而完成数据的同步。
三、MySQL主从同步的具体流程
主库操作记录阶段
当客户端向主库发起写操作请求时,主库会在内存中对数据进行相应的修改,并将该写操作以事件的形式记录到二进制日志中。例如,当执行一条INSERT语句向某张表中插入一条记录时,主库首先会在内存的相关数据结构中完成数据插入操作,同时生成一个对应的二进制日志事件,该事件包含了INSERT操作的具体信息,如插入的表名、字段值等。主库会按照事务提交的顺序,将这些写操作事件依次追加到二进制日志文件中。
从库连接与获取日志阶段
- 建立连接
从库通过配置的主库连接信息(包括主库的IP地址、端口、用户名、密码等),使用MySQL的复制协议与主库建立连接。连接建立成功后,从库会向主库发送请求,获取主库当前二进制日志的文件名和位置信息(即File和Position),这些信息将作为从库后续读取主库二进制日志的起始点。 - 启动I/O线程
从库会启动一个I/O线程,该线程负责与主库进行通信,从主库的二进制日志中读取写操作事件。I/O线程根据之前获取到的二进制日志文件名和位置信息,向主库发送读取请求,主库接收到请求后,会从对应的位置开始,将二进制日志中的事件发送给从库的I/O线程。I/O线程接收到这些事件后,会将其写入到从库的中继日志中。在这个过程中,I/O线程会持续不断地与主库进行交互,只要主库有新的写操作记录到二进制日志中,I/O线程就会及时获取并写入中继日志。
从库重放执行阶段
从库在将主库的写操作事件写入中继日志后,会启动另一个重要的线程——SQL线程。SQL线程负责从中继日志中读取事件,并按照事件在中继日志中的顺序,在从库本地进行重放执行。例如,对于从主库接收到的INSERT事件,SQL线程会在从库对应的表中执行相同的INSERT操作,将数据插入到表中。通过这种方式,从库能够逐步将主库上的写操作在本地进行复制,从而实现与主库数据的同步。SQL线程在执行过程中,会严格遵循事务的顺序,确保数据同步的准确性和一致性。
四、关键线程与日志的协同工作
I/O线程的作用与工作细节
I/O线程在MySQL主从同步过程中扮演着数据传输桥梁的角色。它与主库保持着持续的连接,不断监听主库二进制日志的变化。在获取二进制日志事件时,I/O线程需要处理网络传输、数据缓冲等一系列问题。为了保证数据传输的稳定性和高效性,I/O线程会采用一些优化策略,如批量读取二进制日志事件,减少网络传输的次数。同时,I/O线程还需要处理可能出现的网络故障、主库连接中断等异常情况,当遇到这些问题时,它会尝试进行重连和恢复数据传输,以确保从库能够持续获取主库的写操作记录。
SQL线程的作用与工作细节
SQL线程专注于在从库本地执行中继日志中的事件。它需要对中继日志中的各种操作事件进行解析和执行。在执行过程中,SQL线程要保证操作的顺序性和准确性,避免因为并发执行或者执行顺序错误而导致数据不一致。对于一些复杂的操作,如涉及到事务、外键约束等情况,SQL线程需要严格按照MySQL的事务处理规则和约束机制进行处理。此外,SQL线程还会对执行结果进行记录和校验,确保操作成功执行并且数据同步准确。
二进制日志与中继日志的关联
二进制日志是主库写操作的原始记录,而中继日志则是从库接收主库数据变更信息的中间存储。从库的I/O线程将二进制日志中的内容复制到中继日志中,中继日志成为了从库SQL线程执行操作的数据源。两者之间的关联确保了主库的写操作能够准确无误地传递到从库并得到执行,是MySQL主从同步实现数据一致性的关键环节。
五、MySQL主从同步的几种模式
基于语句的复制(Statement - Based Replication,SBR)
在这种模式下,主库将执行的SQL语句记录到二进制日志中,从库在重放时直接执行这些SQL语句。例如,主库执行了一条简单的UPDATE语句“UPDATE users SET age = age + 1 WHERE id = 1;”,主库会将这条语句记录到二进制日志中,从库的SQL线程从中继日志中读取到这条语句后,会在本地执行相同的UPDATE操作。这种模式的优点是二进制日志文件相对较小,因为它只记录SQL语句,而不是实际的数据变更,能够节省磁盘空间和网络传输带宽。然而,它也存在一些局限性,比如对于一些具有不确定性的函数(如NOW()、RAND()等),在主从库上执行可能会得到不同的结果,导致数据不一致。
基于行的复制(Row - Based Replication,RBR)
基于行的复制模式下,主库会记录每一行数据的实际变更情况到二进制日志中。当主库对某一行数据进行修改时,二进制日志会记录修改前和修改后该行数据的具体内容。例如,对于上述UPDATE操作,二进制日志会记录users表中id为1的这一行数据修改前的age值和修改后的age值。从库在重放时,会根据这些具体的数据变更信息进行操作。这种模式的优点是能够保证主从库数据的高度一致性,避免了基于语句复制中因函数不确定性等问题导致的数据不一致情况。但缺点是二进制日志文件会相对较大,因为它记录了每一行数据的详细变更,会占用更多的磁盘空间和网络带宽。
混合模式的复制(Mixed - Based Replication,MBR)
混合模式结合了基于语句的复制和基于行的复制的优点。在这种模式下,MySQL会根据具体的操作情况自动选择合适的复制方式。一般情况下,对于普通的、确定性的SQL语句,会采用基于语句的复制方式;而对于可能导致数据不一致的操作(如涉及不确定性函数的操作),则会自动切换为基于行的复制方式。这种模式在一定程度上平衡了日志文件大小和数据一致性之间的关系,是MySQL较为常用的一种主从同步复制模式。
六、主从同步中的常见问题与解决思路
主从数据延迟问题
- 原因分析
主从数据延迟是指从库的数据同步落后于主库,导致主从库之间数据不一致。造成这种问题的原因有很多,例如从库的硬件性能较差,导致SQL线程执行中继日志事件的速度较慢;主库上有大量的并发写操作,产生的二进制日志量过大,从库的I/O线程和SQL线程处理速度跟不上;网络延迟过高,影响了从库从主库获取二进制日志的速度等。 - 解决思路
针对从库硬件性能问题,可以考虑升级从库的硬件配置,如增加CPU、内存等资源,提高SQL线程的执行效率。对于主库写操作过于频繁的情况,可以通过优化主库的业务逻辑,减少不必要的写操作,或者采用分库分表等方式分散写压力。此外,还可以通过调整MySQL的相关参数,如适当增大从库的innodb_log_buffer_size参数,提高I/O线程的读取效率;调整slave_parallel_workers参数,开启并行复制功能(在MySQL 5.6及以上版本支持),让SQL线程能够并行执行中继日志事件,加快数据同步速度。同时,优化网络环境,降低网络延迟,也有助于缓解主从数据延迟问题。
主从同步中断问题
- 原因分析
主从同步中断可能是由于网络故障导致从库与主库的连接断开,或者主库或从库出现异常重启等情况。另外,如果主库的二进制日志文件损坏,从库在读取时也会出现错误,从而导致同步中断。 - 解决思路
当出现网络故障导致连接断开时,从库会自动尝试重连主库。数据库管理员可以通过监控工具及时发现连接中断情况,并检查网络配置,确保网络恢复正常。对于主库或从库异常重启的情况,需要在重启后检查主从同步的状态,可以通过查看从库的状态信息(如使用SHOW SLAVE STATUS语句),确认I/O线程和SQL线程是否正常运行。如果主库的二进制日志文件损坏,可以尝试从备份中恢复二进制日志,或者通过重新初始化主从同步关系来解决问题。具体操作可以先在从库上停止复制(STOP SLAVE;),然后重新配置主库连接信息并启动复制(CHANGE MASTER TO…; START SLAVE;)。
数据一致性问题
- 原因分析
除了前面提到的基于语句复制模式下因函数不确定性导致的数据不一致外,在主从同步过程中,如果主库和从库的MySQL版本不一致,或者配置参数存在差异,也可能会导致数据一致性问题。此外,在一些特殊的场景下,如主库和从库同时对同一条数据进行操作(虽然这种情况应该尽量避免,但在复杂的业务环境中可能会出现),也会引发数据冲突和不一致。 - 解决思路
为了保证数据一致性,首先要确保主库和从库的MySQL版本相同,并且配置参数保持一致。在业务设计上,要严格避免主库和从库同时对同一条数据进行操作的情况。如果出现了数据冲突,可以通过一些数据校验和修复工具来检查和修复不一致的数据。例如,可以使用pt - table - checksum工具来检测主从库之间的数据差异,并根据检测结果进行相应的数据修复操作。
七、总结
MySQL主从同步原理是一个复杂而又精妙的机制,它通过主库记录操作、从库获取并重放操作的流程,借助二进制日志、中继日志以及I/O线程、SQL线程等组件的协同工作,实现了主从库之间的数据同步。了解不同的复制模式以及常见问题的解决思路,对于构建稳定、高效的MySQL主从架构至关重要。随着数据库技术的不断发展,MySQL主从同步也在不断演进和优化,数据库管理员需要持续关注和学习,以更好地应用这一技术来满足业务对数据存储和处理的需求。希望通过本文的介绍,读者能够对MySQL主从同步原理有一个全面而深入的理解。
相关文章:
MySQL篇(五)MySQL主从同步原理深度剖析
MySQL篇(五)MySQL主从同步原理深度剖析 MySQL篇(五)MySQL主从同步原理深度剖析一、引言二、MySQL主从同步基础概念主库(Master)从库(Slave)二进制日志(Binary Log&#x…...
PyQt5和OpenCV车牌识别系统
有需要请加文章底部Q哦 可远程调试 PyQt5和OpenCV车牌识别系统 一 介绍 此车牌识别系统基于PyQt5和OpenCV开发,蓝牌,新能源(绿牌),黄牌,白牌均可以准确识别,支持中文识别,可以导出识别结果(Excel格式)。此…...
【Android Studio 下载 Gradle 失败】
路虽远行则将至,事虽难做则必成 一、事故现场 下载Gradle下载不下来,没有Gradle就无法把项目编译为Android应用。 二、问题分析 观察发现下载时长三分钟,进度条半天没动,说明这个是国外的东西,被墙住了,需…...
Xshell Plus 6下载与安装
文章目录 Xshell Plus 6 简介(一)网络连接与协议支持(二)会话管理(三)安全特性(四)文件传输功能(因集成Xftp 6 )(五)个性化与便捷功能…...
格式工厂怎样插入内置音频文件
打开格式工厂,在打开的页面选择 “视频” 选项;在视频选项里点击 “混流”;在混流页面右侧点击 “添加文件”,分别添加上视频文件和要插入的内置音频文件;在 “输出设置” 的下拉菜单里,分别选好要输出的视…...
CNN 里面能自然起到防止过拟合的办法
在 CNN(卷积神经网络)中,其实有 一些结构和机制 天然就具有防止过拟合(overfitting)的作用,不完全依赖额外的正则化手段。 🧠 一、CNN 天然防过拟合的几个原因: 1️⃣ 局部连接&…...
九、重学C++—类和函数
上一章节: 八、重学C—动态多态(运行期)-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/147004745?spm1001.2014.3001.5502 本章节代码: cpp/cppClassAndFunc.cpp CuiQingCheng/cppstudy - 码云 - 开源中国…...
使用MCP服务器实现AI任务完成通知:让Cursor更智能
0. 简介 在使用AI工具进行长时间任务时,常常需要等待结果。MCP(Model Context Protocol)服务器"mcp_server_notify"提供了一个优雅的解决方案,让AI在完成任务后通过系统通知提醒你。本文将介绍如何在Cursor中配置和使用…...
解决 Hugging Face SentenceTransformer 下载失败的完整指南:ProxyError、SSLError与手动下载方案
问题背景 在使用 Hugging Face 的 SentenceTransformer 加载预训练模型 all-MiniLM-L6-v2 时,遇到了以下错误: 代理连接失败(ProxyError / SSLError: KRB5_S_TKT_NYV)大文件下载中断(unexpected EOF while reading&a…...
Linux | I.MX6ULL开发板固件烧录所需文件详述(9)
01 搞清楚手里的开发板是 EMMC 还是 NAND FLASH 。默认我的商业级是EMMC ,开关:10011010 终结者i.MX6ULL 开卡板分为工业级和商业级两种不同的开发板。 商业级的核心板,它的存储是 EMMC 的,EMMC 的存储是类似于正方形的芯片,旁边是 NAND FLASH的一个封装,因为我们这里…...
论文阅读笔记:Denoising Diffusion Implicit Models (5)
0、快速访问 论文阅读笔记:Denoising Diffusion Implicit Models (1) 论文阅读笔记:Denoising Diffusion Implicit Models (2) 论文阅读笔记:Denoising Diffusion Implicit Models (…...
【AI论文】GPT-ImgEval:一个用于诊断GPT4o在图像生成方面的综合基准
摘要:OpenAI的GPT4o模型最近的突破在图像生成和编辑方面展现了令人惊讶的良好能力,引起了社区的极大兴奋。 本技术报告介绍了第一眼评估基准(名为GPT-ImgEval),定量和定性诊断GPT-4o在三个关键维度的性能:&…...
CSS3学习教程,从入门到精通, 学院网站完整项目 - HTML5 + CSS3 实现(25)
学院网站完整项目 - HTML5 CSS3 实现 下面是一个完整的学院网站项目,包含主页、新闻列表页、新闻详情页和视频宣传页的实现。我将按照您的要求提供详细的代码和注释。 项目结构 college-website/ ├── index.html # 主页 ├── news-list.html …...
Java虚拟机面试题:内存管理(中)
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
如何绕过myabtis-plus的逻辑删除条件
目标 mp中所有方法都会带上逻辑删除,如果启用了逻辑删除,有时候我们需要忽略逻辑删除.改如何实现 解决方法 自定义DeleteReal 方法 import com.baomidou.mybatisplus.core.enums.SqlMethod; import com.baomidou.mybatisplus.core.injector.AbstractMethod; import com.ba…...
王者荣耀的游戏匹配机制
王者荣耀的匹配机制主要基于ELO评分系统(隐藏分机制)和段位匹配,旨在平衡对局双方实力,同时通过多种策略控制玩家胜率趋近50%。 一、匹配机制核心 1. ELO评分(隐藏分) - 系统根据玩家的胜负、KDA、伤害量、…...
游戏无法启动?XINPUT1_3.dll 丢失的终极解决方案
当你兴奋地启动一款新游戏时,突然弹出一个错误提示——‘程序无法启动,因为计算机中丢失 XINPUT1_3.dll’。这种问题在 PC 玩家中非常常见,尤其是运行一些较老的游戏时。XINPUT1_3.dll 是 DirectX 运行库的关键组件,缺失会导致游戏…...
macOS下SourceInsight的替代品
macOS 推荐的几款开源、轻量级、且功能类似于 SourceInsight 的源码阅读工具(排除 VS Code): 1. Zeal(离线文档 简单代码导航) 官网/GitHub: https://zealdocs.org/特点: 轻量级离线文档浏览器࿰…...
嵌入式硬件如何在PADS中将原理图转换为PCB详解
本文旨在讲述如何在PADS中将原理图转换为PCB。 本文以C51原理图作为例子。 1.首先在桌面上打开PADS Logic 2.找到菜单栏的文件选项,然后点击新建。 点击新建之后出现如下界面。...
FreeRTOS 软件定时器工作原理及应用
FreeRTOS 软件定时器工作原理及应用 FreeRTOS 的 软件定时器(Software Timer) 是一种基于系统节拍(Tick)的计时机制,允许开发者创建周期性或单次触发的定时任务,而无需依赖硬件定时器。软件定时器由 定时器服务任务(Timer Service Task) 管理,适用于需要时间控制但无…...
软件工程-UML
例图,类图,状态图,顺序图,活动图 目录 例图 类图 状态图 顺序图 活动图 例图 例图由四个元素组成,参与者、用例、系统边界、参与者和用例之间的关系 参与者用一个小人表示,用例用椭圆表示ÿ…...
力扣经典算法篇-9-跳跃游戏(贪心算法,反向递推)
题干: 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 示例 …...
【Linux学习笔记】初识进程概念和进程PCB
【Linux学习笔记】初识冯诺依曼体系和进程PCB 🔥个人主页:大白的编程日记 🔥专栏:Linux学习笔记 文章目录 【Linux学习笔记】初识冯诺依曼体系和进程PCB前言一. 冯诺依曼体系结构1.1 关于冯诺依曼体系的要点: 二. 操…...
深入探索 Linux Top 命令:15 个实用示例
在 Linux 系统管理中,top 命令是系统性能监控不可或缺的工具。它能够实时显示系统的 CPU、内存、进程等资源的使用情况,帮助您快速识别性能瓶颈和异常进程。本文将详细介绍 15 个实用的 top 命令使用示例,旨在帮助您更高效地进行系统管理与优…...
Linux命令-cut
cut 命令是一个非常实用的工具,用于从文本中提取特定部分。 参数 功能 -b 按字节提取内容 -c 按字符提取内容 -f 按字段提取内容,需配合 -d 指定分隔符 -d 指定字段分隔符(默认是 \t) -s 只处理包含分隔符的行 –complement 提取除…...
风电行业预测性维护解决方案:AIoT驱动下的风机健康管理革命
在风电行业向平价化与智慧化转型的关键阶段,如何通过预测性维护技术将风机可用率提升至99%以上?本文基于中讯烛龙系统的实战经验,解析如何构建基于LSTM、数字孪生与边缘计算的智能运维体系,实现从“故障维修”到“健康预判”的技术…...
通过Postman和OAuth 2.0连接Dynamics 365 Online的详细步骤
🌟 引言 在企业应用开发中,Dynamics 365 Online作为微软的核心CRM平台,提供了强大的Web API接口。本文将教你如何通过Postman和OAuth 2.0认证实现与Dynamics 365的安全连接,轻松调用数据接口。 📝 准备工作 工具安装…...
Ubuntu-安装redis
apt list | grep redis apt 类似于应用商店的感觉 ‘|’的作用是作为管道,把前者到的数据列表再通过grep筛选出包含redis字眼的一行数据 需要联网 apt install redis -y 修改配置文件 vi /etc/redis/redis.conf redis是客户端服务器程序 需要先把服务器给后台启…...
Mac 上使用 mysql -u root -p 命令,出现“zsh: command not found: mysql“?
一、确定 MySQL 安装路径: 如果你是使用 Homebrew 安装的 MySQL,通常安装路径是 /usr/local/mysql/bin 。 如果你是通过官方 DMG 安装包安装的 MySQL,默认安装路径可能是 /usr/local/mysql/bin 。你可以在终端中使用以下命令来查找 MySQL 的…...
P1883 【模板】三分 | 函数
题目描述 给定 n 个二次函数 f1(x),f2(x),…,fn(x)(均形如 ax2bxc),设 F(x)max{f1(x),f2(x),...,fn(x)},求 F(x) 在区间 [0,1000] 上的最小值。 输入格式 输入第一行为正整数 T,表示有 T 组数据。 每组…...
