如何解决主从数据库同步延迟问题?

如何解决主从数据库同步延迟问题?

前言

  • 最近,系统上频繁出现主从延迟的问题,因此针对主从架构、主从同步以及主从延迟问题进行了一次学习。

主从架构浅析

  • 在了解主从延迟之前,我们有必要对主从架构有一些简单的认识。在如今的互联网架构中,单点数据库架构往往不能满足日常的访问请求。为了增大系统的吞吐量、实现高可用架构,系统数据库往往会采用集群搭建。而集群架构中,最常见的就是主从架构

常见主从架构介绍

  • 主从架构作为最常见的集群搭建模式,通过将读写分离,来避免所有的请求都请求到同一个数据库上,从而减少单个数据库的压力。其次,通过对从库进行水平的扩展,也会使得系统的伸缩性及负载能力得到提升。常见的主从架构主要有以下几种:

  • 一主一从式

  • 一主一从为最常见的主从架构模式,由一个主节点+一个从节点组合而成,当主节点宕机时,从节点可以快速接替主节点的工作。

  • 在这里插入图片描述

  • 一主多从式

  • 该架构有一个主节点+多个从节点组成,适合读较多的场景,可以将读命令分摊到多个从节点。

  • 在这里插入图片描述

  • 在一主多从的基础上,为了减轻主库向从库同步数据的压力,还出现了树状主从/级连复制的架构:

  • 在这里插入图片描述

  • 多主一从

  • 在一些需要汇总数据进行分析,或写入压力较大的情况,会采用多主一从的架构模式。该架构由多个主节点+一个从节点组成。

  • 在这里插入图片描述

  • 主主互 备式

  • 主主互备的架构模式,主要由两个或多个的主节点构成,每个主节点的更新操作都需要向其余的主节点进行同步。优点是读写的压力均可以通过负载均衡进行分摊,提升系统的吞吐量,且其中一个节点宕机,也不会影响整个系统,实现高可用。

  • 在这里插入图片描述

  • 但是这种模式也存在缺陷。在实现数据双向同步的过程中,双向复制可能会带来延迟问题,极端情况下有可能数据丢失。另外,数据库数量增加会导致数据同步问题变得极为复杂

主从同步

  • 聊完了常见的主从架构,那么这些架构,都是如何实现的主从数据库数据的同步的呢?以下就以mysql数据库为例子进行学习、了解。在mysql中,实现主从同步有两个比较重要的日志文件:binLogrelayLog

binlog

  • binlog,又称为二进制日志文件。简要来说,binLog主要记录当前数据库发生了什么。其主要日志格式有三种:statementrowmixed
  • statement:statement又被称为基于SQL语句的复制。在该格式下,binlog内会记录执行的SQL原文。但在一些极端的情况下,可能会因为主从数据库的配置、索引等,同一句SQL可能执行出来的结果是不一致的。
  • row:row又被称为基于行的复制,故名思义,row模式下记录的不是SQL的原文,而是记录的SQL语句影响的数据。例如哪一行数据被删除了、哪一行数据从a更新成了b等等。这样可以避免因为执行SQL的环境不同导致的数据不一致,但是缺陷就是会产生大量的日志文件。
  • mixed:从5.1.8版本开始,MySQL提供了Mixed格式,实际上就是statement与row的结合。在该模式下,一般的语句修改使用statement保存binlog,但是一些函数statement无法完成主从复制,那么此时就会使用row格式进行保存。
  • 具体的,我们可以使用语句show binary logs来查看当前数据库的binlog。

relayLog

  • relayLog,又被称为中继日志。简单来说,relayLog中主要保存了从主节点中查询出来的binlog数据,供从节点在同步的过程中使用。

同步原理分析

  • 在这里插入图片描述

  • 在了解了binLog及relayLog之后,我们就可以开始了解mysql是如何进行数据同步的了。如图所示,mysql的同步过程主要有以下几个步骤:

  • 主节点产生数据变更,此时会将变更内容写入binLog,同时会开启binlog dump线程将更新的数据信息同步给从库。

  • 从节点的I/O线程读取到变更的数据后,会将数据写入relayLog。

  • 从节点的SQL线程检测到relayLog中添加了数据后,会将新增的数据写入到从库中,从而实现主从数据的同步。

主从延迟

  • 了解了主从同步的原理,我们就来了解下什么是主从延迟。主从延迟简单来说,是因为在一定时间内,主节点此时已经完成了数据的写入,但是此时从库还没有将主库的数据同步更新完成。
  • 结合上述的主从同步原理,不难推断造成主从延迟主要是源于以下几个方面之一:
  • 主节点binLog数据未及时同步
  • 从节点I/O线程未及时将数据写入RelayLog
  • 从节点SQL线程未及时将RelayLog写入数据库
  • 针对这三个方面,我们逐一分析可能导致主从延迟的原因。

主从延迟的原因

