Mysql主从复制

MySQL 主从复制是一种将数据从主数据库(Master)复制到一个或多个从数据库(Slave)的机制,常用于负载均衡、数据备份和灾难恢复。通过主从复制,主数据库负责处理写请求,而从数据库可以处理读请求,从而提高数据库系统的性能和可用性。

MySQL 主从复制的基本原理

  1. 主库记录数据更改

    • 在主库上,当有数据写入或更新时,MySQL 会将这些操作记录到 二进制日志(Binary Log) 中。二进制日志记录了所有导致数据变化的 SQL 语句(INSERT、UPDATE、DELETE 等),它是主从复制的基础。
  2. 从库拉取日志

    • 从库启动后,会创建一个 I/O 线程,这个线程向主库发起请求,获取主库的二进制日志文件,并将其存储在本地的 中继日志(Relay Log) 中。
  3. 从库应用日志

    • 从库的 SQL 线程 会读取中继日志中的内容,并依次执行这些 SQL 语句,将主库的操作复制到从库上,从而保持与主库数据的一致性。

MySQL 主从复制的过程详解

  1. 主库上的二进制日志(Binary Log)

    • 主库会将所有更改数据的操作写入到二进制日志文件中,二进制日志按顺序记录每个事务的开始和结束,并包含具体的 SQL 语句。
    • 主从复制以二进制日志为基础,当从库开始同步数据时,它实际上是从主库获取二进制日志文件内容。
  2. 从库的 I/O 线程

    • 从库中的 I/O 线程负责与主库建立连接,请求主库的二进制日志,并将日志中的内容写入从库的 中继日志(Relay Log)。中继日志是从库用于存储来自主库的更新信息的临时日志文件。
  3. 从库的 SQL 线程

    • 从库中的 SQL 线程负责读取中继日志中的内容并执行相应的 SQL 操作,这个过程会将主库的数据更新同步到从库。通过这种方式,从库保持与主库的数据同步。

主从复制模式

  1. 异步复制

    • 默认情况下,MySQL 的主从复制是异步的,主库在执行完 SQL 并记录到二进制日志后,不会等待从库确认日志已被接收或执行。因此,主库的性能不会因为从库延迟而受到影响,但存在数据不一致的风险,即主库崩溃时,从库可能尚未接收到最新的更新。
  2. 半同步复制

    • 半同步复制(Semi-Synchronous Replication)是一种增强的模式,当主库将事务写入二进制日志并传输给至少一个从库后,主库才会继续确认事务提交成功。这减少了数据丢失的风险,但会增加一定的延迟。
  3. 全同步复制

    • 全同步复制要求主库等待所有从库确认事务已完成后,才会提交事务。这个模式很少使用,因为它对性能有极大的影响。

主从复制的优势

  1. 读写分离

    • 主库负责写操作,从库负责读操作,这样可以减轻主库的负载,增强系统的并发处理能力。
  2. 负载均衡

    • 可以将多个从库分配给不同的应用进行查询,实现负载均衡。
  3. 高可用性和容错

    • 当主库发生故障时,可以迅速切换到从库,保证服务的持续性。
  4. 备份与容灾

    • 从库可以作为备份库使用,避免影响主库的性能。同时,在灾难恢复时可以迅速从从库恢复数据。

主从复制的不足

  1. 数据延迟

    • 在异步复制模式下,从库总会比主库有一定的数据延迟,可能会导致短时间内的数据不一致。
  2. 单点故障

    • 如果主库出现故障,除非采取自动化的故障转移机制(如 MHA、PXC),否则需要手动将从库提升为主库。
  3. 写入性能限制

    • 由于主库仍然需要处理所有写操作,所以写入性能不会因为有多个从库而提升。

主从复制的配置步骤

  1. 在主库上开启二进制日志: 编辑 MySQL 配置文件(如 /etc/my.cnf),确保 log_bin 已启用:

    [mysqld]
    log-bin=mysql-bin
    server-id=1  # 每个节点必须有唯一的 server-id
    
  2. 在从库上配置复制: 配置从库的 server-id,并确保从库不会生成二进制日志(从库的二进制日志可选):

    [mysqld]
    server-id=2  # 从库的 server-id 不同于主库
    
  3. 创建复制用户并授权: 在主库上创建一个用于复制的用户并授予权限:

    CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
    GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
    
  4. 从库开始复制: 在从库上执行 CHANGE MASTER TO 命令,指定主库的连接信息:

    CHANGE MASTER TO
        MASTER_HOST='主库IP',
        MASTER_USER='repl',
        MASTER_PASSWORD='password',
        MASTER_LOG_FILE='mysql-bin.000001',
        MASTER_LOG_POS=0;
    START SLAVE;
    
  5. 验证复制状态: 在从库上执行 SHOW SLAVE STATUS\G,查看复制是否正常。如果 Slave_IO_RunningSlave_SQL_Running 都是 Yes,说明复制正常。

总结

MySQL 主从复制是数据库高可用性架构中的重要组成部分,通过异步或半同步复制机制,从库可以高效同步主库的数据,支持读写分离和负载均衡。

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

主要概念

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

复制流程

  1. 主服务器配置

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

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

主要步骤

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

    • 编辑 MySQL 配置文件(通常是my.cnfmy.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;
      
      记下FilePosition的值。
  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_RunningSlave_SQL_Running都显示为Yes,表示复制正常运行。

复制类型

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

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

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

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

复制延迟

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

复制的故障恢复

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

其他注意事项

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

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