1. 复制的步骤

  1. 主库把数据更改记录到bin log
  2. 从库通过I/O线程将主库上的bin log复制到自己的中继日志(relay log)中
  3. 从库读取中继日志,将其重放到自己的数据库中

2. 延迟时间

通过在从库上执行show slave status命令,返回结果中的seconds_behind_master就是当前从库的延迟时间。
seconds_behind_master是如何计算的呢?
每个事务的binlog上都有一个时间字段A,用来记录在主库上的写入时间。
seconds_behind_master = 当前系统时间-A

通过复制的步骤,可以知道seconds_behind_master主要包括两部分时间:

  1. binlog从主库传给从库的时间
  2. 从库接收完binlog到执行完的时间

通常网络正常的时候,第一点是很快的。所以延迟的主要原因就是在于第二点。

3. 延迟原因&解决思路

上面分析了延迟时间的主要来源,现在来看下造成该延迟的可能原因。

主库dml并发大

主库段时间内产生了大量的binlog,这些操作需要全部同步到从库并执行,从库重放速度比不上主库,造成从库延迟。
解决思路:开启并行复制。

主库执行大事务或者大表DDL语句

解决思路:拆分大事务,业务低峰期进行ddl

从库的机器性能比主库差,配置不一致

解决方案:配置尽量一致,从库可以略高于主库

从库的压力比较大

比如从库上大量的查询耗费了较多的资源,影响了同步的速度
解决思路:多个从库