在双 M 结构下,从状态 1 到状态 2 切换的详细过程是这样的:
1判断备库 B 现在的 seconds_behind_master,如果小于某个值(比如 5 秒)继续下一步,否则持续重试这一步;
2把主库 A 改成只读状态,即把 readonly 设置为 true;
3判断备库 B 的 seconds_behind_master 的值,直到这个值变成 0 为止;
4把备库 B 改成可读写状态,也就是把 readonly 设置为 false;
5把业务请求切到备库 B。
这个切换流程,一般是由专门的 HA 系统来完成的,我们暂时称之为可靠性优先流程。
备注:图中的 SBM,是 seconds_behind_master 参数的简写。
可以看到,这个切换流程中是有不可用时间的。因为在步骤 2 之后,主库 A 和备库 B 都处于 readonly 状态,也就是说这时系统处于不可写状态,直到步骤 5 完成后才能恢复
。在这个不可用状态中,比较耗费时间的是步骤 3,可能需要耗费好几秒的时间。这也是为什么需要在步骤 1 先做判断,确保 seconds_behind_master 的值足够小。
试想如果一开始主备延迟就长达 30 分钟,而不先做判断直接切换的话,系统的不可用时间就会长达 30 分钟,这种情况一般业务都是不可接受的。
当然,系统的不可用时间,是由这个数据可靠性优先的策略决定的
。你也可以选择可用性优先的策略,来把这个不可用时间几乎降为 0。
总结
- 主备切换可能会导致业务不可用