如何处理 MySQL 的主从同步延迟?

Sherwin.Wei Lv7

如何处理 MySQL 的主从同步延迟?

回答重点

首先需要明确一个点延迟是必然存在的,无论怎么优化都无法避免延迟的存在,只能减少延迟的时间。

常见解决方式有以下几种:

  • 二次查询。如果从库查不到数据,则再去主库查一遍,由 API 封装这个逻辑即可,算是一个兜底策略,比较简单。不过等于读的压力又转移到主库身上了,如果有不法分子故意查询必定查不到的查询,这就对主库产生冲击了。
  • 强制将写之后立马读的操作转移到主库上。这种属于代码写死了,比如一些写入之后立马查询的操作,就绑定在一起,写死都走主库。不推荐,比较死板。
  • 关键业务读写都走主库,非关键还是读写分离。比如上面我举例的用户注册这种,可以读写主库,这样就不会有登陆报该用户不存在的问题,这种访问量频次应该也不会很多,所以看业务适当调整此类接口。
  • 使用缓存,主库写入后同步到缓存中,这样查询时可以先查询缓存,避免了延迟的问题,不过又引入了缓存数据一致性的问题。

除此之外,也可以提一提配置问题,例如主库的配置高,从库的配置太低了,可以提升从库的配置等。如果面试官对 MySQL 比较熟,可能会追问一些偏 DBA 侧的问题,例如并行复制等。

扩展知识

MySQL 主从延迟的常见原因及优化方案

原因 优化方案
从库单线程复制 启用多线程复制:MySQL 并行复制
网络延迟 优化网络连接,缩短主从之间的物理距离。
从库性能不足 增加硬件资源。
长事务 优化应用程序,减少主库写入压力,避免长事务。MySQL 中长事务可能会导致哪些问题?
从库太多 从库过多主库同步压力大,导致延迟,合理的评估主从数量
从库负载太高 增加从库实例,分散查询压力,避免慢查询。

再强调一下主从延迟是必然存在的,无论怎么优化都无法避免延迟的存在,只能减少延迟的时间。例如即使启用多线程复制就一定可以避免延迟吗?所以业务上的解决方案还是以回答重点内的几个解决方式为准。

Comments