从上篇文章咱们知道主备同步是依赖于 binlog,主库负责生产 binlog,备库负责消费 binlog,从而实现主备同步。mysql

今天咱们来学习一下主备同步里的一个重点的问题:主备延时。ios

主备延时,简单来讲,就是主库和备库的数据一致出现必定的时间差,好比备库的此刻的数据快照是主备5分钟前的数据快照,那就说明主备延时有5分钟。sql

主备延迟是怎么产生的

产生主备延迟的根本缘由是备库上消费 binlog 的速度赶不上主库产生 binlog 的速度。好比:安全

大事务,例如一次性delete不少数据;

大表的DDL;

备库压力大。例若有些像运维、订单等统计分析在备机上跑;

主备库的服务器的配置不一样,主库的服务器配置好,备库的服务器配置差。

主备延迟的排查之路

网络

网络可能致使主备延迟的问题,好比主库或者备库的带宽满负载、主备之间网络延迟很大,有可能会致使主库的 binlog 没有全量传输到备库,形成延迟。服务器

机器性能

备库 使用了烂机器? 好比主库使用了 SSD,而备库使用的是 SATA。网络

备库 高负载? 可能在备库上作统计分析,致使备库的负载很高。可以使用 top 命令进行排查。多线程

备库 磁盘有问题? 磁盘、raid卡、调度策略有问题的状况下,有的时候会出现单个IO延迟很高的状况。可以使用 iostat 查看 IO 运行状况。运维

大事务

是否常常有大事务? 好比在 RBR 模式下,执行带有大量的 delete 操做,或者一个表的 alter 操做等,都会致使延时状况的发生。可经过 processlist 命令查看相关信息,或者使用 mysqlbinlog 查看 binlog 中的 SQL 就能快速确认。性能

锁冲突问题也可能致使备库的 SQL 线程执行慢。好比一些 select ... for update 的 SQL。可经过 processlist 和 查看 information_schema 下面与锁和事务相关的表来查看分析。学习

参数

若是使用的是 InnoDB 引擎,能够调整 innodb_flush_log_at_trx_commit、sync_binlog 参数来提高复制速度。

sync_binlog 的默认值是 0,MySQL 不会将 binlog 同步到磁盘,其值表示每写多少 binlog 同步一次磁盘。

innodb_flush_log_at_trx_commit 其值表示每一次事务提交或事务外的指令须要把日志 flush 到磁盘。

注:这种调整可能会影响数据的安全性,须要结合业务来考虑。

多线程

在 MySQL 5.6 版本以前,MySQL采用单线程复制,而从 5.6 开始,正式支持多线程复制。

若是是单线程同步,单个线程存在写入瓶颈,致使主备延迟,那就先调整为多线程试试效果。

能够经过 show processlist 查看是否有多个同步线程,也能够查看参数的方式查看是否使用多线程(show variables like '%备库_parallel%')

当你看到是上图这种结果的时候,恭喜你,你使用的是单线程。使用下面那行命令改形成多线程复制:

STOP 备库 SQL_THREAD;SET GLOBAL 备库_parallel_type='LOGICAL_CLOCK';SET GLOBAL 备库_parallel_workers=8;START 备库 SQL_THREAD;

改造后以下图所示:

参考资料