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 机制解决。

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

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

相关文章

RSA算法原理

1、RSA加密算法介绍 2、RSA算法的基本原理 2.1、RSA密钥生成 2.2、RSA加密和解密 1、RSA加密算法介绍 简单介绍一下&#xff0c;RSA算法是现代密码学的基石之一&#xff0c;广泛应用与安全通信、数据加密和身份验证等领域。 RSA加密是一种非对称加密算法&#xff0c;由罗…

html 图片转svg 并使用svg路径来裁剪html元素

1.png转svg 工具地址: Vectorizer – 免费图像矢量化 打开svg图片,复制其中的path中的d标签的路径 查看生成的svg路径是否正确 在线SVG路径预览工具 - UU在线工具 2.在html中使用svg路径 <svg xmlns"http://www.w3.org/2000/svg" width"318px" height…

哋它亢SEO技术分析:如何提升网站在搜索引擎中的可见性

文章目录 哋它亢SEO技术分析&#xff1a;如何提升网站在搜索引擎中的可见性网站的基本情况SEO优化分析与建议1. 元数据优化2. 关键词优化3. URL结构4. 图像优化5. 移动端优化6. 网站速度7. 结构化数据&#xff08;Schema Markup&#xff09;8. 内链与外链9. 社交分享 哋它亢SEO…

Liunx-Ubuntu22.04.1系统下配置Anaconda+pycharm+pytorch-gpu环境配置

这里写自定义目录标题 Liunx-Ubuntu22.04.1系统下配置Anacondapycharmpytorch-gpu环境配置一、Anaconda3配置1.Anaconda安装2.Anaconda更新3.Anaconda删除 二、pycharm配置1.pycharm安装 三、pytorch配置 Liunx-Ubuntu22.04.1系统下配置Anacondapycharmpytorch-gpu环境配置 一…

视觉SLAM--经典视觉SLAM框架

整个视觉SLAM流程主要包括以下步骤&#xff1a; 1、传感器信息读取&#xff1a;在视觉SLAM中主要为相机图像信息的读取和预处理。 2、前端视觉里程计&#xff1a;估算相邻图像间相机的运动&#xff0c;以及局部地图的样子。 3、后端&#xff08;非线性&#xff09;优化&#…

3、C语言基本数据类型关键字

本章学习目标&#xff1a; 1、认识存储单位&#xff1a;位bit和字节Byte 2、根据不同的应用场景选择符合需求的数据类型关键字,了解关键字的表示数据范围 1、内存单位 一、位 内存中的数据无论是文本、图像、音频还是视频&#xff0c;都是以位的形式进行存储的。 位是二进制…

Mac os 系统上如何开启远程登录的 ssh 22 端口

macOS 允许使用 SSH 连接&#xff0c;但为了安全起见&#xff0c;需要手动启动 SSH 服务&#xff0c;有两种方法可以激活远程登录。 方法一&#xff1a;界面化操作 1. 打开“系统偏好设置”&#xff0c;点击屏幕左上角的 Apple 图标&#xff0c;然后选择 系统偏好设置。 2. …

利用Python爬虫获取淘宝店铺详情

在数字化时代&#xff0c;数据已成为企业最宝贵的资产之一。对于电商平台&#xff0c;尤其是淘宝这样的大型电商平台&#xff0c;店铺详情数据的获取和分析对于商家来说至关重要。它不仅可以帮助商家了解市场趋势&#xff0c;还可以优化营销策略&#xff0c;提升销售业绩。本文…

RabbitMQ教程:发布/订阅模式(Publish/Subscribe)(三)

文章目录 RabbitMQ教程&#xff1a;发布/订阅模式&#xff08;Publish/Subscribe&#xff09;&#xff08;三&#xff09;一、引言二、简介三、准备工作3.1 说明3.2 生成项目 四、实战4.1 交换机&#xff08;Exchanges&#xff09;4.2 临时队列&#xff08;Temporary Queues&am…

对PolyMarket的突袭

