一、怎么判断主从延迟
在从库上执行SHOW SLAVE STATUS
,如果结果里的seconds_behind_master
字段不等于0,则代表主从有延迟,值越大延迟越大。
二、可能的原因及解决方案
2.1 网络抖动
网络抖动导致主库的binlog没能及时传给从库
解决方案:
先把从库上的查询切到主库,等网络恢复后再切回从库
2.2 从库机型配置比主库差
从库配置差性能低,导致从库消费relay log的速度比主库生成binlog的速度慢
解决方案:
换成同等机型
2.3 从库压力大
有人在从库上执行十分消耗性能的SQL查询语句,导致从库负载高,影响了同步速度
解决方案:
- 多接几个从库,分担查询压力
- 通过把 binlog 输出到外部系统,比如 Hadoop 这类系统,让外部系统提供统计类查询的能力
2.4 主库上执行了大事务
如果一个事务在主库上执行了 10 分钟,那这个事务很可能就会导致从库延迟 10 分钟
解决方案:
避免在主库上执行大事务,例如一次性delete很多数据,应该改为分批delete;例如对大表进行DDL,建议使用 gh-ost 方案
2.5 从库不支持并行复制
只有一个线程消费relay log,速度跟不上
解决方案:
开启多线程并行复制功能。
注意:
MySQL 5.6(含)之后的版本才支持并行复制功能,其中5.6 版本虽然支持并行复制,但支持的粒度是按库并行,即同一个库里的relay log仍然只由一个线程负责处理。因此建议使用 5.7 以上的版本。
参考文献:
本文由阅读丁奇的《MySQL实战45讲》课程后总结编写