Redis 主从同步原理详解
基于 Redis 6/7 官方机制整理,适用于学习、面试与生产调优。
1. 概述
Redis 主从复制(Replication)是一种数据冗余机制,通过将主节点(Master)的数据复制到一个或多个从节点(Slave / Replica),实现:
- 高可用(配合哨兵或集群)
- 读写分离(分担读压力)
- 故障恢复(快速切换)
当从节点首次连接或断开重连时,会向主节点发送 PSYNC 同步请求。主节点根据从节点的 replid 和 offset 判断执行 全量同步(Full Sync) 还是 增量同步(Partial Sync)。
2. 同步判断依据:replid 与 offset
✅ replid(Replication ID)
- 每个 Redis 节点启动时生成一个唯一的 40 位十六进制字符串。
- 主节点的
replid在其生命周期内保持不变。 - 若从节点升级为主节点(如故障转移),会生成新的
replid。
判断是否为首次同步的标准:
从节点 replid ≠ 主节点 replid→ 首次连接 → 全量同步replid 相同且offset 在 repl_backlog 中→ 增量同步
✅ offset(偏移量)
- 表示复制流中已处理命令的位置。
- 主节点每执行一条写命令,
offset递增。 - 从节点通过
offset告知主节点:"我已同步到此处"。
3. 同步方式
3.1 全量同步(Full Resynchronization)
🔹 触发条件
- 从节点首次连接
replid不一致(非原主节点的从节点)repl_backlog中不包含所需offset(如宕机时间过长)
🔹 执行流程
- 从节点发送
PSYNC ? -1 - 主节点执行
BGSAVE,生成 RDB 快照 - 主节点将 RDB 文件发送给从节点
- 从节点清空自身数据并加载 RDB
- 主节点将 RDB 生成期间的写命令缓存(通过
repl_backlog) - RDB 传输完成后,主节点将缓存命令发送给从节点
- 进入持续的增量同步阶段
⚠️ 注意:RDB 是内存快照,需配合后续命令传播才能保证最终一致性。
3.2 增量同步(Partial Resynchronization)
🔹 触发条件
- 从节点断线重连
replid一致- 从节点的
offset仍在主节点的repl_backlog范围内
🔹 执行流程
- 从节点发送
PSYNC <replid> <offset> - 主节点检查
repl_backlog是否包含该offset- 是 → 返回
+CONTINUE,开始增量同步 - 否 → 回退为全量同步
- 是 → 返回
- 主节点将
offset之后的所有写命令发送给从节点 - 从节点应用命令,保持实时同步
4. 核心组件:repl_backlog
✅ 功能
- 环形缓冲区(Ring Buffer),存储主节点最近执行的写命令及对应
offset - 支持从节点断线后快速恢复,避免频繁全量同步
✅ 特性
| 属性 | 说明 |
|---|---|
| 结构 | 环形数组,写满后覆盖旧数据 |
| 默认大小 | 1 MB |
| 配置参数 | repl-backlog-size |
| 生命周期 | 只要存在至少一个从节点,repl_backlog 就不会释放 |
✅ 数据保留策略
- 若从节点的
offset仍在缓冲区内 → 增量同步 - 若
offset已被覆盖 → 只能全量同步
🎯 建议 :适当增大
repl-backlog-size(如 100MB),以应对网络抖动或短暂宕机。
5. 优化建议
| 优化项 | 说明 |
|---|---|
repl-diskless-sync yes |
启用无磁盘复制,RDB 直接通过 socket 发送,避免磁盘 I/O |
| 控制单节点内存 | 单实例 ≤ 10GB,减少 RDB 体积和生成时间 |
增大 repl-backlog-size |
提高容错能力,降低全量同步概率 |
| 限制 Slave 数量 | 单 Master 建议 ≤ 10 个 Slave;更多可采用 链式复制(Master → Slave → Slave) |
| 显式声明复制地址 | 使用 replica-announce-ip 和 replica-announce-port 避免多网卡环境连接异常 |
6. 流程图解

💡
repl_backlog由主节点维护,是增量同步的关键。
7. 关键术语对照表
| 术语 | 含义 |
|---|---|
replid |
复制 ID,标识主节点身份 |
offset |
命令偏移量,表示复制进度 |
repl_backlog |
环形缓冲区,存储近期写命令 |
PSYNC |
主从同步协议命令(Redis 2.8+) |
BGSAVE |
异步生成 RDB 快照 |
RDB |
Redis Database,内存快照文件 |
8. 总结
- ✅ 全量同步用于初始化或数据严重落后场景
- ✅ 增量同步依赖
repl_backlog,高效且低开销 - ✅
replid是判断主从关系是否"连续"的核心依据 - ✅ 合理配置
repl-backlog-size和repl-diskless-sync可显著提升复制稳定性
📌 最佳实践 :监控从节点延迟(
info replication中的lag),确保repl_backlog足够大以覆盖最大预期中断时间。
作者:不会写程序的未来程序员
首发于 CSDN
版权声明:本文为原创文章,转载请注明出处。