首页/数据/Redis 进阶速查/PSYNC:部分重同步机制
主从与哨兵51 条

PSYNC:部分重同步机制

PSYNC 让从库断线重连后尽量只同步缺失部分:主库保留复制积压缓冲(backlog),从库上报偏移量,落在缓冲范围内的增量可直接补发。

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

PSYNC 是什么

PSYNC 是主从之间协商同步方式的协议命令。从库首次连接或断线重连时会带上自己记录的复制 ID 与偏移量发起请求,主库据此决定两件事:如果这个复制 ID 是自己当前的、且从库落后的部分仍在自己保留的复制积压缓冲(backlog)范围内,就回复 CONTINUE 并只补发缺失的那一小段命令,这叫部分重同步;否则回复 FULLRESYNC,从头做一次全量同步。它把「网络抖动」与「真故障」的代价区分开来。

基本信息

请求格式PSYNC <replid> <offset>,首次连接时用 ? -1
两种回复FULLRESYNC 表示全量,CONTINUE 表示部分重同步
积压缓冲repl-backlog-size 决定能容忍多长的断连,默认 1MB
观测命令INFO stats 的 sync_full 与 sync_partial_ok
重连代价全量同步要 fork 加传输,部分重同步只是补发命令

典型使用场景

  • 网络抖动恢复:链路短暂闪断后从库重连,靠积压缓冲补发即可,避免一次完整快照传输
  • 扩容与迁移:新从库首次接入必然全量,之后的短暂中断都能走部分重同步快速恢复
  • 容量评估:按写入速率与可容忍的断连时长计算 backlog 该配多大
  • 排查反复全量:sync_full 持续增长说明每次重连都退化成全量,需要检查缓冲区与网络
  • 切换演练:故障转移后从库换主,复制 ID 变化可能触发全量,需评估对新主库的冲击

观测同步行为

观测同步行为
redis-cli INFO replication | grep -E 'master_repl_offset|master_link_status'
redis-cli INFO stats | grep -E 'sync_full|sync_partial_ok|sync_partial_err'   # 全量与部分重同步次数
redis-cli CONFIG GET repl-backlog-size        # 积压缓冲大小
redis-cli CONFIG SET repl-backlog-size 64mb   # 按写入速率与断连容忍度上调
redis-cli -h 从库 INFO replication | grep -E 'slave_repl_offset|master_sync_in_progress'

为什么退化为全量

原因表现应对
backlog 太小sync_partial_err 增长按写入速率上调 repl-backlog-size
断连时间过长重连即全量改善网络稳定性,缩短故障恢复时间
主库重启导致 replid 变化从库发起后直接全量用复制与业务解耦的重启顺序,分批滚动
新从库首次接入必然全量安排在低峰,并确认带宽与磁盘余量
积压缓冲的大小怎么估:缓冲区按字节滚动保存最近一段时间内广播的写命令,容量除以写入速率大致就是能容忍的断连时长。写入高峰期把缓冲占满后,从库只要断连超过这个时长就会退化为全量同步,因此高写入实例通常把默认的 1MB 显著上调。
部分重同步的判定依赖复制 ID 与偏移量两个条件同时成立:复制 ID 不同(例如主库被整体替换过)会直接走全量;偏移量落在缓冲区之外也会走全量。排查时应先看这两个值,而不是先去怀疑网络。

易错点

  • 把 replication backlog 当作可以省略的优化项,断连后每次都要全量同步,主库反复 fork 并占用大量带宽
  • 看到从库短暂断连就人工介入重建,实际上部分重同步足以自动恢复,人工操作反而制造了不必要的全量同步
  • 用 failover 或主库重启频繁改变复制 ID,每次变更都强制一次全量,滚动重启必须分批进行
  • 只看 master_link_status 是否为 up,忽略 sync_partial_err 与延迟指标,链路反复抖动直到影响业务才被发现

数据来源与参考

  • Redis 官方文档:复制机制与 PSYNC 说明
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