主题切换
Redis主从复制
一、基础概念
1. replid(复制ID)
主节点的唯一数据集标识,从节点初次同步后会继承主节点replid。replid 相同代表二者属于同一套主数据集,用来判断主从是否同源。
2. offset(复制偏移量)
主节点每执行一条写命令,offset 自增;从节点同步完成数据后,记录自身对应偏移量。
- 从节点 offset < 主节点 offset:从库数据滞后,需要补发数据
- 从节点 offset = 主节点 offset:主从数据完全一致
3. repl_backlog(复制积压缓冲区)
主节点维护的环形缓冲区,用于缓存近期执行的写命令,是增量同步的核心依赖。缓冲区大小可配置,容量满后会丢弃头部老旧数据。
二、全量同步
触发场景
从节点首次执行replicaof挂载主库、主从replid不一致、从节点offset超出repl_backlog覆盖范围。
- 从节点执行
replicaof ip port,与主节点建立TCP长连接。 - 从节点发送
PSYNC replid offset发起同步请求,首次同步使用默认特殊值。 - 主节点校验replid,判定为新从机,返回自身真实replid与当前offset。
- 从节点本地保存主节点的replid、offset信息。
- 主节点执行
BGSAVE,子进程生成全量dump.rdb快照。 - RDB生成过程中,主节点新写入的命令全部存入
repl_backlog。 - 主节点通过TCP将完整RDB文件发送给从节点。
- 从节点清空本地原有数据,加载RDB文件完成全量数据恢复。
- 主节点读取
repl_backlog内缓存的增量命令,批量下发。 - 从节点执行增量命令,补齐RDB生成期间新增数据,全量同步完成。
三、增量同步
前置条件
从节点与主节点 replid 一致,且从节点 offset 仍在 repl_backlog 覆盖范围内。多用于从节点重启、短暂离线场景。
- 从节点重启后,自动与主节点重建TCP连接。
- 从节点携带本地保存的 replid、offset,发送
PSYNC请求。 - 主节点比对replid,确认主从同源;再校验offset位置。
- 主节点返回
+CONTINUE,确认走增量同步流程。 - 主节点从
repl_backlog中,截取大于从节点offset的所有写命令。 - 主节点逐条下发增量命令。
- 从节点执行全部命令,补齐滞后数据,增量同步结束。
四、同步失败降级规则
- replid 不一致:强制降级为全量同步。
- replid 一致,但从节点offset早于
repl_backlog起始位置(数据已被丢弃):强制降级为全量同步。
五、全量/增量同步优缺点
全量同步
优点:数据可完整落地,新从节点初始化必须使用。 缺点:BGSAVE消耗主节点CPU,RDB文件传输占用网络带宽,大数据量场景耗时久。
增量同步
优点:仅补发缺失命令,无需生成、传输RDB,性能损耗极小。 缺点:依赖repl_backlog缓冲区,缓冲区配置过小,会频繁触发全量同步。
六、PSYNC2.0 优化点
- 统一使用
PSYNC一套命令,同时兼容全量、增量两种同步模式;旧版SYNC仅支持全量同步。 - 新增 replid + offset 机制,支持断线后快速增量续传,大幅降低全量同步的触发频率。
七、面试高频问题解析
问:replid、offset、repl_backlog 各自作用是什么?
答: replid 标识数据集,判断主从是否同源;offset 记录数据同步位置,判断数据是否一致;repl_backlog 是主节点环形缓冲区,用来存放近期写命令,支撑增量同步。
问:分别说明全量同步和增量同步的触发条件?
答: 首次挂载主库、replid 不同、offset 超出缓冲区范围,触发全量同步;replid 一致且 offset 在缓冲区范围内,从节点短暂离线/重启,触发增量同步。
问:全量同步完整流程是怎样的?
答: 从节点发起PSYNC请求,主节点生成RDB快照并同步,快照期间新命令存入积压缓冲区;从节点加载RDB后,再执行缓冲区增量命令,完成整体同步。
问:PSYNC2.0 相比旧版本做了哪些优化?
答: 统一命令格式,兼顾全量与增量同步;依靠replid和offset实现断线增量续传,减少全量同步次数,提升同步效率。
问:什么情况下增量同步会降级为全量同步?
答: 一是主从replid不一致;二是replid一致,但从节点偏移量已经超出复制积压缓冲区的范围,数据已被覆盖,只能走全量同步。