首页/数据/Redis 进阶速查/全量同步流程与资源消耗
主从与哨兵51 条

全量同步流程与资源消耗

全量同步:主库 fork 生成 RDB 传输给从库,从库清空并加载,期间主库把增量命令写入复制缓冲区,加载完成后补发。

Redis 进阶速查数据更新于 2026-10-13

全量同步的流程与代价

全量同步是把主库的完整数据整体复制给从库的过程。主库先 fork 一个子进程生成 RDB 快照,同时把 fork 之后新到达的写命令暂存到复制缓冲区;快照传输到从库后,从库清空自身数据并加载,加载完成再接收缓冲区里累积的增量命令,此后转入正常的命令传播。整个过程对从库是「清空重来」,对主库则是一次额外的 fork、内存占用与网络带宽支出。

基本信息

触发时机从库首次接入、复制 ID 不匹配、断连时间超过积压缓冲范围
步骤主库 fork 生成快照、传输、从库清空并加载、补发增量命令
主库开销fork 停顿、COW 内存增量、出方向带宽
从库开销清空数据、加载耗时、加载期间对外服务受限
观测字段INFO stats 的 sync_full 累计全量次数

典型使用场景

  • 新从库接入:扩容或迁移时必然经历一次全量同步,应安排在低峰并预留带宽
  • 故障恢复:从库数据被破坏或长时间离线后,需要重新全量同步才能恢复一致
  • 容量评估:按数据集大小与带宽估算全量同步耗时,避免误以为「挂上就行」
  • 排查反复全量:sync_full 持续增长说明链路或积压缓冲配置有问题,代价被反复付出
  • 切换演练:主库替换后复制 ID 变化,从库可能被迫全量,需要提前评估新主库的承受能力

观测与判断

观测与判断
redis-cli INFO stats | grep -E 'sync_full|sync_partial_ok|sync_partial_err'
redis-cli -h 从库 INFO replication | grep -E 'master_sync_in_progress|slave_repl_offset'
redis-cli INFO replication | grep -E 'slave0|connected_slaves'   # 主库侧看从库状态
redis-cli CONFIG GET repl-diskless-sync        # 无盘复制可省去落盘步骤
redis-cli CONFIG GET repl-diskless-sync-delay  # 等待多个从库一起传,提升带宽利用率
df -h /var/lib/redis                           # 落地方式下需预留快照空间

各阶段的开销归属

阶段主库开销从库开销
生成快照fork 停顿与 COW 内存增量无
传输快照出方向带宽被占满入方向带宽,磁盘写入(落盘方式)
加载数据无清空并加载,期间对外服务受限
补发增量发送缓冲区的命令立即执行,转入正常复制
从库在全量同步期间可能拒绝对外服务:数据被清空后到加载完成之间存在窗口,默认 replica-serve-stale-data 为 yes 时会返回空数据或错误,具体行为与版本和配置有关。把从库用于读流量的架构应确认这个窗口的表现,必要时在切换前把流量摘掉。
全量同步不会自动限速:快照传输会占满主库出方向带宽,同一链路上其他从库的增量同步也会被拖慢,进而推高整体复制延迟。大实例扩容应逐个接入从库,避免多个全量同步同时进行。

易错点

  • 多次全量同步同时进行,主库 fork、内存与带宽被同时挤占,业务与复制质量一起下降
  • 把从库挂上就认为可用,忽略加载期间从库可能返回空数据的窗口,读流量在此期间读到不一致的结果
  • sync_full 持续增长却不排查,每次网络抖动都退化为全量,成本被反复付出却当成正常现象
  • 容量评估只算数据体积而忽略 RDB 传输与从库落地所需的临时空间,磁盘不足导致同步中断并反复重试

数据来源与参考

  • Redis 官方文档:全量同步流程说明
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