MySQL45讲 第二十四讲 MySQL是怎么保证主备一致的?——阅读总结
文章目录
- MySQL45讲 第二十四讲 MySQL是怎么保证主备一致的?——阅读总结
- 一、MySQL 主备基本原理
- (一)主备切换流程
- (二)主备数据同步流程
- 二、binlog 格式及相关问题
- (一)binlog 的三种格式
- (二)格式对比与选择
- 三、循环复制问题及解决
- (一)循环复制现象
- (二)解决逻辑
- 四、总结与思考
MySQL45讲 第二十四讲 MySQL是怎么保证主备一致的?——阅读总结
在 MySQL 数据库的世界里,主备一致性是确保数据可靠性和高可用性的关键。就深入探讨 MySQL 是如何保证主备一致的,这涉及到 binlog 的多种格式、主备复制的详细流程以及双 M 结构下的循环复制问题等诸多重要知识点。
一、MySQL 主备基本原理
(一)主备切换流程
-
状态 1
:如图 1 所示,客户端的读写直接访问节点 A,节点 B 作为 A 的备库,通过同步 A 的更新来保持数据一致。此时,建议将备库 B 设置为只读(readonly)模式,原因如下:
- 防止运营类查询语句在备库上的误操作。
- 避免切换逻辑出现 bug,如双写导致主备不一致。
- 可依据 readonly 状态判断节点角色。
- 设置为 readonly,那主库怎么和备库进行同步?同步更新的线程拥有超级(super)权限,仍可进行数据同步。
-
状态 2:当需要切换时,客户端读写访问切换到节点 B,节点 A 成为 B 的备库。
(二)主备数据同步流程
在这里插入图片描述
- 备库设置:在备库 B 上通过
change master
命令设置主库 A 的相关信息,包括 IP、端口、用户名、密码以及 binlog 的起始位置(包含文件名和日志偏移量),然后执行start slave
命令启动图中io_thread
和sql_thread
两个线程。其中io_thread
负责与主库建立连接。 - 主库操作:主库 A 校验完用户名和密码后,按照备库 B 的请求位置读取 binlog,并将其发送给 B。
- 备库接收与执行:备库 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');
-
statement 格式:记录 SQL 语句原文,例如执行
delete from t /*comment*/ where a>=4 and t_modified<='2018-11-10' limit 1
语句时,binlog 中会如实记录该 SQL 语句,包括自动添加的use 'test'
命令(确保在备库能正确更新到指定库的表),同时还会记录注释等信息。然而,这种格式可能导致主备数据不一致,如上述 delete 语句,若主库和备库使用不同索引执行,可能删除不同行。 -
row 格式:不记录 SQL 语句原文,而是通过
Table_map
和Delete_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格式的优点,同时又避免了数据不一致的风险。
-
mixed 格式:MySQL 会判断 SQL 语句是否可能引起主备不一致,若有可能则使用 row 格式,否则使用 statement 格式,是一种折中的方案。但在某些情况下,如执行
insert into t values(10,10, now())
时,虽可能存在主备不一致风险,但仍会记录为 statement 格式,不过会通过 SET TIMESTAMP 命令约定 now () 函数的返回时间,确保主备数据一致性。
(二)格式对比与选择
- 数据恢复优势:row 格式在数据恢复方面具有明显优势,可通过反转操作恢复误执行的 delete、insert 或 update 语句,而 statement 格式相对较难实现精确恢复。
- 空间占用与性能:row 格式占用空间较大,写 binlog 时耗费 IO 资源,影响执行速度;statement 格式占用空间小,但可能存在数据不一致风险。因此,越来越多的场景推荐使用 row 格式的 binlog,不过也可根据实际情况选择 mixed 格式,而一般不建议使用单纯的 statement 格式。
三、循环复制问题及解决
(一)循环复制现象
在双 M 结构中,业务逻辑在节点 A 更新语句后生成 binlog 发给节点 B,B 执行后也生成 binlog,若节点 A 同时是节点 B 的备库,可能会导致循环执行更新语句,即循环复制。
(二)解决逻辑
- server id 设置:规定两个库的 server id 必须不同,否则不能设定为主备关系。
- binlog 生成规则:备库在重放 binlog 过程中生成与原 binlog 的 server id 相同的新 binlog。
- 日志接收判断:每个库收到主库发来的日志后,先判断 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是怎么保证主备一致的?——阅读总结一、MySQL 主备基本原理(一)主备切换流程(二)主备数据同步流程 二、binlog 格式及相关问题(一)binlog 的三种格式&#…...

