MySQL面试题:主从复制binlog延迟太多怎么办

概述

  • 之前在网上看到有人分享面试经验:binlog复制延迟太多怎么办,对于这个问题在工作当中也是很常见的一个问题。
  • 之前分析过,MySQL基于二进制日志binlog实现的主从复制是一种异步复制,即主库对于数据库修改操作,首先记录到binlog然后在修改数据库文件。主库的复制线程读取binlog然后传输给从库,从库的复制线程接收保存为relay log,然后再由SQL线程读取relay log并在从库执行该SQL。故整个过程是存在延迟的,实现的是最终一致性。所以如果项目需要使用主从复制,则前提是从库的数据存在延迟能满足业务需求。
  • 正常来说,MySQL的主从复制是比较快的,延迟很小基本不会对应用造成影响,如果延迟太多,则首先需要分析发送延迟的原因。

延迟的原因与解决办法

硬件资源瓶颈

由MySQL主从复制的过程分析可知,主从复制过程其实就是二进制日志读取,传输,接收,解析执行的过程,故整个过程涉及到的主要资源包括:CPU,内存,磁盘IO,网络IO。所以在发生延迟太多时,可以观察对应时刻的以上硬件资源的负载和使用情况。

主库
  • 主库主要是读取binlog文件然后传输出去,所以主要可能成为性能瓶颈的就是磁盘IO,内存,网络IO。
  • 磁盘IO:如果主库所在主机上面,如果还存在其他磁盘IO繁忙的进程,如kafka进程,则可能导致主库复制线程在读取binlog时存在竞争而导致读取缓慢,所以可以使用如iostat命令来监控。
  • 内存:复制线程首先需要将binlog读取到内存,然后发送出去,故如果主库主机的内存使用太大,也会影响数据的复制,具体可以通过top,free命令来监控;
  • 网络IO:复制线程最终要通过网络将数据传输出去,故如果主库主机的网络带宽太小或者主机上存在其他需要大量消耗网络带宽的进程,则网络带宽可能成为瓶颈。具体可以通过vmstat,nethogs等查看网络带宽消耗。
从库
  • 从库需要从主库接收binlog并写到relay log中,所以也存在与主库类似的问题。同时从库的SQL线程还需要读取relay log并执行对应的SQL,故除此之外,还可能由于CPU繁忙,导致SQL执行缓慢。
解决方案
  • 如果发现刚好是以上硬件资源导致的性能瓶颈,则可以相应的提高硬件资源的配置或者将对应主机上面的进程根据是否存在资源竞争,分开到不同机器部署。
  • 如果硬件资源已经很好,无法通过提高硬件资源配置来解决这个问题,则可以优化应用来解决。

数据库是否以写操作为主:binlog日志量太大

  • 正常情况下,如果应用的写操作不是异常频繁,MySQL的binlog复制不会存在严重的延迟问题,因为binlog性能还是比较高的。但是如果是因为应用存在大量数据库写操作,导致binlog日志很大,需要从主库复制大量数据给从库,则需要考虑对应用进行拆分部署。
解决方案:分库分表
  • 针对数据库方面的拆分主要是结合分库分表来实现,即对于分库,则根据业务内聚性,拆分为几个相对独立的子服务,各个子服务使用独立的数据库分开部署,则可以将写操作分散到各个数据库,各个数据库的复制流量相对较小,从而通过分而治之的方法来降低整体的延迟。

你可能感兴趣的:(MySQL)