MySQL如何保证主备一致?

news2025/7/25 7:10:56

1. MySQL主备的基本原理

如下图展示的是基本的主备切换流程:
在这里插入图片描述

在状态1中,主库是A,备库是B,所以客户端的读写都直接方法节点A。由于节点B是节点A的备库,所以备库B只是将A的更新都同步过来,本地执行,这样可以保证节点B和节点A的数据一致性。

如果发生主备切换,就会从状态1变成状态2,节点A成为备库,节点B成为主库。

在状态1中,虽然节点B没有被客户端直接方法,但是还是建议将节点B(备库)设置成只读(readonly)模式,主要有以下几个理由:

  1. 避免某些服务访问了备库,造成误操作;
  2. 防止切换逻辑有bug,比如切换过程中出现双写,造成主备不一致;
  3. 可以用readonly状态,来判断节点的角色;

注意:readonly对于超级管理员是无效的,而用于同步更新的线程,就拥有超级权限,所以是可以修改备库的。

接下来我们看下节点A到节点B的流程图:
在这里插入图片描述

实际上备库B和主库A之间维持了个长连接,主库A中有一个线程(dump_thread),专门用于服务和备库B的长连接。日志同步的完整过程如下:

  1. 在备库B上通过change master命令,设置主库A的相关信息,以及要从哪个位置开始请求binlog;
  2. 在备库B上执行start slave命令,备库会启动两个线程,即io_thread和sql_thread,其中io_thread负责与主库通信;
  3. 主库A校验完信息后,根据备库B转过来的位置,本地读取binlog,传递给B;
  4. 备库拿到binlog后,写到本地文件,称为中转日志(relay log);
  5. sql_thread读取中转日志,解析出命令并执行;

2. binlog的三种格式

binlog的格式实际上由两种格式,一种是statement,一种是row。此外还有一种mixed格式,实际上是前两种的混合。

为了方便解释几种日志格式的区别,我们创建一个表并写入些数据。

