导致主备延迟的原因:
- 有些部署条件下,备库所在机器的性能要比主库所在的机器性能差。
- 备库的压力大。一般的想法是,主库既然提供了写能力,那么备库可以提供一些读能力。或者一些运营后台需要的分析语句,不能影响正常业务,所以只能在备库上跑。
- 大事务。如大表DDL,或者一次性删除大量数据等。
主备切换流程:
-
判断备库B现在的seconds_behind_master,如果小于某个值(比如5秒)继续下一步,否则持续重试这一步;
-
把主库A改成只读状态,即把readonly设置为true;
-
判断备库B的seconds_behind_master的值,直到这个值变成0为止;
-
把备库B改成可读写状态,也就是把readonly 设置为false;
-
把业务请求切到备库B。
以上是可靠性优先策略来切换,其实还有一种是可用性优先策略,那就是首先执行4、5步骤。到底采用哪种粗略,还是要看业务特性的,可用性优先会导致数据不一致的问题。
在满足数据可靠性的前提下,MySQL高可用系统的可用性,是依赖于主备延迟的。延迟的时间越小,在主库故障的时候,服务恢复需要的时间就越短,可用性就越高。