MySQL主从同步的原理与思考

摘要

分析主从同步出现的原因,MySQL实现主从同步的原理,思考实现原理的局限性和优点

背景

在实际应用中主从同步常用于实现备份、负载均衡和高可用。数据冗余的目的是提高数据的安全性,避免因磁盘损坏导致数据丢失的问题。读写分离的目的是减轻单台主机的通信压力,提高系统的吞吐量。一般业务中的读操作要远远大于写操作,使用主从同步将读操作的请求量分散到多个从主机,使每台从主机的压力都变小。

原理

从整体上看MySQL实现主从同步主要有三个步骤:

  1. 在主库上把数据更改记录到二进制日志(Binary Log)中(这些记录被称为二进制日志事件)。
  2. 备库将主库上的日志复制到自己的中继日志(Relay Log)中。
  3. 备库读取中继日志中的事件,将其重放到备库数据之上。
    在这里插入图片描述

原理分析

保存数据更改事件

在每次准备提交事务完成数据更新前,主库将数据更新的事件记录到二进制日志中。MySQL会按事务提交的顺序而非每条语句的执行顺序来记录二进制日志。在记录二进制日志后,主库会告诉存储引擎可以提交事务了。
MySQL实现了两种方式记录数据的更新,分别是基于语句和基于行。基于语句就是记录写操作命令,基于行是记录执行写操作后受影响的行数据。这两种方式都有利弊,实际情况推荐是两种方式混合使用。

基于语句的方式

实现简单,只需要按事务执行顺序把对应的SQL语句记录下来即可。但是对于一些特殊的SQL会无法同步到正确的数据,如SQL中用到了CURRENT_USER()等与当前环境相关的函数,在从节点重放SQL时可能会得到不一样的数据。
如果正在使用触发器或者存储过程,就不要使用基于语句的复制模式,除非能够清楚地确定不会碰到复制问题。

基于行的方式

将实际数据记录在二进制日志中。这种方式最大的好处是可以正确地复制每一行。在一些场景下可能没有基于语句高效。如更新所有用户的状态,基于语句的方式只需要记录一条SQL语句,而基于行的方式则需要记录所有更改的用户数据。

两种复制方式的比较
  1. 复制的准确性:
  • 基于行的复制几乎可以准确无误地复制所有数据变更,因为它记录了每一行数据的变化,不受SQL语句的影响。这在处理复杂的SQL语句、存储过程、触发器和用户定义函数时尤其重要,因为这些可能在不同的环境中产生不同的结果。
  • 基于语句的复制则可能在某些情况下无法准确复制,比如当复制环境与主库环境不完全相同时,由于SQL语句在从库上的执行可能产生不同的结果。
  1. 资源消耗:
  • 基于行的复制通常会占用更多的日志空间和网络带宽,因为它记录了更多的数据。这在数据变更频繁的场景中尤其明显。
  • 基于语句的复制通常消耗较少的资源,因为它只记录执行的SQL语句,这在数据变更较小或网络带宽受限的环境中可能是更好的选择。
  1. 性能影响:
  • 基于行的复制在处理大量数据变更时可能会对主库的性能产生更大影响,因为它需要记录更多的信息。
  • 基于语句的复制在执行简单的查询和变更时,通常对性能的影响较小。
  1. 可追溯性和审计:
  • 基于行的复制提供了更好的可追溯性,因为可以明确看到哪些行数据发生了变化。
  • 基于语句的复制可能在追踪具体数据变更时不够直观。
  1. 故障恢复:
  • 基于行的复制在故障恢复时可能更容易,因为可以明确知道哪些数据需要被恢复。
  • 基于语句的复制可能需要更复杂的故障恢复策略,尤其是当遇到无法正确执行的语句时。

在实际应用中,MySQL从5.1版本开始引入了混合复制模式(Mixed-Based Replication, MBR)。在这种模式下,MySQL默认尝试使用SBR(基于语句的复制 [Statement-Based Replication]),但在检测到SBR可能失败的情况下自动切换到RBR(基于行的复制 [Row-Based Replication])。这种方式试图平衡资源消耗和复制的准确性,是许多场景下的推荐选择。

主节点与从节点同步数据

首先,备库会启动一个工作线程,称为I/O线程,I/O线程跟主库建立一个普通的客户端连接,然后在主库上启动一个特殊的二进制转储(binlog dump)线程(该线程没有对应的SQL命令),这个二进制转储线程会读取主库上二进制日志中的事件。它不会对事件进行轮询。如果该线程追赶上了主库,它将进入睡眠状态,直到主库发送信号量通知其有新的事件产生时才会被唤醒,备库I/O线程会将接收到的事件记录到中继日志中。

重放SQL

从节点使用单独的SQL线程重放SQL,线程从中继日志中读取事件并在备库执行,从而实现备库数据的更新。当SQL线程追赶上I/O线程时,中继日志通常已经在系统缓存中,所以中继日志的开销很低。

