MySQL 常见主从延迟原因分析

MySQL 常见主从延迟原因分析

更新时间:2022-10-30


文章目录

  • MySQL 常见主从延迟原因分析
    • MySQL 主从复制简介
    • 主从延迟时间计算方式
    • 主从延迟问题影响
    • 常见主从延迟原因分析

MySQL 主从复制简介

MySQL内建的复制功能是构建基于MySQL的大规模、高性能应用的基础,这类应用使用所谓的“水平扩展”的架构。我们可以通过为服务器配置一个或多个从库的方式来进行数据同步。复制功能不仅有利于构建高性能的应用,同时也是高可用性、可扩展性、灾难恢复、备份以及数据仓库等工作的基础。

  • 主从复制是如何工作的?
    MySQL 常见主从延迟原因分析_第1张图片
    由上图所示,简单概述主从复制如下:

      1)在主库上将数据更改记录到二进制日志(Binary Log)中;
      2)备库通过I/O线程将主库上的日志复制写入到自己的中继日志(Relay Log)中;
      3)备库再通过SQL线程读取中继日志中的事件,将其重放到备库数据之上。
    

但从这个复制逻辑中,我们也不难发现,在同一时间点从库上的数据可能与主库存在不一致,一些大的语句可能导致从库产生几秒、几分钟甚至几个小时的延迟。

主从延迟时间计算方式

1、主从延迟时间参考
Seconds_Behind_Master,精度为秒
MySQL 常见主从延迟原因分析_第2张图片
2、主从延迟时间是如何计算的?

  • 1)每个事务的binlog里面都有一个时间字段,用于记录主库写入的时间;
  • 2)从库取出当前正在执行的事务的时间字段值,并计算它与当前系统时间的差值,得到Seconds_Behind_Master;
  • 3)本质上,这个字段测量的是Slave 的SQL线程和Slave 的I/O线程之间秒的时差。如果主从之间的网络连接速度很快,Slave的I/O线程与Master非常接近,因此该字段是Slave 的SQL线程与Master 相比有多晚的一个很好的近似值。如果网络是慢的,这就不是一个好的近似值;SLave 的SQL线程可能经常赶上读的慢的Slave 的I/O线程,所以Seconds_Behind_Master常常显示值为0,即使I/O线程与Master相比会比较慢。换句话说,Seconds_Behind_Master仅适用于快速网络。

备注:如果说主从服务器的时间设置不一致,这并不会导致主从延迟时间不准,是因为从库在连接到主库的时候,会通过执行select unix_timestamp()函数来获得当前主库的系统时间。如果不一致,在计算Seconds_Behind_Master时会自动扣除掉这个差值。

主从延迟问题影响

1、查询数据不准确

为分担主库压力,业务通常会将一些读的请求发送至从库,但如果主从存在延迟的情况,这时读到的可能就是过期的数据。当然,目前在实际业务架构设计中,也会考虑到主从延迟因素的存在,通过如强制走主库、配合半同步(semi-sync)、sleep等方案优化,避免“过期读”对业务造成的影响。

2、主库宕机,数据丢失

这里意思是主库宕机后,需要较长的恢复时间,但特别是核心业务系统需要快速恢复的紧急情况下,如果之前存在延迟,强制切换主库,保证业务可用,就会导致部分数据丢失,后期的补偿也将会是件很麻烦的事情。

常见主从延迟原因分析

1、主从服务器配置不一致

这里所说的主从服务器配置不一致,是指对比主库,从库服务器的CPU、内存、磁盘I/O等硬件配置较低。其中,CPU和I/O资源通常也是主要的瓶颈所在。所以在生产环境,保证主从服务器配置一致是很重要的上线标准。

2、主库执行大事务

在一个事务中处理大量数据,当大事务记录入binlog并同步到从库之后,从库执行这个事务的操作耗时也非常长,这段时间,就会产生主从复制延时。从库的延迟时间从主库事物执行了多久开始计算。对于这种情况引起的主从复制延时,就需要拆分大事务语句到若干小事务中,这样能够进行及时提交,减小主从复制延时。

3、表无主键

当在主库上对一张无主键或无唯一索引的表删除了100条数据,当从库复制这个操作的时候,执行的是100个delete动作,每个delete都会做一次全表扫描才能执行结束,可想而知,这时候的效率是非常低下的,很多时候,表的数据量很少,并不能及时体现,但是随着表数据量增大,那么就会成巨大的延迟,并且基本不会消除。所以在表结构设计阶段,一定要为表设置主键。

4、主库DML操作并发大

在业务高峰时期,主库上并发执行数非常高,在大量执行insert、delete、update操作,tps很高,在这种情况下,从库的复制能力跟不上主库,往往就会产生延迟,延迟慢慢堆积,越来越大。所以一个数据库的能力是存在瓶颈的,这个时候就需要做水平扩展来增加系统的事务处理能力。

5、网络延迟或丢包等

通过本篇开头部分提及的主从复制逻辑,我们可以知道从库会启动一个工作线程,称为I/O线程,I/O线程跟主库建立一个普通的客户端连接,在主库发送信号通知其有新的事件产生时被唤醒,备库I/O线程会将接收到的时间记录到中继日志中。这个I/O线程的工作状态便和网络环境有很大的联系。在监控数据库状态的同时,我们也要密切关注网络环境的健康状态,接入监控告警。

6、大表DDL

当对主库若干大表执行DDL语句的情况下,比如,对表加一个字段或者加一个索引等等,那么从库就可能会产生复制延时。所以要注意表的数据量,做好分表的工作,在执行大表的DDL时,选择业务低峰期,以减少延迟带来的影响。

你可能感兴趣的:(MySQL,MySQL,延迟)