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

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

相关推荐
一瓢西湖水1 天前
列式数据库-以clickHouse为例
数据库·clickhouse
Elastic 中国社区官方博客1 天前
使用 Elastic Cloud Serverless 扩展批量索引
大数据·运维·数据库·elasticsearch·搜索引擎·云原生·serverless
liulanba1 天前
AI Agent技术完整指南 第一部分:基础理论
数据库·人工智能·oracle
逆天小北鼻1 天前
Oracle 服务端与客户端的核心区分要点
数据库·oracle
2501_946242931 天前
MPV-EASY Player (MPV播放器) v0.41.0.1
数据库·经验分享·云计算·计算机外设·github·电脑·csdn开发云
哈里谢顿1 天前
redis常见问题分析
redis
MySQL实战1 天前
Redis 7.0 新特性之maxmemory-clients:限制客户端内存总使用量
数据库·redis
VX:Fegn08951 天前
计算机毕业设计|基于springboot + vue校园社团管理系统(源码+数据库+文档)
前端·数据库·vue.js·spring boot·后端·课程设计
北亚数据恢复1 天前
虚拟机数据恢复—ESXi虚拟机下SqlServer数据库数据恢复案例
数据库
susu10830189111 天前
使用navicat创建事件event报错You have an error in your SQL syntax
数据库·sql