这里是MySQL会经常出现主从延时的关键。因为MySQL主节点是在并发的接收写操作,从节点是单线程方式的恢复数据,当写操作并发高或者有写操作执行慢的时候,就会出现主从延时。

思考

技术的发展是由业务推动的。MySQL最开始是没有主从同步的功能的,随着互联网的发展,对数据冗余的需要和MySQL高性能的需求越来越强,主从同步概念也就出现了。

基于语句的复制(也称为逻辑复制)早在MySQL 3.23版本中就存在,而基于行的复制方式在5.1版本中才被加进来。

主从同步的核心是数据同步。首先想到的应该是同步数据,只同步数据时在某些场景下,同步的代价会比较大。为了实现同步的功能,基于语句的优势就体现出来了。

一项技术从想法到落地是一步步演进的,在演进的过程中会迭代很多次。很多现在用的框架、中间件等都是迭代了很多版本,所以有了想法先能落地是比较重要的,不能纸上谈兵。

MySQL为什么只用一个SQL线程重发SQL语句?只有一个线程重放SQL,在很大程度上总会有延时的。这里我觉得不应该关注在主从延时上。主从同步从理论上说就不可能做到实时,理想情况下也会有几十毫秒的延时。重点应该关注主从同步带来的作用,它实现了数据冗余,提高MySQL的服务能力。

MySQL在5.6版本之后支持了并行复制,使用多条SQL线程重放SQL语句。现代服务器通常配备多核CPU和高带宽网络,单线程复制模型无法充分利用这些资源。高性能和低延时对于许多现代应用程序至关重要。并行复制能够帮助数据库架构更好地支撑实时数据分析、在线交易处理等高要求场景。

尽管单个SQL线程进行重放有以下几点优势:

  1. 数据一致性:
    单个SQL线程确保所有事件按照它们在主库上的发生顺序执行,这对于依赖于顺序执行的事务非常重要,以维持数据的一致性。
  2. 事务完整性:
    单个SQL线程有助于保证事务的原子性和隔离性,确保从库上的事务执行与主库完全相同。
  3. 简化故障恢复:
    使用单个SQL线程使得故障恢复更加简单,因为不需要处理多个并发SQL线程可能引入的复杂性。
  4. 资源管理:
    单线程设计减少了资源争用,如CPU、内存和磁盘I/O,从而降低了系统开销。

但是软件的发展要紧随市场的脚步,否则就会被淘汰。

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

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

相关文章

ubuntu系统Docker常用命令

1.查看docker是否开机启动 sudo systemctl list-unit-files | grep enable|grep docker 2.设置开机启动 sudo systemctl enable docker 3.关闭docker开机启动 sudo systemctl disable docker 4.开启docker服务 sudo service docker start 5.关闭docker服务 sudo servi…

基于CNN的MINIST手写数字识别项目代码以及原理详解

文章目录 项目简介项目下载地址项目开发软件环境项目开发硬件环境前言一、数据加载的作用二、Pytorch进行数据加载所需工具2.1 Dataset2.2 Dataloader2.3 Torchvision2.4 Torchtext2.5 加载项目需要使用的库 三、加载MINIST数据集3.1 数据集简介3.2 数据预处理3.3 加载数据集 四…

2.10、matlab中字符、数字、矩阵、字符串和元胞合并为字符串并将字符串以不同格式写入读出excel

1、前言 在 MATLAB 中,可以使用不同的数据类型(字符、数字、矩阵、字符串和元胞)合并为字符串,然后将字符串以不同格式写入 Excel 文件。 以下是一个示例代码,展示如何将不同数据类型合并为字符串,并以不…

重生奇迹mu魔法师瞬间移动技能

瞬间移动是勇士大陆魔法师所拥有的一项技能。一开始,许多玩家对这种技能的用处感到困惑。实际上,这种技能只能在游戏中不同的位置间进行移动,不能随机传送到地图的其他坐标位置。 一位重生奇迹mu魔法师在PK中不小心使用了一项技能&#xff0c…

【仿真建模-anylogic】数据源组件

Author:赵志乾 Date:2024-07-16 Declaration:All Right Reserved!!! 1. 简介 仿真模型依赖的数据源通常有Excel文件、MySQL数据库两种;针对小数量、大数据量以及是否允许外部依赖等场景设计了一…

labview使用斑马打印机打印标签

使用ZebraDesigner 3设计标签样式 设计完成后打印至文件,生成prn文件 用记事本打开prn文件 ^MMT 标签撕下 ^MMP 标签剥离 按照需求替换FD--------^FS中间内容

路由上传一个ui_control参数(uint32类型)控制页面UI显隐

前言:传一个uint32类型的值,通过 按位或操作符(|)来设置ui_control的值,通过按位与操作符(&)来检测是否显示或隐藏 简单介绍一下两个概念: 按位与操作符和按位或操作符都是二进…

