写这篇文章是因为之前有一次删库操作,需要进行批量删除数据,当时没有控制好删除速度,导致产生了主从延迟,出现了一点小事故。

今天我们就来看看为什么会产生主从延迟以及主从延迟如何处理等相关问题。

坐好了,准备发车!

图注:思维导图

主从常见架构

随着日益增长的访问量,单台数据库的应接能力已经捉襟见肘。因此采用主库写数据,从库读数据这种将读写分离开的主从架构便随之衍生了出来。

在生产环境中,常见的主从架构有很多种,在这里给大家介绍几种比较常见的架构模式。

主从复制原理

了解了主从的基本架构及相关配置后,下面就要进入正题了。

对于主从来说,通常的操作是主库用来写入数据,从库用来读取数据。这样的好处是通过将读写压力分散开,避免了所有的请求都打在主库上。同时通过从库进行水平扩展使系统的伸缩性及负载能力也得到了很大的提升。

但是问题就来了,读从库时的数据要与主库保持一致,那就需要主库的数据在写入后同步到从库中。如何保持主库与从库的数据一致性,主库又是通过什么样的方式将数据实时同步到从库的?

基本原理

Mysql 中主从复制时有两个很重要的日志文件:binlog(二进制日志文件)

relay log(中继日志文件)

在主从同步的过程中,主库会将所有的操作事件记录在 binlog 中,从库通过开启一个 I/O 线程保持与主库的通信,并在一定时间间隔内探测 binlog 日志文件是否发生改变。如果 binlog 日志发生了变化,主库生成一个 binlog dump 线程向从库 I/O 线程传送 binlog。从库上的 I/O 线程将 binlog 复制到自己的 relay log 中。最终由从库中的 SQL 线程读取 relay log 中的事件重放到从库上。

主从延迟原因

上面的流程我们已经知道了主从复制的相关过程了,但是主库有更新就会同步从库,那为什么会出现主从延迟的情况呢?

随机重放

Mysql 主库中写 binlog 的操作是顺序写的,之前我们提到过,磁盘的顺序读写速度是很快的。同样的,从库中的 I/O 线程操作日志的速度效率也是很高的。但是别忘了,还有一个 SQL 线程来进行数据重放,而重放的过程是随机写盘的。到这里你应该就明白了吧,某一时刻 relay log 里的数据来不及重放进从库,就会产生主从延迟的情况。

主库并发高

知道了从库中 SQL 线程的重放情况,对于主库并发高导致主从延迟肯定就不难理解了。某一时刻,大量写请求打到主库上,意味着要不断对 binlog 进行写入,此时从库中的 SQL 线程就会应接不暇,自然会产生主从延迟。

锁等待

对于 SQL 单线程来说,当遇到阻塞时就会一直等待,直到执行成功才会继续进行。如果某一时刻从库因为查询产生了锁等待的情况,此时只有当前的操作执行完成后才会进行下面的操作,同理也就产生了主从延迟的情况。

主从延迟处理

知道了主从延迟的原因,接下来我们看看如何来进行处理。

并行复制

既然 SQL 单线程进行重放时速度有限,那么能不能采用多线程的方式来进行重放呢?MySQL 5.6 版本后,提供了一种并行复制的方式,通过将 SQL 线程转换为多个 work 线程来进行重放,这样就解决了主从延迟的问题。

降低主库并发

你可能会说了,我现在用的低版本的数据库,也没法升版本啊,那我怎么整。对于主库并发高的情况,这种方式你只能通过控制并发来解决延迟了,多用用 Redis。

读主库

这种情况你肯定不陌生,对于一些实时性要求比较高的数据,你总不能读从库去拿吧,万一延迟个大半天,你不得贡献自己的年终奖啊。

总结

主从复制原理主从复制中有两个很重要的日志文件,binlog和relay log,分别位于主库与从库中。其中 binlog 是主从复制的基础,通过将操作事件写入 binlog 通过 I/O 线程传送至从库进行同步。

主从延迟原因从库中 SQL 线程重放的过程是随机写盘的,并且 SQL 线程是单线程的,因此数据来不及重放的话就会导致主从延迟。

主库并发高会导致写操作不断写入 binlog,对于 SQL 线程说可能会应接不暇,也会产生主从延迟。

重放过程中如果遇到锁等待也是产生延迟的原因之一。

主从延迟处理MySQL 5.6版本以后通过并行复制的方式来解决 SQL 单线程产生的主从延迟问题。对于低版本来说,可以通过降低主库的并发来解决。如果对数据实时性要求比较严格的话,可以通过读主库来达到目的。

