主从延迟如何解决

news2024/11/27 9:44:02

最近项目上线,遇到了主从问题。按理说公司基建不至于出现这种问题,但就是出现了。可能因为用的不是原生的MySQL吧。主从延迟会给前端和服务端带来很多问题,需要花费时间用工程手段来解决,我认为这是很不合理的。

举几个因为主从延迟会导致问题场景:

  1. 创建了一个商品然后立即跳转到详情页
  2. 在列表页更新了用户的权限,立即刷新

凡是像这种操作后立即获取的,全会有问题。

为什么要有主从

MySQL数据库的主从(Master-Slave)架构主要是为了实现数据的高可用性(High Availability)和读写分离,具体的原因如下:

  1. 数据备份:主从架构可以实现数据的实时备份,从库可以作为主库的一个镜像存在,当主库出现问题时,可以迅速切换到从库,保证数据的安全性。
  2. 读写分离:在主从架构中,主库主要负责写操作,从库主要负责读操作,这样可以分担主库的压力,提高系统的处理能力。
  3. 故障切换:当主库出现故障时,可以迅速切换到从库,保证服务的连续性,提高系统的可用性。
  4. 负载均衡:通过主从架构,可以将读请求分散到多个从库,实现负载均衡,提高系统的性能。
  5. 数据一致性:主从复制可以确保数据在主库和从库之间保持一致,提高数据的准确性。 因此,为了保证数据的安全性和系统的高可用性,MySQL通常会采用主从架构。

主从如何同步

下面是一个update 语句在主节点 A 执行,然后同步到从节点 B 的完整流程图

image-20240216103317526.png

从库 B 跟主库 A 之间维持了一个长连接。主库 A 内部有一个线程,专门用于服务从库 B的这个长连接。一个事务日志同步的完整过程是这样的:

  1. 在从库 B 上通过 change master 命令,设置主库 A 的 IP、端口、用户名、密码,以及要从哪个位置开始请求 binlog,这个位置包含文件名和日志偏移量。

  2. 在从库 B 上执行 start slave 命令,这时候从库会启动两个线程,就是图中的 io_thread 和 sql_thread。其中 io_thread 负责与主库建立连接。

  3. 主库 A 校验完用户名、密码后,开始按照从库 B 传过来的位置,从本地读取 binlog,发给 B。

  4. 从库 B 拿到 binlog 后,写到本地文件,称为中转日志(relay log)。

  5. sql_thread 读取中转日志,解析出日志里的命令,并执行。

为什么会主从延迟

什么是主从延迟?

  1. 主库 A 执行完成一个事务,写入 binlog,我们把这个时刻记为 T1;

  2. 之后传给从库 B,我们把从库 B 接收完这个 binlog 的时刻记为 T2;

  3. 从库 B 执行完成这个事务,我们把这个时刻记为 T3。

所谓主从延迟,就是同一个事务,在从库执行完成的时间和主库执行完成的时间之间的差值,也就是 T3-T1。

你可以在从库上执行 show slave status 命令,它的返回结果里面会显示seconds_behind_master,用于表示当前从库延迟了多少秒。

在网络正常的时候,日志从主库传给从库所需的时间是很短的,即 T2-T1的值是非常小的。也就是说,网络正常情况下,主从延迟的主要来源是从库接收完 binlog和执行完这个事务之间的时间差。

主从延迟来源

  1. 有些部署条件下,从库所在机器的性能要比主库所在的机器性能差。
  2. 从库的压力大。如从库上的查询耗费了大量的 CPU 资源,影响了同步速度,造成主从延迟。
  3. 大事务。因为主库上必须等事务执行完成才会写入 binlog,再传给从库。所以,如果一个主库上的语句执行 10 分钟,那这个事务很可能就会导致从库延迟 10分钟。
  4. 大表 DDL,也是典型的大事务场景。
  5. 从库的并行复制能力。查看软件版本,在官方的 5.6 版本之前,MySQL (sql_thread)只支持单线程复制,由此在主库并发高、TPS 高时就会出现严重的主从延迟问题。

如何解决

一般的主从结构如下:

image-20240216110115222.png

一旦出现主从延迟问题,有如下解决方案

