Skip to content

主从数据同步

约 1120 字大约 4 分钟

Redis阿里

2025-4-7

⭐ 题目日期:

阿里 - 2024/8/21

📝 题解:

主从数据同步是数据库系统中实现高可用、负载均衡和数据备份的核心技术,其核心目标是让从库(Slave)实时或准实时地与主库(Master)保持数据一致性。以下是主从同步的详细机制、流程和关键优化点:


1. 主从同步的核心流程

(1) 主库(Master)写入与日志记录

  • 二进制日志(Binlog)
    主库将所有数据变更(INSERT/UPDATE/DELETE)以事件形式记录到二进制日志。
    • Binlog 格式
      • STATEMENT:记录 SQL 语句(逻辑日志,可能存在主从不一致风险)。
      • ROW:记录行级数据变更(物理日志,推荐使用,一致性高)。
      • MIXED:混合模式,根据场景自动选择。

(2) 从库(Slave)拉取日志

  • IO 线程
    从库通过 IO 线程连接到主库,请求并接收 Binlog 事件,将其写入本地中继日志(Relay Log)
    • 同步模式
      • 异步复制(默认):主库不等待从库确认,性能高但可能丢数据。
      • 半同步复制:主库等待至少一个从库接收 Binlog 后返回成功(平衡性能与一致性)。
      • 全同步复制:主库等待所有从库确认(强一致,性能最低)。

(3) 从库重放日志

  • SQL 线程
    从库的 SQL 线程读取 Relay Log 中的事件,按顺序重放(Replay)这些操作,更新从库数据。

2. 主从同步的关键机制

(1) 全局事务标识(GTID)

  • GTID 格式server_uuid:transaction_id,全局唯一标识事务。
  • 优势
    • 简化主从切换:无需依赖 Binlog 文件名和位置。
    • 自动跳过已执行事务,避免重复执行。

(2) 并行复制

  • 原理:从库 SQL 线程多线程并行执行 Relay Log 中的事务,减少同步延迟。
    • 按库并行:不同数据库的事务并行执行(早期方案)。
    • 按事务组并行:基于事务依赖关系分组并行(如 MySQL 8.0 的 WRITESET 机制)。

(3) 延迟监控与优化

  • 同步延迟指标Seconds_Behind_Master(从库落后主库的时间)。
  • 延迟原因
    • 网络带宽不足或延迟高。
    • 从库硬件性能差(CPU/磁盘瓶颈)。
    • 大事务或长事务阻塞 SQL 线程。
  • 优化方案
    • 使用更快的网络或压缩 Binlog。
    • 升级从库硬件或启用并行复制。
    • 避免大批量写入或拆分大事务。

3. 主从同步的配置步骤(以 MySQL 为例)

(1) 主库配置

# my.cnf
[mysqld]
server_id = 1
log_bin = /var/lib/mysql/mysql-bin
binlog_format = ROW
gtid_mode = ON
enforce_gtid_consistency = ON

(2) 从库配置

# my.cnf
[mysqld]
server_id = 2
relay_log = /var/lib/mysql/relay-bin
read_only = ON  # 从库设为只读(防止误写)

(3) 建立主从关系

-- 在主库创建复制账号
CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

-- 在从库配置主库信息
CHANGE MASTER TO
  MASTER_HOST = 'master_ip',
  MASTER_USER = 'repl',
  MASTER_PASSWORD = 'password',
  MASTER_AUTO_POSITION = 1;  -- 启用 GTID

-- 启动从库复制
START SLAVE;

4. 主从同步的常见问题与解决

(1) 主从数据不一致

  • 检测工具
    pt-table-checksum(校验数据一致性) + pt-table-sync(修复差异)。
  • 修复方案
    手动修复差异或重建从库。

(2) 主从复制中断

  • 常见原因
    • 主从版本不兼容。
    • 主库误删从库所需的 Binlog。
    • 主从服务器时间不同步。
  • 恢复步骤
    跳过错误事务(SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1)或重建同步。

(3) 主从切换(Failover)

  • 手动切换
    1. 确保主库不可用。
    2. 选择一个从库提升为新主库(STOP SLAVE; RESET SLAVE ALL)。
    3. 其他从库指向新主库。
  • 自动切换
    使用中间件(如 MHA、Orchestrator)或云服务(如 AWS RDS)自动处理。

5. 主从同步的应用场景

  1. 读写分离
    • 主库处理写操作,从库处理读操作(需应用层路由)。
  2. 数据备份
    • 从库作为实时备份,可定期备份不影响主库性能。
  3. 高可用架构
    • 结合 VIP 或代理(如 ProxySQL)实现故障自动切换。
  4. 横向扩展
    • 通过增加从库分散读负载。

总结

  • 核心流程:主库写 Binlog → 从库拉取并写入 Relay Log → 从库重放日志。
  • 关键优化:GTID、并行复制、半同步复制。
  • 典型问题:数据不一致、复制延迟、主从切换。

主从同步是构建高可用数据库系统的基石,合理配置和监控可显著提升系统稳定性和性能。