当前位置: 首页 > news >正文

MySQL45讲 第二十四讲 MySQL是怎么保证主备一致的?——阅读总结

文章目录

  • MySQL45讲 第二十四讲 MySQL是怎么保证主备一致的?——阅读总结
    • 一、MySQL 主备基本原理
      • (一)主备切换流程
      • (二)主备数据同步流程
    • 二、binlog 格式及相关问题
      • (一)binlog 的三种格式
      • (二)格式对比与选择
    • 三、循环复制问题及解决
      • (一)循环复制现象
      • (二)解决逻辑
    • 四、总结与思考

MySQL45讲 第二十四讲 MySQL是怎么保证主备一致的?——阅读总结

在 MySQL 数据库的世界里,主备一致性是确保数据可靠性和高可用性的关键。就深入探讨 MySQL 是如何保证主备一致的,这涉及到 binlog 的多种格式、主备复制的详细流程以及双 M 结构下的循环复制问题等诸多重要知识点。


一、MySQL 主备基本原理

(一)主备切换流程

在这里插入图片描述

  1. 状态 1

    :如图 1 所示,客户端的读写直接访问节点 A,节点 B 作为 A 的备库,通过同步 A 的更新来保持数据一致。此时,建议将备库 B 设置为只读(readonly)模式,原因如下:

    • 防止运营类查询语句在备库上的误操作
    • 避免切换逻辑出现 bug,如双写导致主备不一致。
    • 可依据 readonly 状态判断节点角色
    • 设置为 readonly,那主库怎么和备库进行同步?同步更新的线程拥有超级(super)权限,仍可进行数据同步。
  2. 状态 2:当需要切换时,客户端读写访问切换到节点 B,节点 A 成为 B 的备库。

(二)主备数据同步流程

在这里插入图片描述

  1. 备库设置:在备库 B 上通过 change master 命令设置主库 A 的相关信息,包括 IP、端口、用户名、密码以及 binlog 的起始位置(包含文件名和日志偏移量),然后执行 start slave 命令启动图中 io_threadsql_thread 两个线程。其中 io_thread 负责与主库建立连接。
  2. 主库操作:主库 A 校验完用户名和密码后,按照备库 B 的请求位置读取 binlog,并将其发送给 B。
  3. 备库接收与执行:备库 B 收到 binlog 后,写入本地中转日志(relay log),sql_thread 读取 relay log,解析并执行其中的命令。

二、binlog 格式及相关问题

(一)binlog 的三种格式

如果要在表中删除一行数据的话,我们来看看这个delete语句的binlog是怎么记录的。

mysql> CREATE TABLE `t` (
`id` int(11) NOTNULL,
`a` int(11) DEFAULTNULL,
`t_modified` timestamp NOTNULL DEFAULTCURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `a` (`a`),
KEY `t_modified`(`t_modified`)
) ENGINE=InnoDB;
insert into t values(1,1,'2018-11-13');
insert into t values(2,2,'2018-11-12');
insert into t values(3,3,'2018-11-11');
insert into t values(4,4,'2018-11-10');
insert into t values(5,5,'2018-11-09');
  1. statement 格式:记录 SQL 语句原文,例如执行delete from t /*comment*/ where a>=4 and t_modified<='2018-11-10' limit 1语句时,binlog 中会如实记录该 SQL 语句,包括自动添加的use 'test'命令(确保在备库能正确更新到指定库的表),同时还会记录注释等信息。然而,这种格式可能导致主备数据不一致,如上述 delete 语句,若主库和备库使用不同索引执行,可能删除不同行。

    在这里插入图片描述

  2. row 格式:不记录 SQL 语句原文,而是通过 Table_mapDelete_rows 等事件来定义操作。例如上述 delete 语句,会记录操作的表信息(Table_map event)以及删除行为(Delete_rows event),且会记录真实删除行的主键 id,保证备库执行时删除正确的行。此外,对于 insert 和 update 语句,row 格式的 binlog 也会记录足够信息以便数据恢复,如 insert 语句会记录所有字段信息,update 语句会记录修改前和修改后的整行数据。

    在这里插入图片描述

    该事务从8900开始,通过mysqlbinlog -vvdata/master.000001 --start-position=8900;指令,查看

    在这里插入图片描述

    binlog里面记录了真实删除行的主键id,这样 binlog传到备库去的时候,就肯定会删除id=4的行,不会有主备删除不同行的问题。

    为什么会有mixed格式的binlog?

    有些statement格式的binlog虽然简单但可能会导致主备不一致,所以要使用row格式。但row格式又比较占用空间,所以算是一种折中的办法。mixed格式可以利用statment格式的优点,同时又避免了数据不一致的风险。

  3. mixed 格式:MySQL 会判断 SQL 语句是否可能引起主备不一致,若有可能则使用 row 格式,否则使用 statement 格式,是一种折中的方案。但在某些情况下,如执行insert into t values(10,10, now())时,虽可能存在主备不一致风险,但仍会记录为 statement 格式,不过会通过 SET TIMESTAMP 命令约定 now () 函数的返回时间,确保主备数据一致性。

    在这里插入图片描述