一天清晨六点&#xff0c;美国联邦调查局的探员冲进了纽约市的一间公寓。这间公寓的主人是26岁的Shane Copeland&#xff0c;一个有着凌乱头发的年轻人&#xff0c;也是一个加密货币狂热者。他运营着一个名为PolyMarket的网站——一个允许用户YZ全球事件结果的平台&#xff0c;…

DataStream编程模型之数据源、数据转换、数据输出

Flink之DataStream数据源、数据转换、数据输出&#xff08;scala&#xff09; 0.前言–数据源 在进行数据转换之前&#xff0c;需要进行数据读取。 数据读取分为4大部分&#xff1a; &#xff08;1&#xff09;内置数据源&#xff1b; 又分为文件数据源&#xff1b; socket…

Django5 2024全栈开发指南(三):数据库模型与ORM操作

目录 一、模型的定义二、数据迁移三、数据表关系四、数据表操作4.1 Shell工具4.2 数据新增4.3 数据修改4.4 数据删除4.5 数据查询4.6 多表查询4.7 执行SQL语句4.8 数据库事务 Django 对各种数据库提供了很好的支持&#xff0c;包括 PostgreSQL、MySQL、SQLite 和 Oracle&#x…

ASP.NET Core Webapi 返回数据的三种方式

ASP.NET Core为Web API控制器方法返回类型提供了如下几个选择&#xff1a; Specific type IActionResult ActionResult<T> 1. 返回指定类型&#xff08;Specific type&#xff09; 最简单的API会返回原生的或者复杂的数据类型&#xff08;比如&#xff0c;string 或者…

网关在能源物联网中扮演了什么角色?

随着通信、物联网、云平台等技术的飞速发展&#xff0c;越来越多能源用户希望借助先进的管理手段&#xff0c;对能源进行分布式监测、集中管理&#xff0c;构建能源物联网。准确的分布式监测和集中管理有助于制定更科学合理的节能减排计划。企业或能源使用单位可以依据能源物联…

【快速入门】前端御三家:HTML、CSS和JS

HTML HTML&#xff0c;超文本标记语言&#xff0c;可以理解成骨架&#xff0c;是一个基础的东西。 一.基础结构 如图所示&#xff1a; 二.常见标签 1.标题标签 在页面上定义标题性的内容 <h1>一级标题</h1> <h2>二级标题</h2> <h3>三级标…

WebSocket实战,后台修改订单状态,前台实现数据变更,提供前端和后端多种语言

案例场景&#xff1a; 在实际的后台中需要变更某个订单的状态&#xff0c;在官网中不刷新页面&#xff0c;可以自动更新状态 在前端页面实现订单状态的实时更新&#xff08;不刷新页面&#xff09;&#xff0c;可以通过 WebSocket 的方式与后台保持通信&#xff0c;监听订单状态…

Django5 2024全栈开发指南(二):Django项目配置详解

目录 一、基本配置信息二、资源文件配置2.1 资源路由——STATIC_URL2.2 资源集合——STATICFILES_DIRS2.3 资源部署——STATIC_ROOT2.2.4 媒体资源——MEDIA 三、模板配置四、数据库配置4.1 mysqlclient连接MySQL4.2 pymysql连接MySQL4.3 多个数据库的连接方式4.4 使用配置文件…

近几年新笔记本重装系统方法及一些注意事项

新笔记本怎么重装系统&#xff1f; 近几年的新笔记本默认开启了raid on模式或vmd选项&#xff0c;安装过程中会遇到问题&#xff0c;新笔记本电脑重装自带的系统建议采用u盘方式安装&#xff0c;默认新笔记本有bitlocker加密机制&#xff0c;如果采用一键重装系统或硬盘方式安装…

黑马智数Day10

项目背景说明 后台管理部分使用的技术栈是Vue2&#xff0c;前台可视化部分使用的技术栈是Vue3 前台可视化项目不是独立存在&#xff0c;而是和后台管理项目共享同一个登录页面 微前端的好处 微前端是一种前端架构模式&#xff0c;它将大型单体应用程序分解为小的、松散耦合的…

Visual Studio 圈复杂度评估

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