MySQL深入——17(主备延迟)

备库为什么延迟好几个小时

之前说的延迟为分钟级的,备库稳定之后都能追上来,但若备库的执行日志速度持续低于主库的生成日志速度,延迟就有可能变为小时级的。这就设计到了备库的并行复制能力。

InnoDB支持行锁,除了并发事务都更新同一行的情况下,对于业务的友好度还是很好的。

日志在备库上执行,备库上sql_thread更新数据的逻辑,若是用单线程的话就会导致备库应用日志不够快,造成主备延迟。

在5.6版本以前的MySQL,只支持单线程复制,由此在主库并发度高,TPS高的时候,就会出现严重的主备延迟问题。

原来的的主库通过io_thread给到relay log,然后relay log再给到sql_thread再传给DATA。

现在的为:relay log——>coordinator分给多个work线程,形成多线程复制。

sql_thread变为coordinator,现只负责读取中转日志和分发事务,更新工作有work线程完成。

work线程的个数由参数salve_parallel_workers决定,在32核下,设置为8-16个最好,防止耗完CPU资源。

那么事务能否通过轮询的方式分给工作线程呢?

答案是不可以的,因为在CPU的调度策略下,假如事务按照先后分给work_1和work_2。CPU可能会让work_2先执行,跳过work_1,要是碰巧执行同一行,就会造成主备不统一。

那要是我将一个事务中的不同更新语句分出呢?

这样也是不行的,你这样想,我现在刚将work_1执行完,还没执行work_2就直接查询了,这样查到了就是更新到一半的数据,破坏了事务逻辑的隔离性。通过这两个问题我们可以得出两个结论

1 .更新同一条语句的两个事务,必须按照顺序分到一个work当中

2 .同一个事务不能被拆开,必须被放到一个work当中。  

我们接下来看看历代版本的复制策略

MySQL5.5版本不支持并行复制,该如何实现?

第一个策略:按照表分发策略

两个事务若是更新不同的表,就可以并行,因为数据按表分发故可保证两个work不会更新同一张表。还存在一种跨表的情况,就将两种表放在一起考虑。

每一个work线程对应一个hash表,其中保存work线程执行队列事务所设计的表。key代表库名.表名。 value为数字,代表有多少个事务在修改这个表。

当事务被分配到work线程的时候,涉及的表被加入到对应的hash表当中,执行完成后再从hash表当中删除

流程分析:

1.事务T进入线程分配,若与work_1冲突就去work_2进行判断,如果也冲突coordinator就进入等待。

2.哪个线程先完,就分配给冲突的哪一方。

3.无冲突产生就分配给空闲线程。

第二个策略:按照行分发策略

如果两个事务没有更新的行,可以在备库上并行执行,binlog为row形式

key为库+表+唯一键的值,这样还是不够的因为知道了主键id还存在一个唯一索引的情况,比如说我们创建了一个表,主键id,还有一个唯一索引a,将(1,1)(2,2)……(5,5)插入到该表当中。在session A当中将id=1的a改为6,在到了session B将id =2的a改为1。

若是先执行B的话,就会报唯一键冲突的错误,所以我们还要考虑唯一键。

针对这个表来讲,我们就得将表的key设置为库+表+索引a的名字+a的值,可以通过这种手段来阻止唯一键冲突的情况。级联更新在binlog当中无记录,冲突检测不准确。

按照这种策略来讲是不能有外键的。

MySQL 5.6 并行复制策略

按库并行 key为数据库名

并行效果取决于压力模型

主库上若有多个DB(database),并且每个DB的压力均衡,效果很好。

优势:构建hash值很快,因为只有库名,binlog格式不设限,因为statement也容易得到库名。

MariaDB的并行复制策略

和redo log组提交相同

特性:1.能够在同一个组中提交的事务,一定不会修改同一行

           2.主库上可以并行执行的事务,备库上也一样

实现上:1.在一组里面一起提交的事务,有一个相同的commit_id下一组就是commit_id+1

               2.commit_id直接写入binlog当中

               3.传入备库的时候,相同1commit_id给多个worker执行

               4.这一组完了之后再取下一组。

值得注意的是大事务拖后腿!

因为一组一组来的话,系统的吞吐量是不够的。

MySQL5.7策略

在MariaDB并行复制实现后,MySQL5.7也提供了相应的策略

1.配置为DATABASE时,MySQL5.6执行

