看完这篇还不懂 MySQL 主从复制,可以回家躺平了

看完这篇还不懂 MySQL 主从复制,可以回家躺平了
最新回答
小昊昊

2023-10-24 05:15:15

MySQL 主从复制详解

MySQL主从复制是MySQL数据库提供的一种高可用性和高性能解决方案,通过实现负载均衡和读写分离,可以有效提升数据库的处理能力和数据安全性。以下是对MySQL主从复制的详细解析。

一、简介

随着业务的增长,单台数据服务器已经无法满足需求,负载过重可能导致宕机,进而造成数据丢失。MySQL自带的主从复制功能可以帮助我们实现负载均衡和读写分离,主服务器(Master)主要负责写操作,从服务器(Slave)主要负责读操作,从而减轻压力,提高效率。

二、形式

MySQL主从复制有多种形式,包括一主一从、一主多从、多主一从、双主复制和级联复制等。

  • 一主一从:一个主服务器和一个从服务器,结构简单,易于管理。

  • 一主多从:一个主服务器和多个从服务器,可以实现更高的并发能力和更强的数据冗余。

  • 多主一从:多个主服务器和一个从服务器,可以将多个MySQL数据库的数据备份到一台存储性能较好的服务器上。

  • 双主复制:两个主服务器互为主从,任何一方所做的变更都会通过复制应用到另外一方的数据库中。

  • 级联复制:部分从服务器的数据同步不连接主节点,而是连接从节点,以缓解主节点的压力,并对数据一致性没有负面影响。

三、原理

MySQL主从复制是基于主服务器在二进制日志(binlog)中跟踪所有对数据库的更改。要进行复制,必须在主服务器上启用二进制日志。每个从服务器从主服务器接收已经记录到日志的数据,并在主服务器上执行相同的更新。从服务器执行备份不会干扰主服务器,主服务器可以继续处理更新。

四、过程

MySQL的主从复制工作过程大致如下:

  1. 从库生成两个线程:一个I/O线程,一个SQL线程。
  2. I/O线程去请求主库的binlog,并将得到的binlog日志写到relay log(中继日志)文件中。
  3. 主库会生成一个log dump线程,用来给从库I/O线程传binlog。
  4. SQL线程会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致。

五、类型

MySQL主从复制有多种类型,包括异步复制、同步复制、半同步复制和延迟复制等。

  • 异步复制:主库执行完事务后立即返回给客户端,不等待从库接收并处理。这种方式可能导致数据丢失。

  • 同步复制:主库执行完事务后,等待所有从库都复制了该事务并成功执行完才返回成功信息给客户端。这种方式性能较差。

  • 半同步复制:在异步复制的基础上,确保主库上的事务在提交之前至少有一个从库已经收到该事务并日志记录下来。这种方式提高了数据的安全性,但也会造成一定程度的延迟。

  • 延迟复制:在异步复制的基础上,人为设定主库和从库的数据同步延迟时间。

六、方式

MySQL主从复制支持两种不同的日志格式,这两种日志格式也对应了各自的复制方式:语句复制、行数据复制和混合类型的复制。

  • 语句复制:基于语句的复制相当于逻辑复制,即二进制日志中记录了操作的语句。这种方式简单,二进制文件小,但依赖于其他因素,如时间戳等。

  • 行数据复制:基于行的复制相当于物理复制,即二进制日志中记录的实际更新数据的每一行。这种方式比基于语句的复制更精确,但复制压力大,日志占用空间大。

  • 混合类型的复制:默认情况下,采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。

七、配置

MySQL主从复制的配置要点包括:

  • server_id:设置服务器的唯一ID,避免循环同步问题。
  • binlog_format:设置二进制日志的格式,可以是STATEMENT、ROW或MIXED。
  • sync_binlog:设置在进行n次事务提交以后,MySQL将执行一次fsync的磁盘同步指令,将缓冲区数据刷新到磁盘。
  • innodb_flush_logs_at_trx_commit:设置每次事务log buffer写入log file并刷新到磁盘的频率。
  • skip_slave_start:阻止从库崩溃后自动启动复制,给一些时间来修复可能的问题。
  • log_slave_update:是否将从库同步的事件也记录到从库自身的binlog中。
  • expire_logs_days:设置日志过期删除时间,避免日志文件占用过多磁盘空间。

八、问题与解决方法

  1. 延迟:当主库的TPS并发较高时,由于主库是多线程写入的,而从库的SQL线程是单线程的,可能导致从库SQL跟不上主库的处理速度。解决方法包括优化网络、提升从库硬件配置、尽量使MySQL操作在内存中完成、使用并行复制等。

  2. 数据丢失:当主库宕机后,数据可能丢失。解决方法是使用半同步复制。

九、注意事项

  • MySQL主从复制是MySQL高可用性、高性能(负载均衡)的基础。
  • 复制过程中应该时刻监控复制状态,复制出错或延时可能给系统造成影响。
  • MySQL主从复制目前也存在一些问题,可以根据需要部署复制增强功能。

十、作用

MySQL主从复制带来了很多好处,包括:

  • 数据更安全:做了数据冗余,不会因为单台服务器的宕机而丢失数据。
  • 性能大大提升:一主多从,不同用户从不同数据库读取,性能提升。
  • 扩展性更优:流量增大时,可以方便地增加从服务器,不影响系统使用。
  • 负载均衡:一主多从相当于分担了主机任务,做了负载均衡。

十一、应用场景

MySQL主从复制集群功能使得MySQL数据库支持大规模高并发读写成为可能,同时有效地保护了物理服务器宕机场景的数据备份。具体应用场景包括:

  • 横向扩展:将工作负载分发到各Slave节点上,提高系统性能。
  • 数据安全:在Slave节点上备份数据,而不影响Master节点的运行。
  • 数据分析:在Slave节点上进行数据分析,不影响Master节点的性能。
  • 远距离数据分布:在远程主机上创建本地数据的副本,而不用持久地与Master节点连接。
  • 拆分访问:把不同的从服务器根据公司的业务进行拆分,以减轻主服务器的压力,并使数据库对外部用户浏览、内部用户业务处理及DBA人员的备份等互不影响。