强制走主库方案 - 有点可行

  1. 将查询请求做分类,必须拿到最新结果的,强制请求到主库
  • 优点:能够区分场景,压力可控
  • 缺点:
    • 前后端都得改动。前端判断是否走主库,服务端判断指定场景走查主库
    • 后续维护也比较麻烦
    • 有时前端无法判断出场景,如进详情页,前端无法判断是刚创建完跳转的还是打开的是早已创建的
  1. 全部走主库
  • 优点:简单便捷
  • 缺点:不区分具体场景,主库压力大
  1. 先读从库,从库没有读主库
  • 优点:相对简单
  • 缺点:无法处理所有场景,如list的场景,因为必然有数据,但并不知道是否准确

sleep 方案 - 有点可行

  1. 前端延迟请求
  • 优点:简单便捷
  • 缺点:用户体验不好
  1. 写相关接口,服务端返回结果详情,前端展示详情。如创建商品接口,服务端返回商品的详细信息,前端直接展示详细信息,不请求接口
  • 优点:逻辑比较通顺、清晰
  • 缺点:
    • 前端需要实现多套逻辑。如虽然是详情,但至少可能来自创建和详情接口;在成员列表中删除member成功后就直接不显示,不再调用list接口
    • 维护成本高,如对于详情页,如果后续详情也变更,创建和详情接口如何保持一致
    • 无法处理所有场景,如创建空间后获取成员列表(至少有自己)

判断主从延迟方案 - 有的可行

  1. 写操作写redis(过期时间1~2s),读的时候判断是否有redis,有则读主库。如创建商品,则在redis里记录商品id,获取详情的时候先判断该商品id是否在redis存在,如果存在则读主库。
  • 优点:
    • 前端无需改动,服务端改动相对可控,而且设置为弱依赖,所以问题应该不大
    • 能解决大部分问题
  • 缺点:
    • 服务端需要根据场景记录、读取redis
    • 有一定概率增加主库压力,但总体可控
  1. 判断主从无延迟方案 - 不可行
  • 每次从库执行查询请求前,先判断seconds_behind_master 是否已经等于 0。如果还不等于 0 ,那就必须等到这个参数变为0 才能执行查询请求。可以使用 show slave status。
  • 对比位点确保主从无延迟
  • 对比 GTID 集合确保主从无延迟

这种方式感觉不太现实

  • 实现上成本高
  • 仍然有过期读问题。因为上面判断主从无延迟的逻辑,是“从库收到的日志都执行完成了”。但是,从 binlog在主从之间状态的分析中,不难看出还有一部分日志,处于客户端已经收到提交确认,而从库还没收到日志的状态。
  • 如果在业务更新的高峰期,主库的位点或者 GTID 集合更新很快,那么上面的两个位点等值判断就会一直不成立,很可能出现从库上迟迟无法响应查询请求的情况
  1. 配合 semi-sync(半同步复制) 方案 - 不可行

主从无延迟方案 + semi-sync 方案 能解决过期读问题。

semi-sync 做了这样的设计:

  • 事务提交的时候,主库把 binlog 发给从库;

  • 从库收到 binlog 以后,发回给主库一个 ack,表示收到了;

  • 主库收到这个 ack 以后,才能给客户端返回“事务完成”的确认。

这样,semi-sync 配合前面关于位点的判断,就能够确定在从库上执行的查询请求,可以避免过期读。

但这种方案也不太现实,而且没有完全解决问题

  • semi-sync+ 位点判断的方案,只对一主一从的场景是成立的。如果落到其它从库,还是会出现过期读
  1. 等主库位点方案 - 不可行
select master_pos_wait(file, pos[, timeout]);

这条命令的逻辑如下:

  • 它是在从库执行的;

  • 参数 file 和 pos 指的是主库上的文件名和位置;

  • timeout 可选,设置为正整数 N 表示这个函数最多等待 N 秒。

返回结果如下:

  • 如果执行期间,从库同步线程发生异常,则返回 NULL;

  • 如果等待超过 N 秒,就返回 -1;

  • 如果刚开始执行的时候,就发现已经执行过这个位置了,则返回 0。

  • 正常返回的结果是一个正整数 M,表示从命令开始执行,到应用完 file 和 pos 表示的 binlog 位置,执行了多少事务。

使用方法如下

  • trx1 事务在主库更新完成后,马上执行 show master status 得到当前主库执行到的 File 和Position;

  • 选定一个从库执行查询语句;

  • 在从库上执行 select master_pos_wait(File, Position, 1);

  • 如果返回值是 >=0 的正整数,则在这个从库执行查询语句

