Redis主从复制原理
Redis 主从复制原理详解
Redis 的主从复制(Master-Replica Replication)是指将一台主节点(Master)的数据复制到一台或多台从节点(Replica)的过程。其主要目的是:数据冗余备份、提升读性能(读写分离)以及为高可用(如哨兵、集群)打下基础。
🔍 核心机制:PSYNC 命令
主从复制主要依赖 PSYNC 命令完成数据同步。同步过程分为两种模式:
- 全量复制:将主节点全部数据完整地复制给从节点。
- 增量复制(部分重同步):仅同步网络断连期间丢失的部分数据。
两种模式相互配合,兼顾效率与可靠性。
🔄 数据同步的三个阶段
1. 命令传播(稳定运行阶段)
当从节点完成首次全量同步后,主节点会实时地将每一条写命令发送给所有从节点,从节点执行相同命令,从而保证主从数据持续一致。
2. 全量复制(首次连接或数据差异过大时)
触发场景:
- 从节点第一次连接主节点
- 网络断开时间过长,增量复制无法找回丢失的数据
主要流程:
-
协商同步
从节点发送PSYNC ? -1(?表示未知主节点 runid,-1表示未知偏移量)。
主节点回复FULLRESYNC <runid> <offset>,表示开始全量同步,并将自己的 runid 和偏移量告知从节点。 -
生成并传输 RDB 文件
主节点执行BGSAVE命令,fork 子进程生成 RDB 快照。期间新的写命令存入 复制缓冲区(Replication Buffer)。
RDB 文件与缓冲区中的命令一并发送给从节点。 -
从节点清空并加载 RDB
从节点先清空自身所有数据,然后加载 RDB 文件,恢复至主节点在生成快照时的数据状态。 -
追赶增量数据
从节点加载完 RDB 后,主节点将复制缓冲区中缓存的写命令再发给从节点,从节点执行后,数据与主节点基本一致。
优化:无盘复制
如果磁盘较慢而网络带宽充裕,可开启repl-diskless-sync yes,使主节点直接将 RDB 数据通过 Socket 发送给从节点,避免磁盘 I/O 瓶颈。
3. 增量复制(重连后使用)
当网络短暂断开后重连,且满足条件时触发,避免全量复制的开销。
三个关键组件:
- 复制积压缓冲区(Replication Backlog):主节点维护一个固定大小的环形缓冲区(默认 1MB),用于记录最近发送的写命令。
- 复制偏移量(Replication Offset):主节点每发送 N 字节数据,其偏移量
master_repl_offset增加 N;从节点每执行 N 字节数据,其偏移量slave_repl_offset增加 N。 - 主节点运行 ID(Replication ID):每个 Redis 实例启动时生成的唯一 40 字节 ID。
增量复制流程:
- 从节点重连后发送
PSYNC <runid> <offset> - 主节点检查:
- 如果
runid与自己不符 → 执行全量复制 - 如果
runid匹配,检查offset之后的数据是否仍在 复制积压缓冲区 内- 在缓冲区 → 返回
CONTINUE,并发送缺失的命令(增量复制) - 不在缓冲区 → 返回
FULLRESYNC,执行全量复制
- 在缓冲区 → 返回
- 如果
💡 运行机制与数据一致性
异步复制(默认)
主节点处理完写命令后立即返回客户端成功,之后再异步同步给从节点。
✅ 优点:高性能
⚠️ 缺点:网络延迟或从节点压力大时,主从数据存在短暂不一致。
等待确认(WAIT 命令)
若业务要求更高的一致性,可使用 WAIT <numreplicas> <timeout>。
该命令会阻塞当前客户端,直到至少 numreplicas 个从节点确认收到该写命令(注意是收到,并非执行完成)。
注意:
WAIT提供的是传播确认,并非严格的事务级强一致性。
心跳检测
- 从节点 → 主节点:默认每秒发送
REPLCONF ACK <offset>,报告自己的复制偏移量,同时用于检测主节点存活。 - 主节点 → 从节点:默认每隔 10 秒发送
PING命令,检测从节点是否存活。
🛠️ 常见调优参数
| 参数 | 说明 | 建议 |
|---|---|---|
repl-backlog-size |
复制积压缓冲区大小(默认 1MB) | 根据写入量和网络状况调大,提高增量复制成功率 |
repl-timeout |
复制超时时间(默认 60 秒) | 网络较差时可适当增大,避免误判断连 |
client-output-buffer-limit |
复制缓冲区限制(针对 replica 类型) | 从节点较多或数据量大时调大,防止被强制断开 |
repl-diskless-sync |
是否开启无盘同步(默认 no) | 磁盘慢、网络快时开启 |
📌 总结
- Redis 主从复制基于
PSYNC命令,结合 全量复制 与 增量复制 实现高效数据同步。 - 稳定运行时采用 异步命令传播,保证高性能;网络重连时通过 复制积压缓冲区 + 偏移量 优先尝试增量复制。
- 通过
WAIT命令和心跳机制,可在一定程度上兼顾一致性与可用性。 - 合理配置缓冲区大小、超时时间等参数,可显著提升复制链路的稳定性。
浙公网安备 33010602011771号