Skip to content

Redis主从复制

一、基础概念

1. replid(复制ID)

主节点的唯一数据集标识,从节点初次同步后会继承主节点replidreplid 相同代表二者属于同一套主数据集,用来判断主从是否同源。

2. offset(复制偏移量)

主节点每执行一条写命令,offset 自增;从节点同步完成数据后,记录自身对应偏移量。

  • 从节点 offset < 主节点 offset:从库数据滞后,需要补发数据
  • 从节点 offset = 主节点 offset:主从数据完全一致

3. repl_backlog(复制积压缓冲区)

主节点维护的环形缓冲区,用于缓存近期执行的写命令,是增量同步的核心依赖。缓冲区大小可配置,容量满后会丢弃头部老旧数据。

二、全量同步

触发场景

从节点首次执行replicaof挂载主库、主从replid不一致、从节点offset超出repl_backlog覆盖范围。

  1. 从节点执行 replicaof ip port,与主节点建立TCP长连接。
  2. 从节点发送 PSYNC replid offset 发起同步请求,首次同步使用默认特殊值。
  3. 主节点校验replid,判定为新从机,返回自身真实replid与当前offset。
  4. 从节点本地保存主节点的replid、offset信息。
  5. 主节点执行 BGSAVE,子进程生成全量 dump.rdb 快照。
  6. RDB生成过程中,主节点新写入的命令全部存入 repl_backlog
  7. 主节点通过TCP将完整RDB文件发送给从节点。
  8. 从节点清空本地原有数据,加载RDB文件完成全量数据恢复。
  9. 主节点读取repl_backlog内缓存的增量命令,批量下发。
  10. 从节点执行增量命令,补齐RDB生成期间新增数据,全量同步完成。

三、增量同步

前置条件

从节点与主节点 replid 一致,且从节点 offset 仍在 repl_backlog 覆盖范围内。多用于从节点重启、短暂离线场景。

  1. 从节点重启后,自动与主节点重建TCP连接。
  2. 从节点携带本地保存的 replid、offset,发送 PSYNC 请求。
  3. 主节点比对replid,确认主从同源;再校验offset位置。
  4. 主节点返回 +CONTINUE,确认走增量同步流程。
  5. 主节点从 repl_backlog 中,截取大于从节点offset的所有写命令。
  6. 主节点逐条下发增量命令。
  7. 从节点执行全部命令,补齐滞后数据,增量同步结束。

四、同步失败降级规则

  1. replid 不一致:强制降级为全量同步
  2. replid 一致,但从节点offset早于repl_backlog起始位置(数据已被丢弃):强制降级为全量同步

五、全量/增量同步优缺点

全量同步

优点:数据可完整落地,新从节点初始化必须使用。 缺点:BGSAVE消耗主节点CPU,RDB文件传输占用网络带宽,大数据量场景耗时久。

增量同步

优点:仅补发缺失命令,无需生成、传输RDB,性能损耗极小。 缺点:依赖repl_backlog缓冲区,缓冲区配置过小,会频繁触发全量同步。

六、PSYNC2.0 优化点

  1. 统一使用 PSYNC 一套命令,同时兼容全量、增量两种同步模式;旧版 SYNC 仅支持全量同步。
  2. 新增 replid + offset 机制,支持断线后快速增量续传,大幅降低全量同步的触发频率。

七、面试高频问题解析

  1. 问:replid、offset、repl_backlog 各自作用是什么?

    答: replid 标识数据集,判断主从是否同源;offset 记录数据同步位置,判断数据是否一致;repl_backlog 是主节点环形缓冲区,用来存放近期写命令,支撑增量同步。

  2. 问:分别说明全量同步和增量同步的触发条件?

    答: 首次挂载主库、replid 不同、offset 超出缓冲区范围,触发全量同步;replid 一致且 offset 在缓冲区范围内,从节点短暂离线/重启,触发增量同步。

  3. 问:全量同步完整流程是怎样的?

    答: 从节点发起PSYNC请求,主节点生成RDB快照并同步,快照期间新命令存入积压缓冲区;从节点加载RDB后,再执行缓冲区增量命令,完成整体同步。

  4. 问:PSYNC2.0 相比旧版本做了哪些优化?

    答: 统一命令格式,兼顾全量与增量同步;依靠replid和offset实现断线增量续传,减少全量同步次数,提升同步效率。

  5. 问:什么情况下增量同步会降级为全量同步?

    答: 一是主从replid不一致;二是replid一致,但从节点偏移量已经超出复制积压缓冲区的范围,数据已被覆盖,只能走全量同步。

Powered by VitePress 1.6.4 | 持续更新中