mysql> create table t(
    id int(11) not null,
    a int(11) default null,
    t_modified timestamp not null default current_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')

然后,我们对于这个表执行delete语句:

mysql>delete from t /*comment*/ where a>=4 and t_modified <='2018-11-10' limit 1;

我们可以使用下面的命令来查看binlog中的内容:

mysql> show binlog events in 'master.000001'

可以看到,当binlog_format=statement时,binlog里面记录的就是sql原文
在这里插入图片描述

为了比较statment和row的区别,我们看下这条delete语句的执行图:
在这里插入图片描述

从图上可以看到,运行过程中产生了一个warnings,原因是binlog设置的格式时statement,并且语句中有limit,所以时unsafe的。那为什么说是unsafe呢?

  • 如果delete语句使用的是索引a,那么会根据索引a找到第一个满足条件的行,也就是a=4这一行。
  • 如何delete语句使用的是索引t_modified,那么删除的就是a=5这一行。

所以使用statement可能会造成主备不一致的情况。如果在主库和备库中执行这条SQL语句,走的索引不一样,就会出现数据不一致性。

我们接下来再看binlog_format=row的情况,下面是binlog中的内容:
在这里插入图片描述

从图上可以看到,row格式的binlog没有写SQL语句的原文,而是替换成了两个event

  • Table_map event:说明要操作的表是test库的表t;
  • Delete_rows event:定义删除哪一行

上面实际上是没有完全显示信息的,可以借助mysqlbinlog工具查看详细信息:
在这里插入图片描述

所以,当binlog_format=row时,binlog记录了真实删除行的主键id,这样即使在备库中,也是删除这一行,不会出现主备不一致的情况。

3. 为什么会有mixd格式的binlog?

从上面的描述中,我们可以很清楚地看到statement和row格式的优缺点:

  • statement:格式节省空间,只需要记录sql语句。但是可能会出现主备不一致的情况;
  • row:不会出现主备不一致的情况。但是格式十分消耗空间,需要记录所有修改的行。

mixed格式的意思是,MySQL会自己判断这条SQL语句是否可能引起主备不一致,如果有可能,就用row格式,否则就用statement格式

所以线上的场景,设置为statement格式肯定是不合理的,至少要设置成mixed格式。

实际上,现在越来越多都是使用row格式,其中一个好处就是恢复数据

  • 当执行delete语句后,发现误删了,直接将binlog中的信息,转换成insert语句插入即可
  • 当执行insert语句后,发现错误插入了,直接将binlog中的信息,转换成delete语句插入即可
  • 如果执行的是update语句,binlog会记录修改前后的信息,方面恢复

4. 循环复制问题

刚才介绍的是M-S结构,现在用的比较多的是双M结构,如下图:
在这里插入图片描述

这个和M-S结构的区别在于,节点A和节点B之间互为主备关系。这种架构有个问题:当节点A更新了数据,写入binlog_A,然后传给节点B,节点B也会执行更新,写入binlog_B。然后由于节点B更新了,节点A又会去执行节点B的更新,就造成一个死循环的情况。

为了避免这种情况,MySQL在binlog中记录了这个命令第一次执行时所在实例的server id

  1. 规定两个库的server id必须不同,如果相同,不能互为主备;
  2. 一个备库接到binlog进行重放的时候,生成与原binlog的server id相同的新binlog;
  3. 每个库在收到从自己的主库发过来的日志后,先判断server id,如果和自己相同,说明时自己第一次生成的,就直接丢弃这个日志。

来源:自己整理的MySQL实战45讲笔记

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

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

相关文章

皕杰报表使用字体和部署后添加字体

Windows系统 1、打开Win10系统的字体安装文件夹&#xff0c;可以双击打开此电脑-->打开C盘-->打开Windows-->打开Fonts&#xff1b;也可先打开计算机&#xff0c;在计算机地址栏上直接拷贝“C:WindowsFonts”路径。回车打开Win10字体文件夹。 2.下载自己需要的字体。…

数组、链表、栈、队列、树

1. 数组&#xff08;Array&#xff09; 定义&#xff1a;数组是一种 线性表 数据结构&#xff0c;它用一组 连续的内存空间 存储一组具有 相同类型 的数据。 Java中 基本数据类型数组 的存储格式&#xff1a; int arr[] new int[3]; arr[0] 0; arr[1] 1; arr[2] 2;Java中…

拿去吧你,华为出品《看漫画学Python》零基础自学首选~

目前Python在人工智能、机器学习、大数据、数据分析、网络爬虫等领域广泛应用&#xff0c;是非常适合初学者入门和培养编程兴趣的一门语言。相比较其他主流编程语言而言&#xff0c;有更好的可读性&#xff0c;和满足感&#xff0c;上手相对容易。 但是很多零基础的同学不知道…

【C语言】 函数

函数 在计算机科学中&#xff0c;子程序 &#xff0c;一个大型程序中的某部分代码&#xff0c; 由一个或多个语句块组 成。它负责完成某项特定任务&#xff0c;而且相较于其他代 码&#xff0c;具备相对的独立性。 一般会有输入参数并有返回值&#xff0c;提供对过程的封装和细…

元组啊,不就是不可变的列表吗?

B站|公众号&#xff1a;啥都会一点的研究生 相关阅读 整理了几个100%会踩的Python细节坑&#xff0c;提前防止脑血栓 整理了十个100%提高效率的Python编程技巧&#xff0c;更上一层楼 Python-列表&#xff0c;从基础到进阶用法大总结&#xff0c;进来查漏补缺 Python-元组&…

【ABAP】EXIT_SAPLMBMB_001无法Debug调试问题处理

【ABAP】EXIT_SAPLMBMB_001无法Debug调试问题处理 不久前看到SAP Community里面有这样一个问题&#xff0c;可能比较老了&#xff0c;但个人觉得比较新奇&#xff0c;就去做了下面一个测试。 首先通过事务代码“CMOD”对增强“MB_CF001”&#xff08;更新物料凭证时的客户功能出…

《从零开始:机器学习的数学原理和算法实践》chap6

《从零开始&#xff1a;机器学习的数学原理和算法实践》chap6 学习笔记 文章目录6.1 凸函数6.2 梯度下降引入梯度是什么为啥梯度是上升最快的方向捏梯度下降与参数求解梯度下降过程演示6.3 代码实践 梯度下降一元函数的梯度下降多元函数的梯度下降6.1 凸函数 凸集 何为凸集 凸集…

c# 多线程

案例1 单线程与多线程对比 单线程会卡主线程,此时会将ui界面给卡住。而多线程开启以后就好了 不会卡住主线程,且运行速度快,相当于多个同时运动。 单线程按钮 private void singlethread_Click(object sender, EventArgs e){for

Kafka多生产者消费者自动配置

背景 项目中不同的业务可能会使用多个kafka&#xff0c;按默认的Kafka配置&#xff0c;最多是支持消费者和生产者使用不同的Kafka&#xff0c;如果两个生产者使用不同的Kafka则需要自定义配置&#xff0c;生成对应的bean。 解决方案 多生产者&#xff0c;多消费者&#xff0…

PowerDesigner 设置

PowerDesigner 设置前言推荐PowerDesigner 设置简单设置sql反向生成物理模型物理模型创建索引最后前言 以下内容源自自己 仅供学习交流使用 推荐 第11章 数据库的设计规范【2.索引及调优篇】【MySQL高级】 powerdesign 通过sql反向生成ER模型 PowerDesiner 15 在物理模型中…

Python测试框架之unittest和pytest 的区别

一、Unittest Unittest是Python标准库中自带的单元测试框架&#xff0c;Unittest有时候也被称为PyUnit&#xff0c;就像JUnit是Java语言的标准单元测试框架一样&#xff0c;Unittest则是Python语言的标准单元测试框架。 Unittest支持自动化测试&#xff0c;测试用例的初始化、…

FFN -> GLU -> GAU

1 GLU GLU的起源是2016年由Yann N. Dauphin在 论文:Language Modeling with Gated Convolutional Networks 在语言模型的建模方法上相比于循环神经网络更具有竞争力&#xff0c;提出了一种简单的线性门控单元来堆叠卷积层从而使得文本中的token可以并行化处理来获得上下文的语义…

HTTP响应详解

目录 一.状态码 小结&#xff08;记住&#xff09; 二.认识响应正文&#xff08;body&#xff09; 三.如何构造http请求 一.状态码 是一个数字&#xff0c;这个数字描述了当前这次请求的状态&#xff08;成功&#xff0c;失败&#xff0c;失败的原因&#xff09; http的状态…

Typora基础篇

Markdown基础 标题 #标题名字&#xff08;#号的个数代表标题的级数&#xff09; 文件-偏好设置-Markdown里面如果勾选了严格模式&#xff0c;那#与标题名称之间就需要加上一个空格一级标题用1个# 二级标题用2个# 三级标题用3个# 四级标题用4个# 五级标题用5个# ####### …

262-视口,布局视口,视觉视口,移动端适配,less语法,比哪里,DPR,RRI,less的弊端,运算,嵌套,混合,继承,混入,运算,

262-CSS中的单位 ◼ 前面编写的CSS中,我们经常会使用px来表示一个长度(大小),比如font-size设置为18px,width设置为100px。 ◼ px是一个长度(length)单位,事实上CSS中还有非常多的长度单位。 ◼ 整体可以分成两类:  绝对长度单位(Absolute length units);  相…

【uniapp】安装与使用uView组件库:

文章目录一、官网文档二、安装【1】进入控制台【2】初始化package.json【3】安装uView-ui【4】配置main.js【5】配置uni.scss【6】配置easycom组件模式【7】app.vue引入基础样式三、效果一、官网文档 https://www.uviewui.com/ 二、安装 【1】进入控制台 【2】初始化package…

基于sklearn的集成学习实战

集成学习投票法与bagging 投票法 sklearn提供了VotingRegressor和VotingClassifier两个投票方法。使用模型需要提供一个模型的列表&#xff0c;列表中每个模型采用tuple的结构表示&#xff0c;第一个元素代表名称&#xff0c;第二个元素代表模型&#xff0c;需要保证每个模型…

《计算机体系结构量化研究方法第六版》1.3 计算机体系结构的定义

1.3.1 指令集体系结构&#xff1a;计算机体系结构的近距离审视 1、这里通过指令集体系结构 ISA来指代程序员可以看到的实际指令集。ISA相当于软件和硬件之间的界限。 &#xff08;1&#xff09;ISA分类 几乎所有的ISA都被划分到了通用寄存器体系结构中&#xff0c;在这种体系…

能源消耗监测管理系统:实现企业用能定额、降低成本节能管理

现如今&#xff0c;很多企业还停留在安装各种节能产品或者是传统节能技术来达到节能目的&#xff0c;但是这些方法不能从根本上实现节能目标&#xff0c;从而导致企业效益。 在国家推动下&#xff0c;能源管理系统加入了互联网的技术以及数字化技术来协同管理&#xff0c;软硬…

二叉树链式结构的实现及简单操作(画图超详细解释)

二叉树链式结构的实现及简单操作前置说明前序遍历中序遍历后序遍历层序遍历如何判断一颗二叉树是完全二叉树通过前序遍历的数组构建二叉树销毁二叉树总结前置说明 由于我们要对二叉树进行操作&#xff0c;我们就得现有一个二叉树&#xff0c;而二叉树的构建又比较复杂&#xf…