MySQL主从同步延时产生原因?怎么优化?
数据库
MySQL
官方
推荐
MySQL默认采用的异步操作,因为它的效率明显是最高的。
因为只要写入bin log后事物就结束返回成功了。但由于从库从主库异步拷贝日志 以及串行执行 SQL 的特点,所以从库的数据一定会比主库慢一些,是有延时的。所以经常出现,刚写入主库的数据可能是读不到的,要过几十毫秒,甚至几百毫秒才能读取到。这就是主从同步延时问题。
1)、影响延迟因素
这里整理了影响主从复制延迟大致有以下几个原因:
- 主节点如果执行一个很大的事务,那么就会对主从延迟产生较大的影响
- 网络延迟,日志较大,slave数量过多
- 主上多线程写入,从节点只有单线程同步
- 机器性能问题,从节点是否使用了“烂机器”
- 锁冲突问题也可能导致从机的SQL线程执行慢
2)、优化主从复制延迟
这个没有说去完全解决,要想解决那么就只能采用同步复制策略。不过,一般不建议使用这种同步模式。显而易见,如果写操作必须等待更新同步完成,肯定会极大地影响性能,除非你不在乎性能。
- 大事务:将大事务分为小事务,分批更新数据
- 减少Slave的数量,不要超过5个,减少单次事务的大小
- MySQL 5.7之后,可以使用多线程复制,使用MGR复制架构
- 在磁盘、raid卡、调度策略有问题的情况下可能会出现单个IO延迟很高的情况,可用iostat命令查看DB数据盘的IO情况,再进一步判断
- 针对锁问题可以通过抓去processlist以及查看information_schema下面和锁以及事务相关的表来查看
总结
主机与从机之间的物理延迟是无法避免的,既然无法避免就可以考虑尝试通过缓存等方式,降低新修改数据被立即读取的概率。