面试题答案
一键面试主从复制原理
- 主库(Master)操作:主库在执行写操作(如INSERT、UPDATE、DELETE等)时,会将这些修改记录到二进制日志(Binary Log,也叫 binlog)中。每个写操作对应一条二进制日志事件。
- 从库(Slave)I/O线程:从库启动一个I/O线程,该线程与主库建立连接,向主库发送请求,获取主库二进制日志的位置信息(文件名和偏移量)。然后,I/O线程开始从主库读取二进制日志,并将其写入到从库自己的中继日志(Relay Log)中。
- 从库SQL线程:从库还有一个SQL线程,它负责读取中继日志中的事件,并按照事件的顺序在从库上重新执行这些操作,从而使从库的数据与主库保持一致。
解决主从复制延迟问题的方法
- 硬件优化:
- 提升硬件性能:提高主从库服务器的硬件配置,如增加CPU核心数、提高内存容量、使用更快的存储设备(如SSD替代HDD),以提升数据库处理能力和I/O性能,减少复制延迟。
- 网络优化:
- 优化网络配置:确保主从库之间网络稳定且带宽充足,减少网络延迟和丢包。可以通过优化网络拓扑、使用高速网络设备等方式实现。
- 数据库参数优化:
- 调整复制相关参数:
- 增大主库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
参数设置复制线程数),让从库多个线程并行应用中继日志中的事件,加快复制速度。
- 增大主库binlog缓存:在主库配置文件中增加
- 调整复制相关参数:
- 架构优化:
- 减少主库写压力:
- 读写分离:将读操作分担到从库上,减少主库压力,使其能更专注于处理写操作和二进制日志记录,进而减少主从延迟。可通过中间件(如MyCat、Atlas等)实现读写分离。
- 优化业务逻辑:避免在主库执行复杂的、耗时的写操作,尽量简化主库上的事务逻辑,缩短主库写操作时间,从而减少从库延迟。
- 使用半同步复制:在主从复制基础上,配置半同步复制(semi - synchronous replication)。主库在提交事务前,等待至少一个从库接收并写入中继日志,确保数据已经传输到从库,这样能在一定程度上保证数据一致性,同时减少因网络等原因导致的复制延迟。
- 采用级联复制:对于有多个从库的场景,可以采用级联复制,即一个从库作为另一个从库的主库,这样可以分散主库的复制压力,减少主从复制延迟。
- 减少主库写压力: