1 前言
在上一篇文章中,介绍了binlog的基本内容,在一个主备关系中,每个备库接收主库的binlog并执行。
正常情况下,只要主库执行更新生成的所有binlog,都可以传到备库并被正确地执行,备库就能达到跟主库一致的状态,这就是最终一致性。
但是,MySQL要提供高可用能力,只有最终一致性是不够的。这篇文章就分析一下。
这里,回顾一下上一篇文章中讲到的双M结构的主备切换流程图。
2 主备延迟
主备切换可能是一个主动运维动作,比如软件升级、主库所在机器按计划下线等,也可能是被动操作,比如主库所在机器掉电。
接下来,我们先一起看看主动切换的场景。
在介绍主动切换流程的详细步骤之前,要先说明一个概念,即“同步延迟”。与数据同步有关的时间点主要包括以下三个:
- 主库A执行完成一个事务,写入binlog,我们把这个时刻记为T1;
- 之后传给备库B,我们把备库B接收完这个binlog的时刻记为T2;
- 备库B执行完成这个事务,我们把这个时刻记为T3。
所谓主备延迟,就是同一个事务,在备库执行完成的时间和主库执行完成的时间之间的差值,也就是T3-T1。
可以在备库上执行showslave status命令,它的返回结果里面会显示seconds_behind_master,用于表示当前备库延迟了多少秒。