第 8 章 · Redis 主从复制

三个交互演示:① 全量同步流程动画 · ② 环形复制积压缓冲区 · ③ 主从拓扑模拟器

从节点首次接入主节点:完整全量同步演示

点「下一步」单步看:建立连接 → BGSAVE → 传 RDB → 重放复制缓冲区 → 进入命令传播。或点「自动播放」一气呵成。

①连接
②BGSAVE
③传RDB
④补缓冲
⑤命令传播
🖥 master (127.0.0.1:6379) 在线
rolemaster
replid7f0d9c5b…
master_repl_offset0
connected_slaves0

📦 已存数据

📝 复制缓冲区
(BGSAVE 期间积攒的写命令)

等待开始...
🖥 replica (127.0.0.1:6380) 未连接
role
master_link_statusdown
slave_repl_offset0
master_sync_in_progress0

📦 已存数据

关键观察: ① 主节点 fork 子进程 BGSAVE 期间,新写入的命令都被塞进「复制缓冲区」(per-replica)。 ② 从节点收到 RDB 后会先清空已有数据再加载,这一步从节点暂时不可用。 ③ RDB 加载完后还要把缓冲区里积攒的命令一条条重放追上,才算同步完成。 ④ 缓冲区配小了 → buffer 撑爆 → 从被踢 → 重连 → 又一轮全量 → 复制风暴

1MB 环形积压缓冲区:从节点 offset 决定全量还是增量

主节点不停地写命令到环形 buffer(满了从头覆盖)。从节点掉线一段时间后回来,根据它的 offset 判断「能不能补差量」。

backlog_size = 32 bytes (示意)
master_repl_offset = 0
backlog_first_byte_off = 0
有效区间 = [0, 0]

① 主节点写入

② 从节点掉线 → 重连

掉线时 offset:
当前 offset:
状态:在线
尚未发起 PSYNC
核心结论:从节点 PSYNC 时报上自己的 offset, 只要它 ≥ backlog_first_byte_offset 就能走增量(CONTINUE), 否则只能全量(FULLRESYNC)。生产环境务必把 repl-backlog-size 调到 64MB 起步,公式: ≥ 写入速率 × 最大可容忍断网秒数

主从拓扑模拟器:一主多从 vs 级联复制

切换拓扑模式 → 添加从节点 → 点击主节点的「写入」,看命令如何沿着拓扑扩散。可以拖拽节点调整位置。

① 拓扑模式

所有 replica 直接挂在 master 下,主节点压力随 replica 数线性增长。

② 节点

③ 写入主节点

💡 命令以黄色小球表示,沿连线流向各 replica。
💡 拖动任意节点可调整位置。
💡 在「级联复制」下,主只发给第 1 个 replica,由它转发给后续。
master replica 飞行中的命令
拓扑: 一主多从 从节点数: 0 主节点累计写入: 0 已扩散到从: 0
核心对比: 一主多从下,master 要给每个 replica 各发一份,connected_slaves 越多 master 网络压力越大; 级联复制下,master 只发给 replica1,由 replica1 转发给 replica2/3..., master 压力小但延迟叠加,而且中间节点挂了下游全断。生产建议优先用一主多从, 跨地域 / 极多从时再考虑级联。