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操作的具体信息,如插入的表名、字段值等。主库会按照事务提交的顺序,将这些写操作事件依次追加到二进制日志文件中。

从库连接与获取日志阶段

  1. 建立连接
    从库通过配置的主库连接信息(包括主库的IP地址、端口、用户名、密码等),使用MySQL的复制协议与主库建立连接。连接建立成功后,从库会向主库发送请求,获取主库当前二进制日志的文件名和位置信息(即File和Position),这些信息将作为从库后续读取主库二进制日志的起始点。
  2. 启动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较为常用的一种主从同步复制模式。

六、主从同步中的常见问题与解决思路

主从数据延迟问题

  1. 原因分析
    主从数据延迟是指从库的数据同步落后于主库,导致主从库之间数据不一致。造成这种问题的原因有很多,例如从库的硬件性能较差,导致SQL线程执行中继日志事件的速度较慢;主库上有大量的并发写操作,产生的二进制日志量过大,从库的I/O线程和SQL线程处理速度跟不上;网络延迟过高,影响了从库从主库获取二进制日志的速度等。
  2. 解决思路
    针对从库硬件性能问题,可以考虑升级从库的硬件配置,如增加CPU、内存等资源,提高SQL线程的执行效率。对于主库写操作过于频繁的情况,可以通过优化主库的业务逻辑,减少不必要的写操作,或者采用分库分表等方式分散写压力。此外,还可以通过调整MySQL的相关参数,如适当增大从库的innodb_log_buffer_size参数,提高I/O线程的读取效率;调整slave_parallel_workers参数,开启并行复制功能(在MySQL 5.6及以上版本支持),让SQL线程能够并行执行中继日志事件,加快数据同步速度。同时,优化网络环境,降低网络延迟,也有助于缓解主从数据延迟问题。

主从同步中断问题

  1. 原因分析
    主从同步中断可能是由于网络故障导致从库与主库的连接断开,或者主库或从库出现异常重启等情况。另外,如果主库的二进制日志文件损坏,从库在读取时也会出现错误,从而导致同步中断。
  2. 解决思路
    当出现网络故障导致连接断开时,从库会自动尝试重连主库。数据库管理员可以通过监控工具及时发现连接中断情况,并检查网络配置,确保网络恢复正常。对于主库或从库异常重启的情况,需要在重启后检查主从同步的状态,可以通过查看从库的状态信息(如使用SHOW SLAVE STATUS语句),确认I/O线程和SQL线程是否正常运行。如果主库的二进制日志文件损坏,可以尝试从备份中恢复二进制日志,或者通过重新初始化主从同步关系来解决问题。具体操作可以先在从库上停止复制(STOP SLAVE;),然后重新配置主库连接信息并启动复制(CHANGE MASTER TO…; START SLAVE;)。

数据一致性问题

  1. 原因分析
    除了前面提到的基于语句复制模式下因函数不确定性导致的数据不一致外,在主从同步过程中,如果主库和从库的MySQL版本不一致,或者配置参数存在差异,也可能会导致数据一致性问题。此外,在一些特殊的场景下,如主库和从库同时对同一条数据进行操作(虽然这种情况应该尽量避免,但在复杂的业务环境中可能会出现),也会引发数据冲突和不一致。
  2. 解决思路
    为了保证数据一致性,首先要确保主库和从库的MySQL版本相同,并且配置参数保持一致。在业务设计上,要严格避免主库和从库同时对同一条数据进行操作的情况。如果出现了数据冲突,可以通过一些数据校验和修复工具来检查和修复不一致的数据。例如,可以使用pt - table - checksum工具来检测主从库之间的数据差异,并根据检测结果进行相应的数据修复操作。

七、总结

MySQL主从同步原理是一个复杂而又精妙的机制,它通过主库记录操作、从库获取并重放操作的流程,借助二进制日志、中继日志以及I/O线程、SQL线程等组件的协同工作,实现了主从库之间的数据同步。了解不同的复制模式以及常见问题的解决思路,对于构建稳定、高效的MySQL主从架构至关重要。随着数据库技术的不断发展,MySQL主从同步也在不断演进和优化,数据库管理员需要持续关注和学习,以更好地应用这一技术来满足业务对数据存储和处理的需求。希望通过本文的介绍,读者能够对MySQL主从同步原理有一个全面而深入的理解。

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

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

相关文章

论文学习16:Learning Transferable Visual Models From Natural Language Supervision

代码来源 Learning Transferable Visual Models From Natural Language Supervisionhttps://arxiv.org/pdf/2103.00020 模块作用 当前最先进的计算机视觉系统被训练用于预测一组固定的、预先定义的目标类别。这种受限的监督方式限制了它们的通用性和可用性,因为要…

[MySQL初阶]MySQL(9)事务机制

标题:[MySQL初阶]MySQL(9)事物机制 水墨不写bug 文章目录 一、认识事务1、多线程访问数据库出现的问题2、对CURD的限制是通过事务机制实现的3、事务的四个属性4、哪些引擎支持事务 二、事务的提交与autocommit设置三、事务的隔离性和隔离级别…

spring-cloud-alibaba-nacos-config使用说明

一、核心功能与定位 Spring Cloud Alibaba Nacos Config 是 Spring Cloud Alibaba 生态中的核心组件之一,专为微服务架构提供动态配置管理能力。它通过整合 Nacos 的配置中心功能,替代传统的 Spring Cloud Config,提供更高效的配置集中化管理…

SonarQube数据库配置

SonarQube部署完成后,在浏览器地址栏输入http://IP:9000可以进入登录页面,以本机运行为例,地址为http://127.0.0.1:9000/,默认登录名:admin,登录密码也是admin。登录后会要求设置密码: 按要求设…

