MySQL 主备一致

news2024/11/16 2:25:45

MySQL 主备一致

  • 主备切换
  • binlog 格式
    • statement
    • row
    • mixed
    • 生产格式
  • 循环复制问题

主备切换

MySQL 主备切换流程 :

  • 状态 1 : 客户端的读写都直接访问节点 A,而节点 B 是 A 的备库,只将 A 的更新都同步过来 , 并本地执行。来保持节点 B 和 A 的数据是相同
  • 当切换成状态 2 : 客户端读写访问的都是节点 B,而节点 A 是 B的备库

在这里插入图片描述

建议将备库设为只读 (readonly) 模式

  • 一般查询语句会被放备库上查,设置为只读 , 能防止误操作
  • 防止切换逻辑有 bug,如 : 切换过程中出现双写,造成主备不一致
  • readonly 状态,能判断节点的角色
  • readonly 对超级 (super) 权限用户是无效,而同步更新的线程 (有超级权限)

主备流程图 :

  1. 备库 B 通过 change master 设置主库 A 的 IP、端口、用户名、密码,从哪个位置 (文件名 , 日志偏移量) 开始请求 binlog
  2. 备库 B 执行 start slave ,备库会启动两个线程 : io_thread (与主库建立连接 ) , sql_thread
  3. 主库 A 校验完用户名、密码后,开始按备库 B 传过来的位置,从本地读取 binlog,发给 B
  4. 备库 B 拿到 binlog 后,写到本地文件 (中转日志 (relay log) )
  5. sql_thread 读取中转日志,解析出日志里的命令,并执行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-27GKlVWK-1678357937872)(../png/%E4%B8%BB%E5%A4%87%E4%B8%80%E8%87%B4/image-20230224204616476.png)]

binlog 格式

binlog 有两种格式 :

  • statement
  • row
  • mixed : 前两种格式的混合

测试表/数据 :

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');

查看 binlog 记录 delete 语句

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

statement

statement : binlog 记录的 SQL 原语句

show binlog events in 'master.000001';

在这里插入图片描述

警告信息 :

  • statement 格式,delete 中带 limit,会认为该命令是 unsafe
show warnings;

在这里插入图片描述

statement : delete 带 limit,可能出现主备数据不一致 :

  • delete 用索引 a,就会删除 a=4 该行
  • 用索引 t_modified,那就删除 t_modified='2018-11-09’ ( a=5 该行 )
  • 当主库用索引 a;而备库用索引 t_modified 。就会出现主备不一致

row

row 格式 binlog :

  • row 的 binlog 没有 SQL 原语句,只能换成 :Table_map (操作表) , Delete_rows (删除的行为)

在这里插入图片描述

解析 binlog 内容 : 从 8900 位置开始

  • server id 1 : 该事务在 server_id=1 该库
  • Table_map : 显示打开的表,map 226 : 用于区分不同表
  • binlog_row_image 默认配置是 FULL,Delete_rows 会有删掉的行的所有字段的值 ; binlog_row_image = MINIMAL : 记录必要的信息,只记录 id=4 信息
  • 最后 Xid : 事务被正确提交
mysqlbinlog -vv data/master.000001 --start-position=8900;

在这里插入图片描述

binlog_format=row : binlog 记录真实删除行的主键 id,binlog 传到备库去,就肯定会删除 id=4 行,不会造成主备不一致问题

mixed

mixed : 即利用 statment 优点,又避免了数据不一致问题

  • MySQL 会判断该 SQL 是否可能引发主备不一致,可能就用 row 格式,否则就用 statement 格式

  • row 的缺点 : 很占存储。如 : delete 删掉 10 万行数据 , 0 万条记录都写到 binlog

  • statement : SQL 记录到 binlog ,仅占用几十个字节

mixed 格式的特别点 :

 insert into t values(10, 10, now());

该 SQL 用 statement 格式 : 炸一看会引发主备不一致

在这里插入图片描述

用 mysqlbinlog 查看 :

  • 其中 : SETTIMESTAMP=1546103491 : 约定 now() 的返回时间
  • 依然能保障主备数据的一致性

在这里插入图片描述

生产格式

生产环境依然用 row 格式 , 其原因 : 利于恢复数据

各CUD 的恢复角度 :

  • delete : 会把删掉的整行信息保存起来。所以当执行完一条 delete 后,发现删错数据了,就在 binlog 中记录的 delete 转成 insert,把错删的数据插入就可以恢复
  • insert : 会记录所有的字段信息,能精准确定刚插入的那行数据。只要将 insert 转成 delete ,删除掉被误插入数据就行
  • update : 会记录修改前整行的数据和修改后的整行数据。只要将 event 前后的信息对调下,再去进行更新恢复