(二)格式对比与选择

  1. 数据恢复优势:row 格式在数据恢复方面具有明显优势,可通过反转操作恢复误执行的 delete、insert 或 update 语句,而 statement 格式相对较难实现精确恢复。
  2. 空间占用与性能:row 格式占用空间较大,写 binlog 时耗费 IO 资源,影响执行速度;statement 格式占用空间小,但可能存在数据不一致风险。因此,越来越多的场景推荐使用 row 格式的 binlog,不过也可根据实际情况选择 mixed 格式,而一般不建议使用单纯的 statement 格式。

三、循环复制问题及解决

(一)循环复制现象

在双 M 结构中,业务逻辑在节点 A 更新语句后生成 binlog 发给节点 B,B 执行后也生成 binlog,若节点 A 同时是节点 B 的备库,可能会导致循环执行更新语句,即循环复制。

在这里插入图片描述

(二)解决逻辑

  1. server id 设置:规定两个库的 server id 必须不同,否则不能设定为主备关系。
  2. binlog 生成规则:备库在重放 binlog 过程中生成与原 binlog 的 server id 相同的新 binlog
  3. 日志接收判断:每个库收到主库发来的日志后,先判断 server id,若与自己相同则直接丢弃,从而避免循环复制。例如,节点 A 更新事务的 binlog 记有 A 的 server id,传给节点 B 执行后,B 生成的 binlog 的 server id 也是 A 的 server id,再传回 A 时,A 会因 server id 相同而不处理该日志。

四、总结与思考

MySQL 通过 binlog 实现主备同步,binlog 的三种格式各有优劣,在保证主备一致性方面发挥着关键作用。主备复制流程涉及多个步骤和线程协作,双 M 结构虽有循环复制问题,但可通过 server id 机制解决。

相关文章:

MySQL45讲 第二十四讲 MySQL是怎么保证主备一致的?——阅读总结

文章目录 MySQL45讲 第二十四讲 MySQL是怎么保证主备一致的&#xff1f;——阅读总结一、MySQL 主备基本原理&#xff08;一&#xff09;主备切换流程&#xff08;二&#xff09;主备数据同步流程 二、binlog 格式及相关问题&#xff08;一&#xff09;binlog 的三种格式&#…...

Visual Studio 圈复杂度评估

VisualStudio自带的有工具 之后就可以看到分析结果...

Springboot之登录模块探索(含Token,验证码,网络安全等知识)

简介 登录模块很简单&#xff0c;前端发送账号密码的表单&#xff0c;后端接收验证后即可~ 淦&#xff01;可是我想多了&#xff0c;于是有了以下几个问题&#xff08;里面还包含网络安全问题&#xff09;&#xff1a; 1.登录时的验证码 2.自动登录的实现 3.怎么维护前后端…...

golang调用模组程序实现交互输入自动化,获取imei及iccid

应用场景&#xff1a;在openwrt下调用移远的测试程序&#xff0c;并实现输入自动话&#xff0c;获取imei rootOpenWrt:~# ql-api-test Test groups:0: ql_dsi1: ql_nw2: ql_sim3: ql_dev4: ql_voice5: ql_sms6: ql_adc7: ql_i2c8: …...

ACE之单例

单例簇 使用双重锁检查优化 #mermaid-svg-RMOXQ0KMo0VnJe7V {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-RMOXQ0KMo0VnJe7V .error-icon{fill:#552222;}#mermaid-svg-RMOXQ0KMo0VnJe7V .error-text{fill:#552222…...

泷羽sec学习打卡-云技术基础1-docker

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 关于云技术基础的那些事儿-Base1 一、云技术基础什么是云架构&#xff1f;什么是云服务&#xff1f;什么…...

7天掌握SQL - 第一天:数据库基础与SQL入门

目标 在本章节中&#xff0c;我们将学习数据库的基本概念和SQL语言的基础操作&#xff0c;为后续的深入学习打下坚实的基础。 一级目录 数据库基本概念SQL语言基础SQL操作实践推荐资源总结 1. 数据库基本概念 1.1 表&#xff08;Table&#xff09; 表是数据库中存储数据的…...

A037-基于Spring Boot的二手物品交易的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…...

【异常记录】Junitmock之InvalidUseOfMatchersException异常

