面试官:讲解一下mysql主从复制机制

4 阅读4分钟

MySQL的主从复制是一种数据复制机制,允许数据从一个主数据库服务器(Master)实时同步到一个或多个从数据库服务器(Slave)。通过主从复制,用户可以实现读写分离、数据备份、高可用性等目标。以下是主从复制的核心要点:


1. 主从复制的核心原理

  1. 二进制日志(Binary Log)​

    • 主库将所有数据变更操作(如INSERT、UPDATE、DELETE)写入二进制日志(binary log)。
    • 二进制日志保存了数据库的“操作历史”,是主从复制的数据源。
  2. 复制线程

    • 主库:仅负责记录操作到二进制日志。

    • 从库

      • I/O线程:连接主库,读取二进制日志到本地的中继日志(Relay Log)。
      • SQL线程:读取中继日志,执行其中记录的操作以同步数据。
  3. 异步复制(默认模式)​

    • 主库在提交事务后无需等待从库确认,直接返回客户端。
    • 优点:高性能;缺点:可能数据不一致(从库可能落后主库)。
  4. 半同步复制(Semi-Synchronous Replication)​

    • 主库需要至少一个从库确认接收日志之后才认为事务成功提交。
    • 平衡性能与数据一致性,降低数据丢失风险。
  5. 全同步复制(Group Replication)​

    • 主库需所有从库确认接收日志后才返回,确保强一致性。
    • 性能影响较大,适用于对一致性要求极高的场景。

2. 主从复制的配置步骤

假设主库IP为 192.168.1.100,从库IP为 192.168.1.101

步骤1:主库配置

  1. 修改配置文件 my.cnf

    [mysqld]
    server-id       = 1          # 唯一ID(主从不能重复)
    log_bin         = /var/log/mysql/mysql-bin.log  # 开启二进制日志
    binlog_format   = ROW        # 推荐使用ROW格式(精确记录每行变更)
    
  2. 重启MySQL服务

    systemctl restart mysqld
    
  3. 创建复制用户

    CREATE USER 'repl'@'192.168.1.101' IDENTIFIED BY 'password';
    GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.101';
    FLUSH PRIVILEGES;
    
  4. 获取主库日志状态

    SHOW MASTER STATUS;
    -- 记录结果中的 File(如mysql-bin.000001)和 Position(如120)
    

步骤2:从库配置

  1. 修改配置文件 my.cnf

    [mysqld]
    server-id       = 2       # 唯一ID(与主库不同)
    relay_log       = /var/log/mysql/relay-bin.log
    read_only       = ON      # 从库设为只读(防止误写入)
    
  2. 重启MySQL服务

    systemctl restart mysqld
    
  3. 设置主库信息并启动复制

    CHANGE MASTER TO
      MASTER_HOST = '192.168.1.100',
      MASTER_USER = 'repl',
      MASTER_PASSWORD = 'password',
      MASTER_LOG_FILE = 'mysql-bin.000001',   -- 主库的File名
      MASTER_LOG_POS = 120;                   -- 主库的Position值
    
    START SLAVE;  -- 启动复制
    
  4. 检查复制状态

    SHOW SLAVE STATUS\G
    -- 关键字段: 
    -- Slave_IO_Running: Yes(I/O线程正常)
    -- Slave_SQL_Running: Yes(SQL线程正常)
    -- Seconds_Behind_Master: 0(无延迟)
    

3. 主从复制的常见问题与解决

  1. 数据不一致

    • 原因:从库写入冲突、网络中断、SQL线程错误等。

    • 解决

      • 使用 mysqldump 重新全量同步,或工具如 pt-table-checksum 检查并修复差异。
  2. 复制延迟(Seconds_Behind_Master > 0)​

    • 原因:从库负载过高、主库写入量过大、网络带宽不足。

    • 解决

      • 优化从库硬件资源(如SSD)。
      • 使用并行复制(设置 slave_parallel_workers)。
      • 避免单线程大事务。
  3. 主库故障切换(Failover)​

    • 手动切换

      1. 提升从库为主库(取消 read_only)。
      2. 修改应用连接配置到新主库。
    • 自动切换:通过中间件(如MHA、Orchestrator)或集群方案(如InnoDB Cluster)。


4. 高级复制模式

  1. 基于GTID的复制(Global Transaction ID)​

    • 通过全局唯一事务ID替代传统二进制日志位置,简化主从切换。

      -- 主库和从库均配置:
      gtid_mode = ON
      enforce_gtid_consistency = ON
      
  2. 链式复制(级联复制)​

    • 主 -> 从A -> 从B:减轻主库压力,适合多层架构。
  3. 多源复制(Multi-Source Replication)​

    • 单个从库可同时从多个主库同步数据。

5. 使用场景

  • 读写分离:从库处理读请求,主库专注写操作。
  • 数据备份:从库作为实时备份。
  • 高可用性:主库故障时快速切换至从库。
  • 异地容灾:跨地域部署从库。

总结

MySQL主从复制通过二进制日志实现数据同步,是构建高可用、高性能数据库架构的基石。掌握其核心原理和配置步骤后,可灵活应对不同业务场景的需求。对于关键系统,建议进一步探索半同步复制、GTID、以及自动化运维工具(如ProxySQL、Orchestrator)以提升可靠性和可维护性。