这种也不太现实,想想实现复杂度有多高。

  1. 等 GTID 方案 - 不可行
 select wait_for_executed_gtid_set(gtid_set, 1);

这条命令的逻辑是:

  • 等待,直到这个库执行的事务中包含传入的 gtid_set,返回 0;

  • 超时返回 1。

等 GTID 的执行流程为:

  • trx1 事务更新完成后,从返回包直接获取这个事务的 GTID,记为 gtid1;

  • 选定一个从库执行查询语句;

  • 在从库上执行 select wait_for_executed_gtid_set(gtid1, 1);

  • 如果返回值是 0,则在这个从库执行查询语句;

  • 否则,到主库执行查询语句。

总结

真的是基建要做好,基建好了大家能把精力放到更重要的事情上。如果真出现主从延迟问题,能选择的方案其实比较少。要么就分场景走主库、要么前端sleep(偏临时方案)、要目服务端自己判断一下主从延迟情况。

这次我们选择redis打点记录,看看效果怎么样吧。

最后

大家如果喜欢我的文章,可以关注我的公众号(程序员麻辣烫)

我的个人博客为:https://shidawuhen.github.io/

往期文章回顾:

  1. 设计模式
  2. 招聘
  3. 思考
  4. 存储
  5. 算法系列
  6. 读书笔记
  7. 小工具
  8. 架构
  9. 网络
  10. Go语言

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

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

相关文章

数字IC实践项目(9)— Tang Nano 20K: I2C OLED Driver

Tang Nano 20K: I2C OLED Driver 写在前面的话硬件模块RTL电路和相关资源报告SSD1306 OLED 驱动芯片SSD1306 I2C协议接口OLED 驱动模块RTL综合实现 总结 写在前面的话 之前在逛淘宝的时候偶然发现了Tang Nano 20K,十分感慨国产FPGA替代方案的进步之快;被…

51单片机项目(30)——基于51单片机的心率血氧脉搏检测的proteus仿真

1.功能设计 可以测量脉搏、心率、血氧浓度、体温,并且实时显示在LCD1602屏幕上,(第一行是体温血氧,第二行是心率脉搏)。 (需要完整源文件的,直接看最后一节) 另外,还…

PXE实现自动批量安装部署操作系统

目录 一、PXE介绍 二、PXE涉及的相关知识点 三、搭建PXE网络体系的前提 四、服务端要安装一系列的依赖环境 五、搭建 PXE 远程安装服务器 5.1、安装并启动TFTP服务 5.2、安装并启用 DHCP 服务 5.3、准备 Linux 内核、初始化镜像文件、准备 PXE 引导程序 5.4、安装FTP服…

【C++第二阶段】赋值运算符重载

你好你好&#xff01; 以下内容仅为当前认识&#xff0c;可能有不足之处&#xff0c;欢迎讨论&#xff01; 文章目录 赋值运算符重载 赋值运算符重载 实验①&#xff0c;还没有对析构运算符重载时 #include<iostream> #include<string> using namespace std;clas…

1Coze平台介绍

2023年随着OpenAI推出GPT 3.5&#xff0c;AI赛道变得更加火热。GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一种自然语言处理&#xff08;NLP&#xff09;模型&#xff0c;用于生成文本、理解语言和进行各种语言任务。GPT是由OpenAI开发的&#xff0c;它…

【C语言】简单贪吃蛇实现保姆级教学!!!

关注小庄 顿顿解馋૮(˶ᵔ ᵕ ᵔ˶)ა 新年快乐呀小伙伴 引言&#xff1a; 小伙伴们应该都有一个做游戏的梦吧&#xff1f;今天让小庄来用C语言简单实现一下我们的童年邪典贪吃蛇&#xff0c;顺便巩固我们的C语言知识&#xff0c;请安心食用~ 文章目录 贪吃蛇效果一.游戏前工作…

ubuntu22.04@laptop OpenCV Get Started: 011_edge_detection

ubuntu22.04laptop OpenCV Get Started: 011_edge_detection 1. 源由2. edge_detection应用Demo2.1 C应用Demo2.2 Python应用Demo 3. 重点逐步分析3.1 GaussianBlur去噪3.2 Sobel边缘检测3.2.1 SobelX方向边缘检测3.2.2 SobelY方向边缘检测3.2.3 SobelXY方向边缘检测 3.3 Canny…

AI大模型专题:工业大模型技术应用与发展报告1.0

