Redis 主从同步原理详解

Redis 主从同步原理详解

基于 Redis 6/7 官方机制整理,适用于学习、面试与生产调优。


1. 概述

Redis 主从复制(Replication)是一种数据冗余机制,通过将主节点(Master)的数据复制到一个或多个从节点(Slave / Replica),实现:

  • 高可用(配合哨兵或集群)
  • 读写分离(分担读压力)
  • 故障恢复(快速切换)

当从节点首次连接或断开重连时,会向主节点发送 PSYNC 同步请求。主节点根据从节点的 replidoffset 判断执行 全量同步(Full Sync) 还是 增量同步(Partial Sync)


2. 同步判断依据:replidoffset

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(如宕机时间过长)
🔹 执行流程
  1. 从节点发送 PSYNC ? -1
  2. 主节点执行 BGSAVE,生成 RDB 快照
  3. 主节点将 RDB 文件发送给从节点
  4. 从节点清空自身数据并加载 RDB
  5. 主节点将 RDB 生成期间的写命令缓存(通过 repl_backlog
  6. RDB 传输完成后,主节点将缓存命令发送给从节点
  7. 进入持续的增量同步阶段

⚠️ 注意:RDB 是内存快照,需配合后续命令传播才能保证最终一致性。


3.2 增量同步(Partial Resynchronization)

🔹 触发条件
  • 从节点断线重连
  • replid 一致
  • 从节点的 offset 仍在主节点的 repl_backlog 范围内
🔹 执行流程
  1. 从节点发送 PSYNC <replid> <offset>
  2. 主节点检查 repl_backlog 是否包含该 offset
    • 是 → 返回 +CONTINUE,开始增量同步
    • 否 → 回退为全量同步
  3. 主节点将 offset 之后的所有写命令发送给从节点
  4. 从节点应用命令,保持实时同步

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-ipreplica-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-sizerepl-diskless-sync 可显著提升复制稳定性

📌 最佳实践 :监控从节点延迟(info replication 中的 lag),确保 repl_backlog 足够大以覆盖最大预期中断时间。


作者:不会写程序的未来程序员

首发于 CSDN

版权声明:本文为原创文章,转载请注明出处。

相关推荐
管理大亨2 小时前
安装部署Elasticsearch + Logstash + Filebeat + Kibana + Redis?
大数据·redis·elasticsearch
李慕婉学姐2 小时前
Springboot猪肉销售网站的设计与实现mk77pcvj(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
小满、2 小时前
Redis:缓存击穿、穿透、雪崩问题
数据库·redis·缓存穿透·缓存击穿·缓存雪崩
en-route2 小时前
深入理解 Redisson 分布式锁
redis·redission
摇滚侠2 小时前
Redis 零基础到进阶,类型概述,命令查询,key 操作命令,大小写和帮助命令,string,list,hash,set,笔记11-19
redis·笔记·哈希算法
嘻哈baby2 小时前
Redis突然变慢,排查发现是BigKey惹的祸
数据库·redis·缓存
旧梦吟2 小时前
脚本 生成图片水印
前端·数据库·算法·golang·html5
祖国的好青年2 小时前
XAMPP出现Error: MySQL shutdown unexpectedly.
数据库·mysql
Kiddyup2 小时前
记一次Redis连接泄露问题排查
redis·排查问题