主节点binLog数据未及时同步
  • 针对主库binLog数据没及时同步造成主从延迟的情况,可能性主要有如下几个:
  • 主库存在高并发,某一时刻,大量的写请求到主库上,意味着binLog需要进行频繁的写入及同步,此时就可能导致主节点binlog dump线程、从节点I/O线程没法及时同步,从而造成主从延迟。
  • 网络IO存在问题,某一时刻如果网络IO挂掉了,数据没法发送到从库,那么此时也会导致从库的数据无法更新,造成主从延迟。
  • 执行大事务,一旦执行大事务,主库必须等到事务执行完成之后才能写入binLog,进而也会影响后续的binLog的同步及写入,造成主从延迟。
I/O线程未及时写RelayLog
  • 针对从节点I/O线程未及时写入RelayLog情况,其主要的可能性是
  • 存在高并发,I/O线程未能及时将数据刷入到relayLog中。但I/O线程通常为磁盘读写,效率较快,一般不会成为主要的问题。
  • 机器性能较差,导致relayLog同步速度较慢。
SQL线程未及时写数据库
  • 针对这最后一种情况,产生主从延迟的原因可能更多一些:
  • relayLog随机重放。在主库中写binlog从库中写relayLog都是顺序进行的磁盘读写,效率较高。但是SQL数据对relayLog进行数据重放的时候是随机写盘的,执行效率相对较慢,从而出现主从延迟。
  • 锁等待,从库除了同步以外还会需要支持正常的业务查询操作,而如果当前需要修改的数据被访问了,那么此时SQL线程就会先进行等待,直到锁被释放以后,再获取锁进行修改。而这一段时间,就有可能导致主从延迟。
  • 高并发,高并发情况下产生的DML数量超过了SQL Thread所能处理的速度时,那么此时就会产生主从延迟。
  • 出现慢SQL,慢SQL会导致relayLog较久才能写入到数据库中,进而造成主从延迟。

如何解决主从延迟

  • 了解了出现主从延迟的原因,那么如何对主从延迟进行解决呢?可行的方案我这里简单总结了三个:
强一致性方案
  • 最简单粗暴的方案,其实就是针对一些实时性要求比较高的操作,通过代码指定的方式,强行让查询语句走主库进行查询。这样可以保证数据的绝对准确,带来的问题是会加大主库的并发数量,增加宕机的风险。
并行复制
  • 这种方案主要针对高并发情况下从库SQL单线程出现瓶颈的时候使用,将SQL线程转化成多个线程来进行重放,加快对DML数据的处理速度,从而减缓主从延迟。mySql自5.7版本后就已经支持并行复制了。可以在从服务上设置 slave_parallel_workers为一个大于0的数,然后把slave_parallel_type参数设置为LOGICAL_CLOCK即可。
降低并发
  • 针对过高的并发,其实会导致同步过程的三个阶段都会出现问题,为此,在接口设计时,要充分考虑接口的请求量,并适当采用如令牌桶、漏桶算法等进行限流。或采用分布式锁等对关键数据进行加锁,控制并发量,减少主从延迟对业务的影响。
增加NOSQL层
  • 通过在从库前增加NOSQL层来缓解,主库写入SQL的时候,按照一定策略将关键数据放入到缓存中,查询时优先查询缓存中的数据。可以在一定程度上减少主从延迟所带来的问题。

总结

  • 归根结底来说,在主从架构下,主从延迟其实是不可避免的(只是延迟的时间长短)。但是通对主从延迟原因的合理分析以及的合适方案选择,可以最大程度上缩短主从同步时间,最大程度减少主从延迟给系统、服务带来的影响的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QT QComBox实现模糊查询

一、概述 在Qt中,可以通过QComboBox和QLineEdit实现模糊查询的功能。模糊查询是指根据用户输入的文本,在下拉框的选项中进行模糊匹配,并动态地显示匹配的选项。 二、基础知识 1、QCompleter (1)QCompleter 是 Qt 框架中提供的一个用于自动…

代码随想录算法训练营 ---第四十六天

第一题: 简介: 本题的重点在于确定背包容量和物品数量 确定dp数组以及下标的含义 dp[i] : 字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词。 2.确定递推公式 如果确定dp[j] 是true,且…

2019年11月7日 Go生态洞察:Go Modules v2及更高版本

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

应用密码学期末复习(1)

学习资料 应用密码学总结_应用密码学知识点总结-CSDN博客 应用密码学期末复习知识点总结_5的36次方mod97__PriDe的博客-CSDN博客 【密码学】密码学期末考试速成课,不挂科!!#高数帮_哔哩哔哩_bilibili 目录 学习资料 第一章 概述 1.1信息…

淼一科技为互联网企业销毁硬盘数据 拆除机房设备

在上海这座繁华的大都市,淼一科技以其专业的服务和卓越的技术,为众多互联网企业提供硬盘数据销毁和机房设备拆除服务。作为业界领先的数据安全解决方案提供商,淼一科技致力于保障客户数据的安全与隐私,为客户创造更高的商业价值。…