今天分享的是AI大模型系列深度研究报告&#xff1a;《AI大模型专题&#xff1a;工业大模型技术应用与发展报告1.0》。 &#xff08;报告出品方&#xff1a;中国信通院&#xff09; 报告共计&#xff1a;25页 人工智能的几个相关概念 大模型&#xff1a;即基础模型&#xff…

精品jsp+ssm汽车店维保信息系统

《[含文档PPT源码等]精品jspssm汽车店维保信息系统[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 使用技术&#xff1a; 开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&…

NBlog个人博客部署过程记录 -- 后端springboot + 前端vue

项目是fork的Naccl大佬NBlog项目&#xff0c;页面做的相当漂亮&#xff0c;所以选择了这个。可以参考2.3的效果图 惭愧&#xff0c;工作两年了也每个自己的博客系统&#xff0c;趁着过年时间&#xff0c;开始搭建一下. NBlog原项目的github链接&#xff1a;Naccl/NBlog: &#…

问题:宋朝为了加强皇帝对司法权的直接控制建立了() #微信#微信问题:宋朝为了加强皇帝对司法权的直接控制建立了() #微信#微信

问题&#xff1a;宋朝为了加强皇帝对司法权的直接控制建立了&#xff08;&#xff09; A.大理寺 B.刑部 C.审刑院 D.廷尉 参考答案如图所示

webpack实际实践优化项目

参考&#xff1a; 如何通过性能优化&#xff0c;将包的体积压缩了62.7% 雅虎35条 20210526-webpack深入学习&#xff0c;搭建和优化react项目 本文只专注于性能优化的这个部分。 总体来说分为两个方面&#xff1a;第一是开发环境中主要优化打包速度&#xff0c;第二是线上环境…

VScode+PlatformIO 物联网Iot开发平台环境搭建

1.vscode &#xff08;1&#xff09;安装platformIO插件 &#xff08;2&#xff09;新建项目或导入已有的arduino项目 Name&#xff1a;需要填写你项目的名称&#xff1b; Board&#xff1a;点开是一个下拉框&#xff0c;但是可以输入你想要的开发板&#xff0c;这里选择&quo…

Spring Task定时任务

目录 1、介绍 2、cron表达式 2.1、在线生成器 2.2、通配符 3、代码示例 3.1、使用步骤 3.2、 代码开发 3.3、测试 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0c;擅长web应用开发…

【前端高频面试题--Vue组件通信篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;前端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac;前端高频面试题--Vue组件通信篇 往期精彩内容Vue与VueComponent的关系props / $emit父子组件传值父…

备战蓝桥杯---图论之最短路Bellman-Ford算法及优化

目录 上次我们讲到复杂度为&#xff08;nm)logm(m为边&#xff0c;n为点&#xff09;的迪杰斯特拉算法&#xff0c;其中有一个明显的不足就是它无法解决包含负权边的图。 于是我们引进Bellman-Ford算法。 核心&#xff1a;枚举所有的点&#xff0c;能松弛就松弛&#xff0c;直…

《剑指offer》

本专题是分享剑指offer的一些题目&#xff0c;开始刷题计划。 二维数组的中的查找【https://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e?tpId13&tqId11154&ru/exam/oj】 描述 在一个二维数组array中&#xff08;每个一维数组的长度相同&#xff0…

[计算机提升] 备份系统:设置还原点

6.7 备份系统&#xff1a;设置还原点 在Windows系统中&#xff0c;系统还原点是指系统在特定时间存储的重要系统文件的备份。通过创建系统还原点&#xff0c;可以轻松地将系统恢复到之前创建还原点的状态。这有助于解决系统文件损坏或Windows操作系统出现问题的情况。 1、右键…

推荐在线图像处理程序源码

对于喜爱图像编辑的朋友们来说&#xff0c;Photoshop无疑是处理照片的利器。然而&#xff0c;传统的Photoshop软件不仅需要下载安装&#xff0c;还对电脑配置有一定的要求&#xff0c;这无疑增加了使用的门槛。 现在&#xff0c;我们为您带来一款革命性的在线PS修图工具——基…

Redis篇----第一篇

系列文章目录 文章目录 系列文章目录前言一、什么是 Redis?二、Redis 与其他 key-value 存储有什么不同?三、Redis 的数据类型?四、使用 Redis 有哪些好处?五、Redis 相比 Memcached 有哪些优势?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住…