来源:go-interview / Mysql

MySQL主从复制是一种将数据从一个MySQL服务器(主服务器)复制到一个或多个MySQL服务器(从服务器)的机制。这种复制机制可以用于负载均衡、备份、故障恢复等场景。

主要概念

  1. 主服务器(Master):提供数据的原始写入和更新操作。主服务器将其数据变更操作记录到二进制日志(binlog)中。
  2. 从服务器(Slave):从主服务器接收并应用数据变更操作,从而保持与主服务器的数据同步。

复制流程

  1. 主服务器配置:

    • 启用二进制日志(binlog)。
    • 配置复制的相关参数,如服务器ID。
    • 创建一个用于从服务器连接的复制用户。
  2. 从服务器配置:

    • 配置复制用户及主服务器的信息。
    • 启动复制进程,连接到主服务器,并从二进制日志中读取数据变更事件。
    • 将读取到的数据变更事件应用到从服务器的数据库中。

主要步骤

  1. 在主服务器上配置复制:

    • 编辑MySQL配置文件(通常是my.cnf或my.ini),添加以下设置:
      [mysqld]
      server-id=1
      log-bin=mysql-bin
    • 重新启动MySQL服务使配置生效。
    • 创建用于复制的用户:
      CREATE USER 'replica_user'@'%' IDENTIFIED BY 'password';
      GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'%';
      FLUSH PRIVILEGES;
    • 获取当前二进制日志位置:
      SHOW MASTER STATUS;
      记下File和Position的值。
  2. 在从服务器上配置复制:

    • 编辑MySQL配置文件,添加以下设置:
      [mysqld]
      server-id=2
    • 重新启动MySQL服务使配置生效。
    • 配置从服务器连接到主服务器并开始复制:
      CHANGE MASTER TO
        MASTER_HOST='master_host_ip',
        MASTER_USER='replica_user',
        MASTER_PASSWORD='password',
        MASTER_LOG_FILE='mysql-bin.000001', -- 从主服务器SHOW MASTER STATUS中获取
        MASTER_LOG_POS= 4; -- 从主服务器SHOW MASTER STATUS中获取
      START SLAVE;
    • 查看复制状态:
      SHOW SLAVE STATUS\G;
      确认Slave_IO_Running和Slave_SQL_Running都显示为Yes,表示复制正常运行。

复制类型

  1. 基于语句的复制(Statement-Based Replication, SBR):

    • 复制每个SQL语句到从服务器。
    • 适用于只读的操作,但某些语句可能在不同的环境中有不同的效果。
  2. 基于行的复制(Row-Based Replication, RBR):

    • 复制实际的行数据变更到从服务器。
    • 更加准确,但会增加二进制日志的大小。
  3. 混合复制(Mixed-Based Replication, MBR):

    • 结合了基于语句和基于行的复制,自动选择适合的复制模式。

复制延迟

  • 延迟:从服务器可能会有短暂的延迟,这取决于主服务器和从服务器之间的数据传输和应用速度。可以通过SHOW SLAVE STATUS来监控复制延迟。

复制的故障恢复

  • 主服务器故障:如果主服务器发生故障,可以将从服务器提升为新的主服务器,配置新的从服务器连接到新的主服务器。
  • 从服务器故障:可以重新启动复制进程,重新连接到主服务器并从最新的日志位置继续复制。

其他注意事项

  • 数据一致性:确保主服务器和从服务器的数据库结构一致,以避免复制错误。
  • 网络稳定性:复制过程依赖于网络连接的稳定性,网络问题可能导致复制延迟或中断。
  • 安全性:使用强密码和限制复制用户的访问权限,以确保数据安全。

主从复制在MySQL中是一个强大而灵活的功能,适用于提高数据的可用性和扩展性。