盘点数据库主从延迟的九个原因以及解决方案

数据库 其他数据库
低版本的MySQL只支持单线程复制,如果主库并发高,来不及传送到从库,就会导致延迟。可以换用更高版本的Mysql,可以支持多线程复制。

前言

大家好,我是捡田螺的小男孩

我们来看一道字节面试题:mysql主从延迟的原因有哪些?你遇到的最大延迟是多大?如何解决?

我以前见过的最大延迟是3个多小时。本文我们一起来聊聊主从延迟吧。

  • 主从延迟的定义
  • 主从延迟原因的9个原因以及解决方案

1. 主从延迟是怎么定义的呢?

与主从数据同步相关的时间点有三个

  • 主库执行完一个事务,写入binlog,我们把这个时刻记为T1;
  • 主库同步数据给从库,从库接收完这个binlog的时刻,记录为T2;
  • 从库执行完这个事务,这个时刻记录为T3。

所谓主从延迟,其实就是指同一个事务,在从库执行完的时间和在主库执行完的时间差值,即T3-T1

主从复制原理不记得的伙伴,可以看这个图哈:

图片图片

2. 主从延迟原因以及解决方法

2.1 网络延迟,优化网络

网络延迟是导致主从延迟的一个重要因素。我们要确保主从服务器之间的网络连接是高速且稳定的。可以考虑使用专用网络连接或提高网络带宽。

比如带宽20M升级到100M类似意思等。

2.2 从库的压力大,多搞几个从库分散压力

如果从库的压力大,也会导致主从延迟

比如主库直接影响业务的,大家可能使用会比较克制,因此一般查询都打到从库了,结果导致从库查询消耗大量CPU,影响同步速度,最后导致主从延迟。

这种情况的话,可以搞了一主多从的架构,即多接几个从库分摊读的压力,增加从库的数量可以分散读取负载,提高数据同步的速度和可靠性。 另外,还可以把binlog接入到Hadoop这类系统,让它们提供查询的能力。

2.3 数据库参数配置不合理,优化调整

调整MySQL数据库中的相关参数,如binlog格式、binlog缓冲区大小、innodb_flush_log_at_trx_commit等,以优化性能。

适当的参数设置可以减少磁盘I/O和事务提交延迟

2.4 使用半同步复制

半同步复制是介于全同步复制和异步复制之间的一种复制方式。主库在提交事务时需要等待至少一个从库接收到并写入到relay log中才返回结果给客户端。

图片图片

这可以提高数据的安全性,并减少主从延迟。但需要注意的是,半同步复制可能会增加写操作的延迟

2.5 升级硬件配置

如果从库所在的机器比主库的机器性能差,会导致主从延迟,这种情况比较好解决,只需选择主从库一样规格的机器就好。

因此,我们可以:

  • 升级从服务器的硬件,特别是磁盘I/O系统和CPU,以便更快地应用复制事件。
  • 使用SSD可以显著提高I/O性能。

这是减少主从延迟时间,最简单粗暴的方法~~

2.6 避免大事务

  • 可以将大事务分解为多个小事务。

如果一个事务执行就要10分钟,那么主库执行完后,给到从库执行,最后这个事务可能就会导致从库延迟10分钟啦。日常开发中,我们为什么特别强调,不要一次性delete太多SQL,需要分批进行,其实也是为了避免大事务。另外,大表的DDL语句,也会导致大事务,大家日常开发关注一下哈。

2.7 使用并行复制

  • 在MySQL 5.6及以上版本中,可以使用并行复制来加速从库应用binlog中的事件。
  • 通过设置slave_parallel_workers参数,可以指定并行工作线程的数量。

低版本的MySQL只支持单线程复制,如果主库并发高,来不及传送到从库,就会导致延迟。可以换用更高版本的Mysql,可以支持多线程复制。

2.8 业务侧加缓存,优化查询

  • 在业务侧添加缓存层,如Redis、Memcached等,优化查询接口,以减少对数据库的查询压力。

2.9 避免大表DDL操作

  • 大表的DDL操作(如添加索引、修改表结构等)会导致长时间的锁等待和复制延迟。
  • 尽量避免在主从复制环境中对大表进行DDL操作,或者选择在业务低峰期进行。
责任编辑:武晓燕 来源: 捡田螺的小男孩
相关推荐

2017-12-27 13:07:52

数据库MySQL主从复制

2019-07-16 06:30:19

MySQL同步延迟数据库

2011-08-22 15:31:51

SQL Servermssqlserver数据库复制

2010-04-26 16:31:09

Oracle SQL

2024-08-14 16:09:10

2024-10-21 08:21:12

数据库主从延迟

2022-03-24 12:15:50

MySQL数据库读写分离

2011-03-07 16:42:05

MySQL数据库安全

2009-11-18 16:10:00

2019-03-12 10:30:29

开源备份Borg Backup

2011-03-28 13:11:18

MySQL数据库安全

2011-03-03 18:09:14

2010-05-27 18:24:09

MySQL数据库密码

2018-03-26 12:58:52

数据库OracleMySQL

2011-01-21 09:43:10

安恒数据库安全安全审计

2011-03-24 15:41:42

数据库

2011-08-03 14:02:02

数据库连接ACCESS

2017-06-21 08:30:20

MySQL原因解决办法

2010-05-28 11:22:07

2023-09-21 23:08:36

MySQL数据库死锁
点赞
收藏

51CTO技术栈公众号