与数据同步有关的时间点主要包括以下三个:
- 主库 A 执行完成一个事务,写入 binlog,我们把这个时刻记为 T1;
- 之后传给备库 B,我们把备库 B 接收完这个 binlog 的时刻记为 T2;
- 备库 B 执行完成这个事务,我们把这个时刻记为 T3。
所谓主备延迟
,就是同一个事务,在备库执行完成的时间和主库执行完成的时间之间的差值,也就是 T3-T1
。
你可以在备库上执行 show slave status
命令,它的返回结果里面会显示 seconds_behind_master
,用于表示当前备库延迟了多少秒。
seconds_behind_master
的计算方法是这样的:
- 每个事务的
binlog
里面都有一个时间字段,用于记录主库上写入的时间; - 备库取出当前正在执行的事务的时间字段的值,计算它与当前系统时间的差值,得到
seconds_behind_master
。
可以看到,其实 seconds_behind_master
这个参数计算的就是 T3-T1
。所以,我们可以用 seconds_behind_master
来作为主备延迟的值,这个值的时间精度是秒。
你可能会问,如果主备库机器的系统时间设置不一致,会不会导致主备延迟的值不准?其实不会的。因为,备库连接到主库的时候,会通过执行 SELECT UNIX_TIMESTAMP()
函数来获得当前主库的系统时间。如果这时候发现主库的系统时间与自己不一致,备库在执行 seconds_behind_master
计算的时候会自动扣掉这个差值。
需要说明的是,在网络正常的时候,日志从主库传给备库所需的时间是很短的,即 T2-T1
的值是非常小的。也就是说,网络正常情况下,主备延迟的主要来源是备库接收完 binlog 和执行完这个事务之间的时间差
。
所以说,主备延迟最直接的表现是,备库消费中转日志(relay log)的速度,比主库生产 binlog 的速度要慢
。接下来,我就和你一起分析下,这可能是由哪些原因导致的。
总结
- 主备延迟就是同一个事务,在备库和主库执行完成的时间差值
- 主备延迟的主要来源是备库接收完 binlog 和执行完这个事务之间的时间差
- seconds_behind_master 可以用于判断主备延迟