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. 大事务可能导致复制延迟增加

相关推荐
这个DBA有点耶38 分钟前
实时数据集成工具选型2026:从CDC到数据同步的完整指南
数据库·数据挖掘·dba
__zRainy__42 分钟前
Node系列 · ORM:Sequelize 简介
数据库·后端·node.js
鸽芷咕1 小时前
达梦VS金仓选型实录:别只比TPC-C,迁移工具链才是项目成败的关键
数据库
古法安卓1 小时前
Android-epoll原理详解
android·java·android studio
King of fraud2 小时前
Linux 下 MySQL 基础操作:创建用户、数据库与权限管理实战
linux·数据库·mysql
努力的小雨2 小时前
sys_basebackup 适合什么场景,先看恢复目标
数据库
这个DBA有点耶2 小时前
Redis大key“根治”指南:拆分策略与数据结构选型
数据库·mysql·架构
程序员与背包客_CoderZ2 小时前
高性能分布式KV存储引擎RocksDB入门与C/C++编码实战
c语言·开发语言·数据库·c++·分布式·分布式数据库·rocksdb
进击的_鹏2 小时前
从零开始的 Redis 学习
服务器·数据库·c++·redis·缓存
隔窗听雨眠3 小时前
当KES遇到多租户:金仓数据库多租户架构的隔离实践与部署指南
数据库·架构