mysql 从库 问题_一篇文章帮你解决Mysql 中主从库不同步的问题相关推荐

  1. 一篇文章带你解决 SpringBoot 中 favicon 失效,不显示问题

    文章目录 一.常规思路 二.其他思路 一.常规思路 正常显示我们已经知道:一篇文章带你搞定 SpringBoot 自定义欢迎页和网页图标 favicon 如果正常设置不好使常规的思路是: (1)旧版的 ...

  2. mysql 帮助命令_一篇文章帮你搞定所有MySQL命令!

    MySQL的基本操作可以包括两个方面:MySQL常用语句如高频率使用的增删改查(CRUD)语句和MySQL高级功能,如存储过程,触发器,事务处理等.而这两个方面又可以细分如下: MySQL常用语句 表 ...

  3. Linux命令老是记不住?一篇文章帮你解决。Linux常用命令汇总

    「作者主页」:士别三日wyx 「作者简介」:CSDN top100.阿里云博客专家.华为云享专家.网络安全领域优质创作者 100个最常用的Linux命令 一.文件目录 mkdir:创建目录 ls:列出 ...

  4. 用虚拟信用卡支付的时候经常出现交易失败、无法付款?一篇文章帮你解决这些问题

    经常会有一些新客户反馈使用虚拟信用卡支付的时候会出现很多问题,就会开始怀疑是不是虚拟卡有问题,但其实用实体卡也会出现这些问题的.海外支付为什么这么容易交易失败呢? 一.系统原因 1.缺少客户熟悉的支付 ...

  5. 电脑无法访问网页,但qq可以用?一篇文章帮你解决(非常详细)

  6. 一篇文章让你解决sql报错check the manual that corresponds to your MySQL server version for the right syntax to

    一篇文章让你解决sql报错 反馈 因为这一个问题,找到了很多类似问题,你在看到这篇博客时,可能不是这个,但是一定是下面其中一个: Mysql错误:check the manual that corre ...

  7. 一篇文章帮你搞定JVM中的堆

    文章目录 一篇文章帮你搞定JVM中的堆 堆的核心概述 堆的内存细分 设置堆内存大小与OOM OOM(OutOfMemory)举例 年轻代与老年代 图解对象分配过程 MinorGC,MajorGC,Fu ...

  8. Android NDK开发之旅(2):一篇文章搞定Android Studio中使用CMake进行NDK/JNI开发

    Android NDK开发之旅(2):一篇文章搞定android Studio中使用CMake进行NDK/JNI开发 (码字不易,转载请声明出处:http://blog.csdn.NET/andrex ...

  9. 一篇文章助你理解Python3中字符串编码问题

    前几天给大家介绍了unicode编码和utf-8编码的理论知识,以及Python2中字符串编码问题,没来得及上车的小伙伴们可以戳这篇文章:浅谈unicode编码和utf-8编码的关系和一篇文章助你理解 ...

最新文章

  1. 在Ubuntu8.10下为PHP安装coreseek全文检索引擎支持的详细步骤
  2. python绘制3d图形-python matlibplot绘制3D图形
  3. Linux 关于动态链接库以及静态链接库的一些概念
  4. mysql未指定错误_使用mysql的系统中常见sql错误
  5. NB-IOT(5)---关于NB-IoT的十大问题和答案
  6. Centos7重装系统保留数据
  7. 如何让ul的符号隐藏_HTML+CSS之如何找BUG
  8. 设计网页录入信息与自己定义server数据接收
  9. 2018.12.20 区块链论文翻译
  10. linux命令完整篇
  11. MATLAB信号与系统分析(三)——连续信号与系统的复频域分析及MATLAB实现
  12. 数据中心运营规划的基本原则
  13. rancher运行pvc程序报错解决方法
  14. 运鸿蒙之息 行祈者之意,祈禳之禳关度煞科
  15. 3. linux 常见服务
  16. 【AI PC端算法优化】一,一步步优化RGB转灰度图算法
  17. 如何提高百度经验推广技巧
  18. 如何用计算机把数字12变成21,2015年12月计算机二级office考试题及答案
  19. angular中ng-sow使用时候发现
  20. MySQL导入几十G数据后创建索引时提示空间不足(Errcode: 28 - No space left on device)

热门文章

  1. linux sed 冒号,linux sed 总结
  2. Java 获取集合元素的值
  3. C++ new和delete运算符
  4. JDBC连接sql server数据库
  5. 倒计时小工具_送你3个倒数计日的小程序,让你不再遗忘重要事
  6. 【youcans 的 OpenCV 例程 200 篇】112. 滤波反投影重建图像
  7. 【课题总结】OpenCV 抠图项目实战(1)目录摘要
  8. Python 小白从零开始 PyQt5 项目实战(1)安装与环境配置
  9. Visual C++6.0下载地址与安装步骤、使用教程
  10. linux装服务器系统,linux服务器系统安装