uniapp前端+python后端=微信小程序支付到底怎么开发???国内的资料为什么没一篇能讲清楚,简简单单的只需要3步就可以了-V2版本

一.微信小程序支付 真的,在接到这个任务的时候,本以为很简单,不就是普通的浏览器复制粘贴,最不济找下gpt给生成一下,但是到实际开发就不同了,不是后端出问题就是前端,搜资料,上百度…

Current request is not a multipart request问题排查

概述 在应用工程里看到如下被标记为deprecated的代码,这对有代码洁癖的我而言是无法忍受的: row.getCell(10).setCellType(Cell.CELL_TYPE_STRING); String hospital row.getCell(0).getStringCellValue();对应的poi版本号?是的&#xff…

适用于iOS 的顶级苹果数据恢复软件

数据丢失可能随时发生在任何人身上,这可能是一种令人沮丧的经历。丢失 iOS 设备上的重要数据可能会造成特别严重的损失,因为其中可能包括有价值的照片、联系人、消息和其他重要文件。幸运的是,有多种数据恢复工具可以帮助用户恢复丢失的数据。…

filebeat日志收集工具

elk:filebeat日志收集工具和logstash相同 filebeat是一个轻量级的日志收集工具,所使用的系统资源比logstash部署和启动时使用的资源要小得多 filebeat可以运行在非Java环境,它可以代理logstash在非Java环境上收集日志 filebeat无法实现数据的过滤&…

定制开发办公软件在企业发展中的优势|app小程序网站搭建

定制开发办公软件在企业发展中的优势|app小程序网站搭建 如今,办公软件已经成为企业日常工作的必需品。很多企业为了提高工作效率和满足自身业务需要,选择定制开发办公软件。下面将介绍定制开发办公软件在企业发展中的优势。 首先,定制开发办…

DjiTello + YoloV5的无人机的抽烟检测

一、效果展示 注:此项目纯作者自己原创,创作不易,不经同意不给予搬运权限,转发前请联系我,源码较大需要者评论获取,谢谢配合! 1、未启动飞行模型无人机的目标检测。 DjiTello YOLOV5抽烟检测 …

EDA实验-----正弦信号发生器的设计(Quartus II )

目录 一、实验目的 二、实验仪器 三、实验原理 四、实验内容 五、实验步骤 六、注意事项 七、实验过程(操作过程) 1.定制LPM_ROM模块 2.定制LPM_ROM元件 3.计数器定制 4.创建锁相环 5.作出电路图 6.顶层设计仿真 一、实验目的 学习使用Ver…

Echarts地图registerMap使用的GeoJson数据获取

https://datav.aliyun.com/portal/school/atlas/area_selector 可以选择省,市,区。 也可以直接在地图上点击对应区域。 我的应用场景 我这里用到这个还是一个特别老的大屏项目,用的jq写的。显示中国地图边界区域 我们在上面的这个地区选择…

【开源】基于Vue+SpringBoot的独居老人物资配送系统

项目编号: S 045 ,文末获取源码。 \color{red}{项目编号:S045,文末获取源码。} 项目编号:S045,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询社区4…

ELK---filebeat日志收集工具

filebeat日志收集工具 filebeat日志收集工具和logstash相同 filebeat的优点: filebeat是一个轻量级的日志收集工具,所使用的系统资源比logstash部署和启动时使用的资源要小的多 filebeat可以运行在非Java环境。它可以代替logstash在非Java环境上收集…

Java学习路线第一篇:Java基础(2)

这篇则分享Java学习路线第一part:Java基础(2) 从看到这篇内容开始,你就是被选定的天命骚年,将承担起学完Java基础的使命,本使命为单向契约,你可选择YES或者选择YES。 具体路线安排&#xff1a…

深度学习第1天:深度学习入门-Keras与典型神经网络结构

☁️主页 Nowl 🔥专栏《机器学习实战》 《机器学习》 📑君子坐而论道,少年起而行之 文章目录 神经网络 介绍 结构 基本要素 Keras 介绍 导入 定义网络 模型训练 前馈神经网络 特点 常见类型 代码示例 反馈神经网络 特点 …

AlphaFold的原理及解读

1、背景 蛋白质是生物体内一类重要的生物大分子,其结构复杂多样,蛋白质的结构对于理解其功能和参与的生物学过程具有重要意义。从生物学角度上看,蛋白质的结构可以分为四个层次:初级结构、二级结构、三级结构和四级结构。 初级结…

企业如何保障跨境金融业务中的数据安全传输?

随着全球化的不断深入,跨境金融业务日益频繁,然而在这些业务中,数据的安全传输一直是企业面临的重大挑战。跨境业务数据传输可能会遇到多种困难,如网络攻击、数据泄露、通信故障等。因此,企业需要采取有效的措施来确保…

【Mybatis系列】Mybatis之TypeHandler入门

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…