mock之InvalidUseOfMatchersException异常 新手小白对mock一知半解&#xff0c;就开始自测了&#xff0c;被这个InvalidUseOfMatchersException困扰了一晚上。排查了好久&#xff0c;大多数文章都把英文翻译了一遍&#xff0c;但自检无问题。最后发现是&#xff0c;注入的时候…...

Spring Boot3自定义starter

1、加入必要依赖 plugins {id javaid org.springframework.boot version 3.2.6id io.spring.dependency-management version 1.1.5 } group org.example.test.starter version 1.1.0jar{enabledtrue// resolveMainClassName }java {toolchain {languageVersion JavaLanguage…...

掌控 Solidity:事件日志、继承和接口的深度解析

Solidity 是以太坊智能合约的主要编程语言&#xff0c;它的强大之处在于能够帮助开发者构建安全、高效的去中心化应用。在我参与的多个项目中&#xff0c;事件日志、继承和接口这三个概念始终贯穿其中&#xff0c;成为构建复杂智能合约的关键技术。今天就来聊聊Solidity中的错误…...

新手教学系列——善用 VSCode 工作区,让开发更高效

引言 作为一名开发者,你是否曾经在项目中频繁地切换不同文件夹,打开无数个 VSCode 窗口?特别是当你同时参与多个项目或者处理多个模块时,这种情况更是家常便饭。很快,你的任务栏上挤满了 VSCode 的小图标,切换起来手忙脚乱,工作效率直线下降。这时候,你可能会问:“有…...

Vue3 虚拟列表组件库 virtual-list-vue3 的使用

Vue3 虚拟列表组件库 virtual-list-vue3 的基本使用 分享个人写的一个基于 Vue3 的虚拟列表组件库&#xff0c;欢迎各位来进行使用与给予一些更好的建议&#x1f60a; 概述&#xff1a;该组件组件库用于提供虚拟化列表能力的组件&#xff0c;用于解决展示大量数据渲染时首屏渲…...

WebRTC实现双端音视频聊天(Vue3 + SpringBoot)

目录 概述 相关概念 双端连接整体实现步骤概述 文章代码实现注意点 STUN和TURN服务器的搭建 开发过程描述 后端开发流程 前端开发流程 效果演示 Gitee源码地址 概述 文章描述使用WebRTC技术实现一对一音视频通话。 由于设备摄像头限制&#xff08;一台电脑作测试无法…...

第6章详细设计-6.9 PCB审查

6.9 PCB审查 6.9.1 布局阶段注意事项1.结构设计要求在PCB布局之前弄清楚产品的结构2.布局要求 6.9.2 布线注意事项6.9.3 接地处理&#xff08;1&#xff09;射频链路接地。&#xff08;2&#xff09;腔壳接地孔。&#xff08;3&#xff09;螺钉放置&#xff08;需要了解结构知识…...

docker与大模型(口语化原理和实操讲解)

文章目录 一、镜像images1&#xff09;下载安装2&#xff09;docker images相关命令(保存、删除、上传、别名、搜索镜像) 二、容器container1&#xff09;展现所有在跑的容器服务ps2&#xff09;start /restart / kill / stop /rm3&#xff09;exec /cp4&#xff09;run/create…...

Linux之vim模式下全选命令

在Linux系统中&#xff0c;使用Vim编辑器进行全选操作可以通过以下几种方式实现&#xff1a; 1.使用键盘快捷键 按下 ”ggVG”&#xff08;先按下”g”&#xff0c;再按下”g”&#xff0c;再按下”V”&#xff0c;最后按下”G”&#xff09;可以全选当前文件内容。其中 ”g…...

云原生周刊:Kubernetes v1.32 要来了

开源项目推荐 Woodpecker Woodpecker 是一款轻量级且功能强大的 CI/CD 引擎&#xff0c;以其高度可扩展性和易用性著称。它支持多种版本控制系统与编程语言&#xff0c;能够灵活适配不同开发流程&#xff0c;帮助团队实现高效的持续集成与交付。无论是个人项目还是大型团队&a…...

# JVM学习

JVM JVM是什么&#xff1f; Java虚拟机&#xff08;JVM&#xff09; 是一个抽象的计算机&#xff0c;它是一个运行时环境&#xff0c;用于执行Java字节码或编译后的Java程序。JVM屏蔽了底层操作系统的差异&#xff0c;使得Java程序可以在任何支持JVM的操作系统上运行。 JVM能…...

【代码随想录day33】【C++复健】62.不同路径;63. 不同路径 II;343. 整数拆分;96.不同的二叉搜索树

感觉dp的题真的很适合背&#xff0c;当然不是死记硬背&#xff0c;而是当做一种模板题&#xff0c;出来一道新的题就往模板题上面去靠&#xff0c;如果套对模板的话剩下的事情其实就简单了。所以只要看一遍解法知道大致思路其实就够了&#xff0c;毕竟大部分dp的代码也不算难写…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...