2.配置为LOGICAL_CLOCK,就是类似于MariaDB的策略,并且对其进行了优化。

那么同时处于“执行状态”的所有事务,是否可以并行?

不可以,可能会出现锁冲突,处于锁等待的事务在备库上被分配到不同的worker当中,就会出现主库不一致的情况。

MariaDB核心为commit状态可并行,无需考虑锁冲突,但是其实到了redo log prepare状态就可以了。

思想:1.处于prepare状态事务可并行

           2.处于prepare状态和出于commit状态直接的事务可并行

可通过设置 binlog_group_commit_sync_delay和binlog_group_commit_sync_no_delay_count参数来积累prepare状态的事务量,来提高并行度。

MySQL 5.7.22

基于WRITESET的并行复制

新增一个参数 binlog_transaction_dependeney_tracking用于控制

1.COMMIT_ORDER为5.7的策略

2.WRITESET表示对事务涉及更新的每一行,计算出hash值,组成集合writeset,若两个事务的集合无交集,在备库上也得一样

hash值通过库+表+索引+值 计算的

若对于唯一索引和外键约束的场景,这个策略就无法执行就会退化为单线程。

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

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

相关文章

端到端实现高精地图重建(TopoNet解读和横评)

论文出处 [2304.05277] Graph-based Topology Reasoning for Driving Scenes (arxiv.org)https://arxiv.org/abs/2304.05277 TopoNet TopoNet的目标是从车辆上安装的多视角摄像头获取图像,感知实体并推理出驾驶场景的拓扑关系,实现端到端预测&#xf…

【自动化测试】----Java的单元测试工具Junit5