循环复制问题

生产环境使用比较多的是双 M 结构 : 节点 A 和 B 之间总是互为主备关系

在这里插入图片描述

双 M 结构有个循环复制问题 :

  • 建议参数 : log_slave_updates = on : 备库执行 relay log 后生成 binlog
  • 节点 A 更新一条语句,再生成 binlog 发给节点 B,节点 B 执行完更新语句 , 也会生成 binlog
  • 而节点 A 同时又是节点 B 的备库 : 会把节点 B 新生成的 binlog 拿过来执行一次

解决循环复制问题 :

  • 两个节点的 server id 必须不同 (或者不能成为主备关系)
  • binlog 中记录该命令第一次执行时 , 所在实例的 server id
  • 备库接到 binlog 并重放时,生成原 binlog 的 server id 相同的新 binlog
  • 备库 binlog 后,会先判断 server id,当与自己相同,表示该 binlog 是自己生成,就直接丢弃该 binlog

具体流程 :

  1. 节点 A 更新数据,binlog 记录 A 的 server id
  2. 传到节点 B 执行后,节点 B 生成的 binlog 的 server id 就是 A 的 server id
  3. 再传给节点 A,A 判断该 server id 是否与自己的相同,当相同就不执行该日志
  4. 死循环在这里就断掉

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

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

相关文章

Python蓝桥杯训练:基本数据结构 [二叉树] 中

Python蓝桥杯训练&#xff1a;基本数据结构 [二叉树] 中 文章目录Python蓝桥杯训练&#xff1a;基本数据结构 [二叉树] 中一、[翻转二叉树](https://leetcode.cn/problems/invert-binary-tree/)二、[对称二叉树](https://leetcode.cn/problems/symmetric-tree/)三、[二叉树的最…

Vue3这样子写页面更快更高效

在开发管理后台过程中,一定会遇到不少了增删改查页面,而这些页面的逻辑大多都是相同的,如获取列表数据,分页,筛选功能这些基本功能。而不同的是呈现出来的数据项。还有一些操作按钮。 对于刚开始只有 1,2 个页面的时候大多数开发者可能会直接将之前的页面代码再拷贝多…

工作记录:调研monorepo和微前端

2023年1月。因工作项目需要&#xff0c;调研 monorepo 、微前端等技术。 任务 一直在做的 BI 项目&#xff0c;随着需求迭代&#xff0c;模块越来越多&#xff0c;项目越来越复杂、臃肿。 最近&#xff0c;前一阶段的开发工作基本结束。新模块还在设计阶段。借此契机&#xf…

进阶C语言——数据的存储【详解】

文章目录1. 数据类型介绍1.1 类型的基本归类2. 整形在内存中的存储2.1 原码、反码、补码2.2 大小端介绍2.3 练习3. 浮点型在内存中的存储3.1 一个例子3.2 浮点数存储的规则1. 数据类型介绍 前面我们已经学习了基本的内置类型&#xff1a; char //字符数据类型 short //短整型 …

学习ForkJoin

学习ForkJoin一、普通解决多线程方式1、案例一2、效果图二、ForkJoin一、普通解决多线程方式 1、案例一 大数据量的List问题处理&#xff0c;多线程分批处理&#xff0c;需要解决的问题&#xff1a; 下标越界。线程安全。数据丢失。 private static ThreadPoolExecutor thre…

链表OJ之 快慢指针法总结

欢迎来到 Claffic 的博客 &#x1f49e;&#x1f49e;&#x1f49e; 前言&#xff1a; 快慢指针指的是每次指针移动的步长&#xff0c;是解决链表相关的题目的一大利器&#xff0c;下面我将以例题的形式讲解快慢指针法。 目录 一. 链表的中间结点 思路&#xff1a; 代码实…

GMP调度模型总结

优秀文章 什么是GMP调度模型 Golang的一大特色就是Goroutine。Goroutine是Golang支持高并发的重要保障。Golang可以创建成千上万个Goroutine来处理任务&#xff0c;将这些Goroutine分配、负载、调度到处理器上采用的是G-M-P模型。 什么是Goroutine Goroutine Golang Coro…

云舟案例︱视频孪生技术赋能城市安全综合管理场景,提升城市数智化水平

随着城市化发展进程的加快&#xff0c;人口不断膨胀&#xff0c;社会安全隐患等问题日益突出&#xff0c;成为困扰城市建设与管理的重要难题。针对各类社会治安突出问题&#xff0c;城市管理部门积极推进城市信息化建设&#xff0c;视频监控等各类信息化采集手段为城市数字化管…

嵌入式学习笔记——使用寄存器编程实现按键输入功能

