第二十四讲:MySQL是怎么保证高可用的?

第二十四讲:MySQL是怎么保证高可用的?

简概:

依旧是开篇

​ 在上一篇文章中,我和你介绍了 binlog 的基本内容,在一个主备关系中,每个备库接收主库的 binlog 并执行。正常情况下,只要主库执行更新生成的所有 binlog,都可以传到备库并被正确地执行,备库就能达到跟主库一致的状态,这就是最终一致性。

​ 但是,MySQL 要提供高可用能力,只有最终一致性是不够的。为什么这么说呢?今天我就着重和你分析一下。这里,我再放一次上一篇文章中讲到的双 M 结构的主备切换流程图。


图 1 MySQL 主备切换流程 -- 双 M 结构

主备延迟

​ 主备切换可能是一个主动运维动作,比如软件升级、主库所在机器按计划下线等,也可能是被动操作,比如主库所在机器掉电。

​ 接下来,我们先一起看看主动切换的场景。

​ 在介绍主动切换流程的详细步骤之前,我要先跟你说明一个概念,即“同步延迟”

​ 与数据同步有关的时间点主要包括以下三个:

  • 主库 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 来作为主备延迟的值,这个值