MySQL主从延迟的原因及解决方法:说到MySQL数据库主从同步延迟的原理,就不得不从mysql数据库主从原理说起复制。单线程运行(mysql5.6之前版本),主库对所有的DDL和DML都生成binlog,而且binlog是顺序写入的,所以效率很高。从机的Slave_IO_Running线程会去主库取日志,效率会更高。从库的Slave_SQL_Running线程会在从库上实现主库的DDL和DML操作。DML和DDL的IO操作是随机的,不是顺序的,所以成本会很高,而且slave上的其他查询可能会引起锁争用。由于Slave_SQL_Running也是单线程的,一个DDL卡主需要执行10次。minutes,那么后面所有的DDL都会等这个DDL执行完再继续执行,这样就导致了延迟。有朋友会说:“主库上同一个DDL也要执行10分钟,为什么从库会延迟呢?”答案是master可以并发,但是Slave_SQL_Running线程不能。2、MySQL数据库主从同步延迟是怎么产生的?主库TPS并发高时,产生的DDL量超过从库单个sql线程所能承受的范围,所以会出现延迟,当然也可能会出现从库的大查询语句锁等待奴隶。三、MySQL数据库主从同步延时解决方案(1)降低从同步延时最简单的解决方案就是优化架构,尽量让主库的DDL执行得尽可能快。另外写了主库,它有更高的数据安全性,比如sync_binlog=1,innodb_flush_log_at_trx_commit=1等设置,但是slave不需要那么高的数据安全性,可以说sync_binlog设置为0或者binlog被关闭。innodb_flushlog也可以设置为0来提高SQL的执行效率。(2)另一种是使用比主库更好的硬件设备作为从库。也就是说,从服务器作为备份而不是提供查询,当它的负载降低时,在relaylog中执行SQL的效率自然就高了。(3)增加从服务器,目的是分散读取压力,从而减轻服务器负载。4、造成MySQL数据库主从同步延迟的因素。1.网络延迟2.Master负载3.Slave负载一般的做法是使用多个slave来分担读请求,然后从这些slave中拿出一个专用服务器,只做备份,不做任何其他操作,就可以满足要求最大程度的“实时”。另外,引入两个可以减少延迟的参数--slave-net-timeout=seconds参数含义:当slave从master数据库读取日志数据失败时,等待多久重新建立连接并获取数据slave_net_timeout单位是秒默认设置是3600秒slave_net_timeout3600–master-connect-retry=seconds它需要重试。master-connect-retry的单位是秒,默认设置是60秒。通常,配置以上两个参数可以减少网络问题导致的主从数据同步延迟。
