我们来看一道字节面试题: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操作,或者选择在业务低峰期进行。