Redis主从复制原理

Redis 主从复制原理详解

Redis 的主从复制(Master-Replica Replication)是指将一台主节点(Master)的数据复制到一台或多台从节点(Replica)的过程。其主要目的是:数据冗余备份提升读性能(读写分离)以及为高可用(如哨兵、集群)打下基础。


🔍 核心机制:PSYNC 命令

主从复制主要依赖 PSYNC 命令完成数据同步。同步过程分为两种模式:

  • 全量复制:将主节点全部数据完整地复制给从节点。
  • 增量复制(部分重同步):仅同步网络断连期间丢失的部分数据。

两种模式相互配合,兼顾效率与可靠性。


🔄 数据同步的三个阶段

1. 命令传播(稳定运行阶段)

当从节点完成首次全量同步后,主节点会实时地将每一条写命令发送给所有从节点,从节点执行相同命令,从而保证主从数据持续一致。

2. 全量复制(首次连接或数据差异过大时)

触发场景:

  • 从节点第一次连接主节点
  • 网络断开时间过长,增量复制无法找回丢失的数据

主要流程:

  1. 协商同步
    从节点发送 PSYNC ? -1? 表示未知主节点 runid,-1 表示未知偏移量)。
    主节点回复 FULLRESYNC <runid> <offset>,表示开始全量同步,并将自己的 runid 和偏移量告知从节点。

  2. 生成并传输 RDB 文件
    主节点执行 BGSAVE 命令,fork 子进程生成 RDB 快照。期间新的写命令存入 复制缓冲区(Replication Buffer)。
    RDB 文件与缓冲区中的命令一并发送给从节点。

  3. 从节点清空并加载 RDB
    从节点先清空自身所有数据,然后加载 RDB 文件,恢复至主节点在生成快照时的数据状态。

  4. 追赶增量数据
    从节点加载完 RDB 后,主节点将复制缓冲区中缓存的写命令再发给从节点,从节点执行后,数据与主节点基本一致。

优化:无盘复制
如果磁盘较慢而网络带宽充裕,可开启 repl-diskless-sync yes,使主节点直接将 RDB 数据通过 Socket 发送给从节点,避免磁盘 I/O 瓶颈。

3. 增量复制(重连后使用)

当网络短暂断开后重连,且满足条件时触发,避免全量复制的开销。

三个关键组件

  • 复制积压缓冲区(Replication Backlog):主节点维护一个固定大小的环形缓冲区(默认 1MB),用于记录最近发送的写命令。
  • 复制偏移量(Replication Offset):主节点每发送 N 字节数据,其偏移量 master_repl_offset 增加 N;从节点每执行 N 字节数据,其偏移量 slave_repl_offset 增加 N。
  • 主节点运行 ID(Replication ID):每个 Redis 实例启动时生成的唯一 40 字节 ID。

增量复制流程

  1. 从节点重连后发送 PSYNC <runid> <offset>
  2. 主节点检查:
    • 如果 runid 与自己不符 → 执行全量复制
    • 如果 runid 匹配,检查 offset 之后的数据是否仍在 复制积压缓冲区
      • 在缓冲区 → 返回 CONTINUE,并发送缺失的命令(增量复制)
      • 不在缓冲区 → 返回 FULLRESYNC,执行全量复制

💡 运行机制与数据一致性

异步复制(默认)

主节点处理完写命令后立即返回客户端成功,之后再异步同步给从节点。
优点:高性能
⚠️ 缺点:网络延迟或从节点压力大时,主从数据存在短暂不一致。

等待确认(WAIT 命令)

若业务要求更高的一致性,可使用 WAIT <numreplicas> <timeout>
该命令会阻塞当前客户端,直到至少 numreplicas 个从节点确认收到该写命令(注意是收到,并非执行完成)。

注意:WAIT 提供的是传播确认,并非严格的事务级强一致性。

心跳检测

  • 从节点 → 主节点:默认每秒发送 REPLCONF ACK <offset>,报告自己的复制偏移量,同时用于检测主节点存活。
  • 主节点 → 从节点:默认每隔 10 秒发送 PING 命令,检测从节点是否存活。

🛠️ 常见调优参数

参数 说明 建议
repl-backlog-size 复制积压缓冲区大小(默认 1MB) 根据写入量和网络状况调大,提高增量复制成功率
repl-timeout 复制超时时间(默认 60 秒) 网络较差时可适当增大,避免误判断连
client-output-buffer-limit 复制缓冲区限制(针对 replica 类型) 从节点较多或数据量大时调大,防止被强制断开
repl-diskless-sync 是否开启无盘同步(默认 no) 磁盘慢、网络快时开启

📌 总结

  • Redis 主从复制基于 PSYNC 命令,结合 全量复制增量复制 实现高效数据同步。
  • 稳定运行时采用 异步命令传播,保证高性能;网络重连时通过 复制积压缓冲区 + 偏移量 优先尝试增量复制。
  • 通过 WAIT 命令和心跳机制,可在一定程度上兼顾一致性与可用性。
  • 合理配置缓冲区大小、超时时间等参数,可显著提升复制链路的稳定性。
posted @ 2026-05-11 20:41  哪能咋办嘛  阅读(21)  评论(0)    收藏  举报