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 不同(例如主库被整体替换过)会直接走全量;偏移量落在缓冲区之外也会走全量。排查时应先看这两个值,而不是先去怀疑网络。