医药档案区块链系统

1. 医生用户模块​​ ​​目标用户​​:医护人员 ​​核心功能​​: ​​检索档案​​:通过关键词或筛选条件快速定位患者健康档案。​​请求授权​​:向个人用户发起档案访问权限申请,需经对方确认。​​查看档案​…

CSS3学习教程,从入门到精通, 化妆品网站 HTML5 + CSS3 完整项目(26)

化妆品网站 HTML5 CSS3 完整项目 下面是一个完整的化妆品网站项目,包含主页、登录页面和注册页面。我将按照您的要求提供详细的代码和注释。 1. 网站规划与需求分析 需求分析 展示化妆品产品信息提供用户注册和登录功能响应式设计,适配不同设备美观…

ROS2 多机时间同步(Chrony配置简明指南)

适用场景: 主机运行 ROS2 Humble(发布 /scan 等),板子运行 ROS2 Foxy(发布 /tf 等),两边通过 ROS_DOMAIN_ID 跨平台通讯。需要保证系统时间对齐,避免 TF 插值失败、建图抖动等问题。…

Nginx配置伪静态,URL重写

Nginx配置伪静态,URL重写 [ Nginx ] 在Nginx低版本中,是不支持PATHINFO的,但是可以通过在Nginx.conf中配置转发规则实现: location / { // …..省略部分代码if (!-e $request_filename) {rewrite ^(.*)$ /index.php?s/$1 l…

电路笔记(元器件):ADC LTC系列模数转换器的输出范围+满量程和偏移调整

LTC1740(LTC1740官方文档)是Analog Devices(原Linear Technology)公司生产的一款高性能、低功耗的14位模数转换器(ADC)。它通常用于需要高精度和快速采样率的应用中,如通信系统、数据采集设备等。同类产品 LTC1746:一款14位、40Ms…

续-算法-数学知识

3、欧拉函数 1、定义: 1~n 中与 n 互质的数的个数 例如:6 的有 1 2 3 4 5 6 其中,与 n 互质 的 数的个数为 2个分别是:1、5 2、计算: $ N p_1^{a1} p_2^{a2} p_3^{a3} … p_k^{ak} $(例如&#x…

C/C++测试框架googletest使用示例

文章目录 文档编译安装示例参考文章 文档 https://github.com/google/googletest https://google.github.io/googletest/ 编译安装 googletest是cmake项目,可以用cmake指令编译 cmake -B build && cmake --build build将编译产物lib和include 两个文件夹…

LintCode第974题-求矩阵各节点的最短路径(以0为标准)

描述 给定一个由0和1组成的矩阵,求每个单元格最近的0的距离。 两个相邻细胞之间的距离是1。 给定矩阵的元素数不超过10,000。 在给定的矩阵中至少有一个0。 单元格在四个方向上相邻:上,下,左和右。 样例 例1: 输入: [[0,0,0],[0,0,0],[0…

Redis核心机制-缓存、分布式锁

目录 缓存 缓存更新策略 定期生成 实时生成 缓存问题 缓存预热(Cache preheating) 缓存穿透(Cache penetration) 缓存雪崩(Cache avalanche) 缓存击穿(Cache breakdown) 分…

CF每日5题(1300-1500)

最近急速补练蓝桥杯中,疏于cf练习。 感觉自己过题还是太慢了。 今日水题,我水水水水。 1- 1979C lcm 水 1400 第 i i i局赢了,1个硬币顶 k [ i ] k[i] k[i]个贡献,所以每局分硬币 x i 1 k [ i ] x_i{1\over k[i]} xi​k[i]1​个…

从代码学习深度学习 - LSTM PyTorch版

文章目录 前言一、数据加载与预处理1.1 代码实现1.2 功能解析二、LSTM介绍2.1 LSTM原理2.2 模型定义代码解析三、训练与预测3.1 训练逻辑代码解析3.2 可视化工具功能解析功能结果总结前言 深度学习中的循环神经网络(RNN)及其变种长短期记忆网络(LSTM)在处理序列数据(如文…

easy-poi 一对多导出

1. 需求: 某一列上下两行单元格A,B值一样且这两个单元格, 前面所有列对应单元格值一样的话, 就对A,B 两个单元格进行纵向合并单元格 1. 核心思路: 先对数据集的国家,省份,城市...... id 身份证进行排序…

AI比人脑更强,因为被植入思维模型【42】思维投影思维模型

giszz的理解:本质和外在。我们的行为举止,都是我们的内心的表现。从外边可以看内心,从内心可以判断外在。曾国藩有7个识人的方法,大部分的人在他的面前如同没穿衣服一样。对于我们自身的启迪,我认为有四点&…

Spring Boot 打印日志

1.通过slf4j包中的logger对象打印日志 Spring Boot内置了日志框架slf4j,在程序中调用slf4j来输出日志 通过创建logger对象打印日志,Logger 对象是属于 org.slf4j 包下的不要导错包。 2.日志级别 日志级别从高到低依次为: FATAL:致命信息,表…

【IOS webview】源代码映射错误,页面卡住不动

报错场景 safari页面报源代码映射错误,页面卡住不动。 机型:IOS13 技术栈:react 其他IOS也会报错,但不影响页面显示。 debug webpack配置不要GENERATE_SOURCEMAP。 解决方法: GENERATE_SOURCEMAPfalse react-app…

ES中经纬度查询geo_point

0. ES版本 6.x版本 1. 创建索引 PUT /location {"settings": {"number_of_shards": 1,"number_of_replicas": 0},"mappings": {"location": {"properties": {"id": {"type": "keywor…