MST

星途 面试题库

面试题:MySQL高可用架构之主从复制

在MySQL高可用架构中,主从复制是常用的技术,请阐述主从复制的原理,以及如何解决主从复制延迟的问题?
38.2万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试

主从复制原理

  1. 主库(Master)操作:主库在执行写操作(如INSERT、UPDATE、DELETE等)时,会将这些修改记录到二进制日志(Binary Log,也叫 binlog)中。每个写操作对应一条二进制日志事件。
  2. 从库(Slave)I/O线程:从库启动一个I/O线程,该线程与主库建立连接,向主库发送请求,获取主库二进制日志的位置信息(文件名和偏移量)。然后,I/O线程开始从主库读取二进制日志,并将其写入到从库自己的中继日志(Relay Log)中。
  3. 从库SQL线程:从库还有一个SQL线程,它负责读取中继日志中的事件,并按照事件的顺序在从库上重新执行这些操作,从而使从库的数据与主库保持一致。

解决主从复制延迟问题的方法

  1. 硬件优化
    • 提升硬件性能:提高主从库服务器的硬件配置,如增加CPU核心数、提高内存容量、使用更快的存储设备(如SSD替代HDD),以提升数据库处理能力和I/O性能,减少复制延迟。
  2. 网络优化
    • 优化网络配置:确保主从库之间网络稳定且带宽充足,减少网络延迟和丢包。可以通过优化网络拓扑、使用高速网络设备等方式实现。
  3. 数据库参数优化
    • 调整复制相关参数
      • 增大主库binlog缓存:在主库配置文件中增加binlog_cache_size参数值,可减少主库写binlog时的I/O等待,提高主库写入效率,进而减少从库延迟。
      • 调整从库中继日志参数:增大relay_log_buffer_size,减少从库I/O线程写中继日志时的I/O次数,提高写入效率;设置合适的max_relay_log_size,避免中继日志文件过大影响读取和写入性能。
      • 设置合适的复制线程数:在MySQL 5.6及之后版本,可以开启多线程复制(slave_parallel_workers参数设置复制线程数),让从库多个线程并行应用中继日志中的事件,加快复制速度。
  4. 架构优化
    • 减少主库写压力
      • 读写分离:将读操作分担到从库上,减少主库压力,使其能更专注于处理写操作和二进制日志记录,进而减少主从延迟。可通过中间件(如MyCat、Atlas等)实现读写分离。
      • 优化业务逻辑:避免在主库执行复杂的、耗时的写操作,尽量简化主库上的事务逻辑,缩短主库写操作时间,从而减少从库延迟。
    • 使用半同步复制:在主从复制基础上,配置半同步复制(semi - synchronous replication)。主库在提交事务前,等待至少一个从库接收并写入中继日志,确保数据已经传输到从库,这样能在一定程度上保证数据一致性,同时减少因网络等原因导致的复制延迟。
    • 采用级联复制:对于有多个从库的场景,可以采用级联复制,即一个从库作为另一个从库的主库,这样可以分散主库的复制压力,减少主从复制延迟。