etcd的备份与恢复

一 为什么使用etcd 与ZooKeeper相比,etcd更简单,安装、部署和使用更加容易,并且etcd的某些功能是ZooKeeper所没有的。因此,在很多场景下,etcd 比ZooKeeper更受用户的青,具体表现在如下几个方面: 1 etcd更…

上海市计算机学会竞赛平台2022年10月月赛丙组门禁记录

题目描述 小爱得到了某大楼一天内按时间顺序记录的𝑛n条门禁出入记录,每条记录由两个字符串组成,第一个字符串为出入人员姓名,第二个字符串表示该人员进出状态、为 enter 或 exit 中一项,其中 enter 为进入&#xff0…

鑫创SSS1700USB音频桥芯片USB转IIS芯片

鑫创SSS1700支持IIC初始外部编(EEPROM选项),两线串行总线(I2C总线)用于外部MCU控制整个EEPROM空间可以通过MCU访问用于主机控制同步的USB HID外部串行EEPROM(24C02~24C16)接口,用于客户特定的USB视频、PID、…

jmeter之变量随机参数化以及解决多线程不会随机变化

参考链接: https://www.cnblogs.com/Testing1105/p/12743475.html jmeter 使用random函数多线程运行时数据不会随机变化?_jmeter 线程组循环执行时 变量不变-CSDN博客 1、如下图所示,需要对请求参数 autor 和phone进行随机参数化 2、目前有…

MyBatis源码中的设计模式2

组合模式的应用 组合模式介绍 组合模式(Composite Pattern) 的定义是:将对象组合成树形结构以表示整体和部分的层次结构。组合模式可以让用户统一对待单个对象和对象的组合。 比如:Windows操作系统中的目录结构,通过tree命令实现树形结构展…

【系统架构设计师】十二、系统质量属性与架构评估(开发期质量属性|运行期质量属性|面向架构评估的质量属性|质量属性效用树|质量属性场景)

目录 一、软件系统质量属性 1.1 开发期质量属性 1.2 运行期质量属性 1.3 面向架构评估的质量属性 1.4 质量属性效用树 1.5 质量属性场景 1.5.1 可用性质量属性场景描述 1.5.2 可修改性质量属性场景描述 1.5.3 性能质量属性场景描述 相关推荐 历年真题练习 历…

【vue】输入框和文本域切换

输入框的样子 文本域的样子 当输入框出现滚动条的时候&#xff0c;就自动切换成文本域&#xff1b;当文本域到1行并且宽度小于输入框宽度时切换成输入框 <div class"left_box_inpt"><divclass"right_box_inpt":class"{notclickable: inputd…

OpenResty使用Lua笔记

文章目录 一、基础1、常用2、使用局部变量3、模块化 二、性能提升1、使用fft调用shell2、不要在循环中拼接字符串3、不要频繁修改table4、不要在table中用nil5、做好异常处理6、ngx.var 的性能提升 三、拓展1、加载字符串为动态方法 一、基础 1、常用 OpenResty 中文官网&…

Open3D 最小二乘法拟合点云平面

目录 一、概述 1.1最小二乘法原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2matplotlib可视化 3.3平面拟合方程 前期试读&#xff0c;后续会将博客加入该专栏&#xff0c;欢迎订阅 Open3D点云算法与点云深度学习…

【学术会议征稿】第四届人工智能、虚拟现实与可视化国际学术会议(AIVRV 2024)

第四届人工智能、虚拟现实与可视化国际学术会议&#xff08;AIVRV 2024&#xff09; 2024 4th International Conference on Artificial Intelligence, Virtual Reality and Visualization 第四届人工智能、虚拟现实与可视化国际学术会议&#xff08;AIVRV 2024&#xff09;将…

用python写一个爬虫,爬取google中关于蛇的照片

为了爬取Google中关于蛇的照片&#xff0c;我们可以利用Python中的第三方库进行网页解析和HTTP请求。请注意&#xff0c;这种爬取行为可能违反Google的使用条款&#xff0c;因此建议在合法和允许的情况下使用。以下是一个基本的Python爬虫示例&#xff0c;使用Requests库发送HT…

git 指令速查

1. 创建命令 Create Git 指令命令说明git clone 克隆远程仓库git init初始化本地 git 仓库(即创建新的本地仓库)2. 本地更改 Local Changes Git 指令命令说明git status查看当前分支状态git diff查看已跟踪文件的变更git add 将指定的文件添加到暂存区git add .将所有有变更的…

简约唯美的404HTML源码

源码介绍 简约唯美的404HTML源码,很适合做网站错误页,将下面的源码放到一个空白的html里面,然后上传到服务器里面即可使用 效果预览 完整源码 <!DOCTYPE html> <html><head><meta charset="utf-8"><title>404 Error Example<…