目录 支持Java的最低版本为8在pom.xml添加依赖Junit提供的注解功能 断言 Assertion类提供的一些方法测试用例执行顺序 (为了预防测试用例执行顺序错误)参数化 (假设登陆操作,用户名和密码很多,尽可能通过一个测试用例…

2024/2/4

第三章 类与构造函数 一.选择题 1、下列不能作为类的成员的是(B) A. 自身类对象的指针 B. 自身类对象 C. 自身类对象的引用 D. 另一个类的对象 2、假定AA为一个类,a()为该类公有的函数成员,x为该类的一个对象&am…

Java多线程--JDK5.0新增线程创建方式

文章目录 一、新增方式1:实现Callable接口(1)介绍(2)案例(3)总结对比 二、新增方式2:使用线程池(1)问题与解决思路1、现有问题2、解决思路3、好处 &#xff0…

Swift Vapor 教程(查询数据、插入数据)

上一篇简单写了 怎么创建 Swift Vapor 项目以及在开发过程中使用到的软件。 这一篇写一个怎么在创建的项目中创建一个简单的查询数据和插入数据。 注:数据库配置比较重要 先将本地的Docker启动起来,用Docker管理数据库 将项目自己创建的Todo相关的都删掉…

以小猪o2o生活通v17.1为例简要分析SWOOLE加密破解,swoole_loader加密破解swoole加密逆向后的代码修复流程(个人见解高手掠过)

现在用Php加密五花八门除了组件就是混淆,在组件里面响当当的还属swoole,SWOOLEC是不错的国产加密,值得推荐官方宣称是永远无法破解的加密算法,针对swoole compiler的代码修复我谈谈我的看法,以小猪o2o生活通&#xff0…

PyTorch 2.2 中文官方教程(十九)

使用 RPC 进行分布式管道并行 原文:pytorch.org/tutorials/intermediate/dist_pipeline_parallel_tutorial.html 译者:飞龙 协议:CC BY-NC-SA 4.0 作者:Shen Li 注意 在github中查看并编辑本教程。 先决条件: PyTorc…

蓝桥杯备战(AcWing算法基础课)-高精度-乘-低精度

目录 前言 1 题目描述 2 分析 2.1 关键代码 2.2 关键代码分析 3 代码 前言 详细的代码里面有自己的理解注释 1 题目描述 给定两个非负整数(不含前导 00) A 和 B,请你计算 AB 的值。 输入格式 共两行,第一行包含整数 A&a…

04-Java建造者模式 ( Builder Pattern )

建造者模式 摘要实现范例 建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象 一个Builder 类会一步一步构造最终的对象,该 Builder 类是独立于其他对象的 建造者模式属于创建型模式,它提供了一种创建对…

深度学习手写字符识别:训练模型

说明 本篇博客主要是跟着B站中国计量大学杨老师的视频实战深度学习手写字符识别。 第一个深度学习实例手写字符识别 深度学习环境配置 可以参考下篇博客,网上也有很多教程,很容易搭建好深度学习的环境。 Windows11搭建GPU版本PyTorch环境详细过程 数…

vcruntime140.dll最新的修复方法,一键修复vcruntime140.dll的手段

在这篇文章中,我们将深入探讨并详细介绍各种修复vcruntime140.dll文件缺失或损坏问题的方法。鉴于此类问题广泛存在并影响了众多用户,本文目的是向大家展示不同的修复策略,希望能够帮助每个人解决这些棘手的技术难题。下面一起来看看vcruntim…

【RT-DETR有效改进】UNetv2提出的一种SDI多层次特征融合模块(细节高效涨点)

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 本问给大家带来的改进机制是UNetv2提出的一种多层次特征融合模块(SDI)其是一种用于替换Concat操作的模块,SDI模块的主要思想是通过整合编码器生成的层级特征图来增强图像中的语义信息和细节信息。包括皮肤…

黑豹程序员-ElementPlus选择图标器

ElementPlus组件提供了很多图标svg 如何在你的系统中&#xff0c;用户可以使用呢&#xff1f; 这就是图标器&#xff0c;去调用ElementPlus的icon组件库&#xff0c;展示到页面&#xff0c;用户选择&#xff0c;返回选择的组件名称。 效果 代码 <template><el-inpu…

HarmonyOS ArkTS Button基本使用(十八)

HarmonyOS ArkTS是一种应用于鸿蒙系统的应用开发语言&#xff0c;它在TypeScript的基础上&#xff0c;扩展了声明式UI、状态管理等能力。在HarmonyOS中&#xff0c;Button是一种常用的组件&#xff0c;用于实现页面间的跳转和交互。下面详细介绍HarmonyOS ArkTS中Button的基本使…

深度学习环境指南【1】:Nvidia 驱动

系列文章目录 文章目录 系列文章目录前言选择合适的驱动可能遇到的问题安全模式下删除显卡现有的驱动删除在电脑上安装的 DDU 总结 前言 本文作为深度学习环境指南系列的第一篇文章&#xff0c;主要讲解当你第一次拿到显卡完成装机后需要做的步骤&#xff0c;或者是显卡驱动不…

如何使用GPT提问三元操作符?

英语10分钟&#xff1a; 现在chatgpt非常智能&#xff0c;使用的也越来越广泛&#xff0c;今天学习了使用chatgpt4提问时&#xff0c;应该遵循的提示原则&#xff0c;第一个原则&#xff0c;是要写清晰明确的、具体的说明&#xff0c;第二个原则是要给予模型思考的时间。可以安…

机器学习 - 梯度下降

场景 上一章学习了代价函数&#xff0c;在机器学习中&#xff0c;代价模型是用于衡量模型预测值与真实值之间的差异的函数。它是优化算法的核心&#xff0c;目标是通过调整模型的参数来最小化代价模型的值&#xff0c;从而使模型的预测结果更接近真实值。常见的代价模型是均方…

红黑树,以及其在C++的set、map等数据结构中应用

红黑树介绍&#xff1a; 红黑树&#xff08;Red-Black Tree&#xff09;是一种自平衡的二叉搜索树&#xff0c;它在插入和删除操作后通过一系列的旋转和着色操作来维持平衡。红黑树的命名来自于节点上的额外颜色属性&#xff0c;每个节点要么是红色&#xff0c;要么是黑色。 红…

【Boost】:searcher的建立(四)

searcher的建立 一.初始化二.搜索功能三.完整源代码 sercher主要分为两部分&#xff1a;初始化和查找。 一.初始化 初始化分为两步&#xff1a;1.创建Index对象&#xff1b;2.建立索引 二.搜索功能 搜索分为四个步骤 分词&#xff1b;触发&#xff1a;根据分词找到对应的文档…

架构设计特训

一、考点分布 软件架构风格&#xff08;※※※※&#xff09;层次型软件架构风格&#xff08;※※※※&#xff09;面向服务的软件架构风格&#xff08;※※※※&#xff09;云原生架构风格&#xff08;※※※※&#xff09;质量属性与架构评估&#xff08;※※※※※&#xff…