当前位置: 首页 > news >正文

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 生成和传输)较小(仅传输部分命令)
对网络影响高(大量数据传输)低(少量数据传输)
适用场景初次同步 / 主节点重启 / 长时间断连短暂断连后的快速恢复

文章转载自:
http://aquatic.kjawz.cn
http://ajaccio.kjawz.cn
http://bolton.kjawz.cn
http://bleed.kjawz.cn
http://centimo.kjawz.cn
http://changefully.kjawz.cn
http://aspartokinase.kjawz.cn
http://carbonari.kjawz.cn
http://biospeleology.kjawz.cn
http://autotoxin.kjawz.cn
http://bree.kjawz.cn
http://blowgun.kjawz.cn
http://boule.kjawz.cn
http://anatomical.kjawz.cn
http://apotheosize.kjawz.cn
http://branchial.kjawz.cn
http://blackleggery.kjawz.cn
http://caloric.kjawz.cn
http://austenitic.kjawz.cn
http://adjuration.kjawz.cn
http://assailment.kjawz.cn
http://balcony.kjawz.cn
http://briticization.kjawz.cn
http://anonymuncule.kjawz.cn
http://bullous.kjawz.cn
http://bobsleigh.kjawz.cn
http://attenuator.kjawz.cn
http://astronomic.kjawz.cn
http://chare.kjawz.cn
http://aglossia.kjawz.cn
http://www.dtcms.com/a/281405.html

相关文章:

  • 【STM32项目】植物养护设计
  • Zabbix钉钉告警
  • 线性代数小述(三)
  • 乐观锁和悲观锁
  • 【好盈电调】使用 ESP32 的 PWM 驱动无刷电调,电调型号:XRotor Pro 80A BLDC V4.1
  • PBI(产品基本信息)系统如何构建
  • 【stm32】新建工程
  • 知识付费小程序资质全解析
  • 【CMake】使用 CMake 将多模块 C 项目构建为库并链接主程序
  • Spring MVC2
  • React 手动实现页面锚点导航
  • AI Agent 框架LangChain概述
  • 【MCU控制 初级手札】1.1 电阻
  • CUDA 环境下 `libcuda.so` 缺失问题解决方案
  • 自注意力机制:让 AI 像人类一样「读懂」上下文
  • 明远智睿SSD2351:开启嵌入式系统开发新时代
  • WebApplicationType.REACTIVE 的webSocket
  • dotnet命令详解
  • linux的数据库与web服务器
  • LSTM入门案例(时间序列预测)
  • 平升智慧水务整体解决方案,大数据驱动的智慧水务,让城市供水更智能
  • 康谋分享 | 破解数据瓶颈:智能汽车合成数据架构与应用实践
  • 改进_开源证券_VCF_多尺度量价背离检测因子!
  • 【从0-1的JavaScript】第1篇:JavaScript的引入方式和基础语法
  • 第五章 管道工程 5.2 燃气管道
  • 数据库第三次作业
  • 脚手架新建Vue2/Vue3项目时,项目文件内容的区别
  • yolo-world环境配置
  • 【PCIe 总线及设备入门学习专栏 5.1.1 -- PCIe PERST# 信号的作用】
  • 关于实习的经验贴