文章目录前言模块介绍原理图编程思路前言 昨天&#xff0c;通过配置通用输出模式&#xff0c;实现了LED灯的点亮、熄灭以及流水等操作&#xff0c;解决了通用输出的问题&#xff0c;今天我们再借用最常见的输入模块&#xff0c;按键来实现一个按键控制LED的功能&#xff0c;重…

SpringBoot【知识加油站】---- REST开发

SpringBoot【知识加油站】---- REST开发1. REST 简介2. REST 风格3. RESTful 入门案例1. REST 简介 REST&#xff1a;Representaional State Transfer&#xff0c;表现形式状态转换 传统风格资源描述形式 http://localhost/user/getById?id1 http://localhost/user/saveUser…

91. 解码方法 ——【Leetcode每日刷题】

91. 解码方法 一条包含字母 A-Z 的消息通过以下映射进行了 编码 &#xff1a; ‘A’ -> “1” ‘B’ -> “2” … ‘Z’ -> “26” 要 解码 已编码的消息&#xff0c;所有数字必须基于上述映射的方法&#xff0c;反向映射回字母&#xff08;可能有多种方法&#xff0…

Kubernetes13:Ingress

Kubernetes13&#xff1a;Ingress 1、把端口号对外暴露&#xff0c;通过ip端口号进行访问 使用Service里面的NodePort实现&#xff08;Cluster、LoadBanlancer、NodePort&#xff09; 2、NodePort缺陷 在每个节点上启动一个端口&#xff0c;在访问时候通过任何节点&#xf…

MySQL(五)锁

锁全局锁表级锁表锁元数据锁意向锁行级锁行锁间隙锁&临键锁总结计算机用锁来协调多个进程或线程并发访问某一资源。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并…

业务流程图TFD和数据流程图DFD例题

业务流程图&#xff08;TFD&#xff09;管理业务流程图&#xff08;Transaction Flow Diagram&#xff0c;简称TFD&#xff09;用来描述系统各部门、人员之间存在的业务关系、作业顺序以及管理信息流向的图表。绘制该图使用以下四种符号&#xff1a;例题例题1&#xff1a;物资订…

【Unity逆向】玩游戏遇到的“飞天锁血”是怎么实现的?

文章目录前言什么是外挂&#xff1f;锁血瞬移都是怎么做的&#xff1f;Unity引擎的致命缺陷是什么&#xff1f;WEB入侵如何做到&#xff1f;Unity外挂攻防概述典型游戏现实应用Unity开发流程Unity工作界面打包发布方式MonoMono跨平台原理JIT方式优点&#xff1a;因此后期Unity发…

【数据分析师求职面试指南】实战技能部分

文章目录必备技能数据人员如何创造价值完整的指标体系构建数据监控集报表设计设计一份优质的数据分析报告基于互联网大数据的应用A B 测试用户画像完整的数据挖掘项目流程1. ​分析问题&#xff0c;明确目标2.模型可行性分析3.选取模型4.选择变量5.特征工程6.建立模型&效果…

大数据项目实战之数据仓库:用户行为采集平台——第4章 用户行为数据采集模块

第4章 用户行为数据采集模块 4.1 数据通道 4.2 环境准备 4.2.1 集群所有进程查看脚本 1&#xff09;在/home/atguigu/bin目录下创建脚本xcall [atguiguhadoop102 bin]$ vim xcall2&#xff09;在脚本中编写如下内容 #! /bin/bashfor i in hadoop102 hadoop103 hadoop104 d…

判断推理之类比推理与定义判断

考点一包含关系&#xff08;一&#xff09;种属关系快速判定方法&#xff1a;XX是一种XX。(可以用“是”来造句子)如&#xff1a;苹果&#xff1a;水果&#xff1b;老虎&#xff1a;哺乳动物&#xff08;二&#xff09;组成关系快速判定方法&#xff1a;A是B的一部分。(不可以用…

支持向量回归删除异常值Python

1、支持向量回归&#xff08;SVR&#xff09;原理 支持向量回归&#xff08;Support Vector Regression&#xff0c;SVR&#xff09;不仅可以用于预测&#xff0c;还可以用于异常值检测。其基本思路是训练一个回归模型&#xff0c;通过对每个数据点进行预测&#xff0c;并计算…

基于Transformer的目标检测算法学习记录

前言 本文主要通过阅读相关论文了解当前Transformer在目标检测领域的应用与发展。 谷歌在 ICLR2020 上提出的 ViT&#xff08;Vision Transformer&#xff09;是将 Transformer 应用在视觉领域的先驱。从此&#xff0c;打开了Transformer进入CV领域的桥梁&#xff0c;NLP与CV几…