Redis主从同步原理(全量复制、增量复制)

Redis主从复制中的全量同步与增量同步详解

在Redis的高可用架构中,主从复制(Master-Slave Replication) 是实现数据冗余、读写分离以及后续哨兵(Sentinel)和集群(Cluster)机制的基础。其中,主节点与从节点之间的数据同步机制 分为两种:全量同步(Full Resynchronization)增量同步(Partial Resynchronization)

本文将带你深入理解这两种同步机制的工作原理、触发时机、底层实现细节,以及它们在实际应用中的优缺点和注意事项。


一、Redis主从复制的基本流程

当一个从节点第一次连接到主节点时,会发送一条 PSYNC 命令来请求同步数据。主节点收到请求后,会根据从节点的状态判断是进行全量同步还是增量同步。

📌 提示:Redis 的 PSYNC 命令是用于主从同步的核心命令,其语法格式为:

复制代码
PSYNC <runid> <offset>

其中 runid 是主节点的运行ID,offset 是当前复制偏移量。

二、全量同步(Full Sync)

1. 触发条件

  • 从节点首次连接主节点。
  • 从节点请求增量同步时,主节点发现其偏移量不在 repl_backlog 缓存范围内。
  • 主节点重启导致 runid 变化,无法识别从节点。

2. 同步过程详解

(1)从节点发送同步请求

从节点发送 PSYNC ? -1 表示请求全量同步。

(2)主节点执行 BGSAVE 生成 RDB 文件

主节点接收到全量同步请求后,会调用 BGSAVE 命令 fork 出一个子进程,异步地将当前内存中的数据保存为 RDB 文件。

在此期间,所有新的写操作会被记录到一个叫做 repl_backlog 的环形缓冲区中,以防止在 RDB 文件传输过程中丢失数据。

(3)主节点发送 RDB 文件给从节点

RDB 文件生成完成后,主节点会将其通过网络发送给从节点。这个过程可能会比较耗时,尤其是数据量较大的情况下。

(4)从节点加载 RDB 文件并进入同步阶段

从节点接收完 RDB 文件后,会清空自己的本地数据,并加载 RDB 文件中的数据。加载完成后,从节点会向主节点发送一个确认消息。

(5)主节点发送 backlog 中的数据

主节点将之前缓存在 repl_backlog 中的写操作命令继续发送给从节点,确保从节点数据完全同步至主节点的最新状态。

(6)进入命令传播阶段

完成全量同步后,主节点会持续将新产生的写命令转发给从节点,从而保持主从数据的一致性。


三、增量同步(Partial Sync)

1. 触发条件

  • 从节点已经进行过一次同步(非首次连接)。
  • 从节点因网络波动等原因断开连接后重新连接主节点。
  • 主节点仍然保有从节点上次同步位置之后的操作日志(即 offset 在 repl_backlog 范围内)。

2. 同步过程详解

(1)从节点发送 PSYNC 请求

从节点发送 PSYNC <runid> <offset>,其中:

  • runid 是主节点上一次同步时返回的运行ID。
  • offset 是从节点最后一次成功接收到的偏移量。
(2)主节点验证请求是否有效

主节点检查:

  • 当前 runid 是否与从节点请求的 runid 相同。
  • 请求的 offset 是否仍在 repl_backlog 缓存范围内。

如果都满足,则可以进行增量同步;否则仍需进行全量同步。

(3)主节点发送 backlog 中的命令

主节点从 repl_backlog 中提取从 offset 开始的所有写命令,发送给从节点。

(4)从节点执行这些命令并更新 offset

从节点依次执行这些命令,更新本地数据,并更新自己的复制偏移量(offset)。

(5)进入命令传播阶段

与全量同步类似,此后主节点将继续把新的写命令实时发送给从节点。


四、关键组件解析

1. repl_backlog 环形缓冲区

  • repl_backlog 是一个固定大小的环形缓冲区,默认大小为 1MB
  • 所有主节点在进行主从同步时的写操作都会先被记录到该缓冲区中。
  • 它的存在是为了支持增量同步,避免每次断线都要进行全量同步。
  • 如果缓冲区太小,在主从断开时间较长或写入频繁的情况下,旧的 offset 数据可能已经被覆盖,从而导致无法进行增量同步。

2. runid(主节点运行ID)

  • 每次主节点启动时都会生成一个新的 runid。
  • 从节点在同步时会记住主节点的 runid,用于后续同步的身份验证。
  • 如果主节点重启,runid 会变化,从节点即使携带之前的 offset 也无法匹配,必须进行全量同步。

3. 复制偏移量(replication offset)

  • 主节点和从节点各自维护一个偏移量,表示已处理的字节数。
  • 主节点每发送一个命令,就会增加偏移量。
  • 从节点每接收并处理一个命令,也会更新自己的偏移量。
  • 通过对比偏移量,可以判断主从之间是否存在延迟或断连。

五、全量同步 vs 增量同步对比

特性 全量同步 增量同步
触发条件 初次连接 / repl_backlog 不足 断线重连且 offset 有效
数据传输方式 发送完整 RDB 文件 + backlog 数据 仅发送 backlog 中的部分数据
性能消耗 较大(涉及 RDB 生成和传输) 较小(仅传输部分命令)
对网络影响 高(大量数据传输) 低(少量数据传输)
适用场景 初次同步 / 主节点重启 / 长时间断连 短暂断连后的快速恢复
相关推荐
广州灵眸科技有限公司7 小时前
xfce桌面触摸校准:基于灵眸科技EASY-EAl-Orin-Nano
数据库·windows·科技
憧憬成为web高手10 小时前
皮卡丘靶场速通--sql 2
数据库·sql·mybatis
段一凡-华北理工大学10 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
二宝哥11 小时前
CentOS 7.9 系统下 Redis 5.0.4 单机安装与源码编译安装指南
redis·centos
oradh12 小时前
Oracle XTTS实现跨版本迁移和升级(Oracle 11g单库升级至19C RAC集群)
数据库·oracle·11g升级19c·xtts跨版本迁移和升级
z1234567898613 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
程序猿DD13 小时前
一个 API Key,统一调用大模型、生图和联网搜索
数据库·网关
java_logo13 小时前
Docker Compose 部署 ClickHouse:快速搭建高性能列式数据库
数据库·clickhouse·docker·列式数据库·轩辕镜像·高性能数据库·clickhouse部署教程
TlSfoward14 小时前
抓包代理链路下的 TLS 指纹变化分析 TLSFOWARD抓包工具
数据库·爬虫·网络协议·搜索引擎·php
数智化管理手记14 小时前
账龄分析手工统计易遗漏?自动账龄分析工具怎么搭建
大数据·网络·数据库·人工智能·数据挖掘