Visual Studio 圈复杂度评估
VisualStudio自带的有工具 之后就可以看到分析结果...

Springboot之登录模块探索(含Token,验证码,网络安全等知识)
简介 登录模块很简单,前端发送账号密码的表单,后端接收验证后即可~ 淦!可是我想多了,于是有了以下几个问题(里面还包含网络安全问题): 1.登录时的验证码 2.自动登录的实现 3.怎么维护前后端…...

golang调用模组程序实现交互输入自动化,获取imei及iccid
应用场景:在openwrt下调用移远的测试程序,并实现输入自动话,获取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 一、云技术基础什么是云架构?什么是云服务?什么…...
7天掌握SQL - 第一天:数据库基础与SQL入门
目标 在本章节中,我们将学习数据库的基本概念和SQL语言的基础操作,为后续的深入学习打下坚实的基础。 一级目录 数据库基本概念SQL语言基础SQL操作实践推荐资源总结 1. 数据库基本概念 1.1 表(Table) 表是数据库中存储数据的…...

A037-基于Spring Boot的二手物品交易的设计与实现
🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…...
【异常记录】Junitmock之InvalidUseOfMatchersException异常
mock之InvalidUseOfMatchersException异常 新手小白对mock一知半解,就开始自测了,被这个InvalidUseOfMatchersException困扰了一晚上。排查了好久,大多数文章都把英文翻译了一遍,但自检无问题。最后发现是,注入的时候…...

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

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

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

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

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

docker与大模型(口语化原理和实操讲解)
文章目录 一、镜像images1)下载安装2)docker images相关命令(保存、删除、上传、别名、搜索镜像) 二、容器container1)展现所有在跑的容器服务ps2)start /restart / kill / stop /rm3)exec /cp4)run/create…...

Linux之vim模式下全选命令
在Linux系统中,使用Vim编辑器进行全选操作可以通过以下几种方式实现: 1.使用键盘快捷键 按下 ”ggVG”(先按下”g”,再按下”g”,再按下”V”,最后按下”G”)可以全选当前文件内容。其中 ”g…...
云原生周刊:Kubernetes v1.32 要来了
开源项目推荐 Woodpecker Woodpecker 是一款轻量级且功能强大的 CI/CD 引擎,以其高度可扩展性和易用性著称。它支持多种版本控制系统与编程语言,能够灵活适配不同开发流程,帮助团队实现高效的持续集成与交付。无论是个人项目还是大型团队&a…...
# JVM学习
JVM JVM是什么? Java虚拟机(JVM) 是一个抽象的计算机,它是一个运行时环境,用于执行Java字节码或编译后的Java程序。JVM屏蔽了底层操作系统的差异,使得Java程序可以在任何支持JVM的操作系统上运行。 JVM能…...
【代码随想录day33】【C++复健】62.不同路径;63. 不同路径 II;343. 整数拆分;96.不同的二叉搜索树
感觉dp的题真的很适合背,当然不是死记硬背,而是当做一种模板题,出来一道新的题就往模板题上面去靠,如果套对模板的话剩下的事情其实就简单了。所以只要看一遍解法知道大致思路其实就够了,毕竟大部分dp的代码也不算难写…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...

uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...
6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙
Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...