MySQL 主从同步

基本概念

MySQL 主从同步(Replication)是指将一个MySQL数据库服务器(主服务器)的数据复制到一个或多个MySQL数据库服务器(从服务器)的过程。主从同步是MySQL提供的一种高可用性解决方案,也是实现读写分离的基础。

工作原理

MySQL主从同步基于二进制日志(binlog)实现,主要工作流程如下:

  1. 主服务器记录变更:主服务器将所有数据变更(INSERT、UPDATE、DELETE等)记录到二进制日志中

  2. 从服务器获取日志:从服务器的I/O线程连接到主服务器,请求获取二进制日志

  3. 主服务器发送日志:主服务器的Binlog Dump线程将二进制日志内容发送给从服务器

  4. 从服务器应用变更:从服务器的SQL线程读取中继日志(relay log)并执行其中的SQL语句

同步模式

MySQL支持多种同步模式:

  1. 异步复制(默认):主服务器执行事务后立即返回,不等待从服务器确认

  2. 半同步复制:主服务器等待至少一个从服务器接收并写入中继日志后才返回

  3. 组复制(MySQL Group Replication):基于Paxos协议的多主同步复制

配置步骤

主服务器配置

  1. 修改my.cnf配置文件:

    ini 复制代码
    [mysqld]
    server-id=1
    log-bin=mysql-bin
    binlog-format=ROW
    binlog-do-db=需要同步的数据库名
  2. 创建复制专用用户:

    sql 复制代码
    CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
    GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
  3. 查看主服务器状态:

    sql 复制代码
    SHOW MASTER STATUS;

从服务器配置

  1. 修改my.cnf配置文件:

    ini 复制代码
    [mysqld]
    server-id=2
    relay-log=mysql-relay-bin
    read-only=1
  2. 配置主从连接:

    sql 复制代码
    CHANGE MASTER TO
    MASTER_HOST='master_ip',
    MASTER_USER='repl',
    MASTER_PASSWORD='password',
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=position_number;
  3. 启动复制:

    sql 复制代码
    START SLAVE;
  4. 检查复制状态:

    sql 复制代码
    SHOW SLAVE STATUS\G

常见问题与解决方案

  1. 数据不一致 :定期使用pt-table-checksum工具检查数据一致性

  2. 复制延迟

    • 优化主服务器查询性能

    • 增加从服务器硬件资源

    • 考虑使用并行复制

  3. 网络中断

    • 配置自动重连参数slave_net_timeout

    • 使用GTID(全局事务标识符)简化故障恢复

应用场景

  1. 读写分离:主库写,从库读,分担主库压力

  2. 数据备份:从服务器可作为实时备份

  3. 高可用性:主库故障时可快速切换到从库

  4. 数据分析:在从库执行报表查询等耗时操作不影响主库性能

性能优化建议

  1. 使用ROW格式的二进制日志

  2. 在从服务器上禁用不必要的存储引擎

  3. 适当调整sync_binloginnodb_flush_log_at_trx_commit参数

  4. 考虑使用多线程复制(MySQL 5.6+)

  5. 定期监控复制延迟和状态

注意事项

  1. 主从服务器的MySQL版本应兼容

  2. 表结构变更可能导致复制中断

  3. 某些SQL函数(如UUID(), RAND())可能导致主从不一致

  4. 大事务可能导致复制延迟增加

相关推荐
jnrjian2 小时前
RAC archivelog 在共享盘下就可以在一个node进行备份
数据库·sql
瑶山2 小时前
SpringBoot + MongoDB 5分钟快速集成:从0到1实操指南
java·数据库·spring boot·后端·mongodb
weiggle2 小时前
Android View绘制流程深度解析
android
linux修理工2 小时前
Claude API 密钥更换方法
java·数据库·mysql
凌盛羽2 小时前
在MDK-ARM编译后用python解析map文件在编译窗口输出Flash和RAM使用及剩余情况
arm开发·python·stm32·单片机·mysql·链表·esp32
chushiyunen2 小时前
langchain的流式事件监听astream_event()、todo运行机制
java·数据库·langchain
羊小猪~~2 小时前
【QT】-- QT操作数据库
数据库·qt·oracle
皙然2 小时前
Redis核心理论:数据删除与淘汰策略详解(从原理到实战)
数据库·redis·缓存
dora2 小时前
Android弱网优化 —— 都要卫星互联网了,谁给我限速体验2G
android·性能优化